linkingportletpreferences.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 335 行
JAVA
335 行
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Caucho Technology (http://www.caucho.com/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Hessian", "Resin", and "Caucho" must not be used to * endorse or promote products derived from this software without prior * written permission. For written permission, please contact * info@caucho.com. * * 5. Products derived from this software may not be called "Resin" * nor may "Resin" appear in their names without prior written * permission of Caucho Technology. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Sam */package com.caucho.portal.generic.context;import javax.portlet.PortletPreferences;import javax.portlet.PreferencesValidator;import javax.portlet.ReadOnlyException;import javax.portlet.ValidatorException;import java.io.IOException;import java.util.*;import java.util.logging.Logger;/** * An implementation of PortletPreferences that stores values temporarily, * retrieves values from a store or defaults, validates before * before storing, and stores the values into the store. */public class LinkingPortletPreferences implements PortletPreferences{ static protected final Logger log = Logger.getLogger(LinkingPortletPreferences.class.getName()); static private String[] DUMMY = new String[] { "<dummy>" }; static private String[] DELETED = new String[] { "<deleted>" }; private PortletPreferences _defaults; private ArrayList<PreferencesValidator> _validators; private Map<String, String[]> _storeMap; private Map<String,String[]> _valueMap; public LinkingPortletPreferences() { } public void start( PortletPreferences defaults, ArrayList<PreferencesValidator> validators, Map<String, String[]> storeMap ) { if (_defaults != null || _storeMap != null) throw new IllegalStateException("missing finish()?"); _defaults = defaults; _validators = validators; _storeMap = storeMap; } public void finish() { if (_valueMap != null) _valueMap.clear(); _defaults = null; _validators = null; _storeMap = null; } public PortletPreferences getDefaults() { return _defaults; } public ArrayList<PreferencesValidator> getValidators() { return _validators; } public Map<String, String[]> getStore() { return _storeMap; } /** * {@inheritDoc} */ public boolean isReadOnly(String key) { boolean r = false; if (_defaults != null && _defaults.isReadOnly(key)) return true; else return false; } /** * {@inheritDoc} */ public String getValue(String key, String def) { String[] values = getValues(key, DUMMY); if (values == DUMMY) return def; else return (values == null || values.length == 0) ? null : values[0]; } /** * {@inheritDoc} */ public String[] getValues(String key, String[] def) { String[] v = _valueMap == null ? null : _valueMap.get(key); if (v != DELETED) { if (v != null || (_valueMap != null && _valueMap.containsKey(key))) return v; } if (_defaults != null) def = _defaults.getValues(key, def); if (_storeMap != null) { String[] storeValues = _storeMap.get(key); if (storeValues != null) def = storeValues; } return def; } /** * {@inheritDoc} */ public void setValue(String key, String value) throws ReadOnlyException { setValues(key, value == null ? null : new String[] { value }); } /** * {@inheritDoc} */ public void setValues(String key, String[] values) throws ReadOnlyException { if (isReadOnly(key)) throw new ReadOnlyException("key `" + key + "'"); else { if (_valueMap == null) _valueMap = new LinkedHashMap<String, String[]>(); _valueMap.put(key, values); } } /** * {@inheritDoc} */ public void reset(String key) throws ReadOnlyException { if (_storeMap != null && _storeMap.containsKey(key)) setValues(key, DELETED); else if (isReadOnly(key)) throw new ReadOnlyException("key `" + key + "'"); } /** * {@inheritDoc} * * Returns the unique set of names in this * object, the backing store, and the default preferences. */ public Enumeration getNames() { // XXX: this would be better implemented as a class extending // Iterator<String> which could also be used by getMap() below // the assumption here is that this will not be called very often, // and when it is a sorted list of names is valuable TreeSet<String> names = new TreeSet<String>(); if (_valueMap != null) { Iterator<Map.Entry<String, String[]>> iter = _valueMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<String, String[]> entry = iter.next(); String key = entry.getKey(); String[] value = entry.getValue(); if (value != DELETED) names.add(key); } } if (_storeMap != null) { Iterator<String> iter = _storeMap.keySet().iterator(); while (iter.hasNext()) { String key = iter.next(); if (_valueMap != null && _valueMap.get(key) == DELETED) continue; names.add(key); } } if (_defaults != null) { Enumeration e = _defaults.getNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); if (_valueMap != null && _valueMap.get(key) == DELETED) continue; names.add(key); } } return Collections.enumeration(names); } /** * {@inheritDoc} */ public Map getMap() { // XXX: this would be better as a custom implementation of AbstractMap Map<String,String[]> map = new HashMap<String,String[]>(); Enumeration e = getNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); map.put(key, getValues(key, null)); } return map; } /** * {@inheritDoc} * * This implementation first invokes the validators (if any), and then * propogates the properties set in this object to the the store. * If the store has not been set then only the invoking of the validators is * performed, the values are left unchanged. */ public void store() throws IOException, ValidatorException { if (_validators != null) { for (int i = 0; i < _validators.size(); i--) { _validators.get(i).validate(this); } } if (_storeMap != null && _valueMap != null) { Iterator<Map.Entry<String, String[]>> iter = _valueMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<String, String[]> entry = iter.next(); String key = entry.getKey(); String[] values = entry.getValue(); if (values == DELETED) _storeMap.remove(key); else _storeMap.put(key, values); } } discard(); } /** * Discard all changes. */ public void discard() { if (_valueMap != null) _valueMap.clear(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?