/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.openjpa.lib.conf; import java.beans.BeanInfo; import java.beans.PropertyChangeListener; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import org.apache.openjpa.lib.log.Log; import org.apache.openjpa.lib.log.LogFactory; import org.apache.openjpa.lib.util.Closeable; /** * Interface for generic configuration objects. Includes the ability * to write configuration to and from {@link Properties} instances. Instances * are threadsafe for reads, but not for writes. * * @author Marc Prud'hommeaux * @author Abe White */ public interface Configuration extends BeanInfo, Serializable, Closeable, Cloneable { /** * Attribute of returned {@link Value} property descriptors listing * recognized values for the property. */ public static final String ATTRIBUTE_ALLOWED_VALUES = "allowedValues"; /** * Attribute of the returned {@link Value} property descriptors naming * the property's type or category. */ public static final String ATTRIBUTE_TYPE = "propertyType"; /** * Attribute of the returned {@link Value} property descriptors naming * the property' hierarchical category. */ public static final String ATTRIBUTE_CATEGORY = "propertyCategory"; /** * Attribute of the returned {@link Value} property descriptors naming * the property's ordering in its category. */ public static final String ATTRIBUTE_ORDER = "propertyCategoryOrder"; /** * Attribute of the returned {@link Value} property descriptors naming * the interface that plugin values for this property must implement. */ public static final String ATTRIBUTE_INTERFACE = "propertyInterface"; /** * Attribute of the returned {@link Value} property descriptors naming * the property's name in XML format (i.e. two-words instead of TwoWords). */ public static final String ATTRIBUTE_XML = "xmlName"; public static final int INIT_STATE_LIQUID = 0; public static final int INIT_STATE_FREEZING = 1; public static final int INIT_STATE_FROZEN = 2; /** * Return the product name. Defaults to <code>openjpa</code>. */ public String getProductName(); /** * Set the product name. */ public void setProductName(String name); /** * The log factory. If no log factory has been set explicitly, * this method will create one. */ public LogFactory getLogFactory(); /** * The log factory. */ public void setLogFactory(LogFactory factory); /** * Log plugin setting. */ public String getLog(); /** * Log plugin setting. */ public void setLog(String log); /** * Return the log for the given category. * * @see #getLogFactory */ public Log getLog(String category); /** * Return the log to use for configuration messages. */ public Log getConfigurationLog(); /** * An environment-specific identifier for this configuration. This * might correspond to a JPA persistence-unit name, or to some other * more-unique value available in the current environment. * * @since 0.9.7 */ public String getId(); /** * An environment-specific identifier for this configuration. This * might correspond to a JPA persistence-unit name, or to some other * more-unique value available in the current environment. * * @since 0.9.7 */ public void setId(String id); /** * Return the {@link Value} for the given property, or null if none. */ public Value getValue(String property); /** * Return the set of all {@link Value}s. */ public Value[] getValues(); /** * Add the given value to the set of configuration properties. This * method replaces any existing value under the same property. */ public <T extends Value> T addValue(T val); //public Value addValue(Value val); /** * Remove the given value from the set of configuration properties. */ public boolean removeValue(Value val); /** * A properties representation of this Configuration. * Note that changes made to this properties object will * not be automatically reflected in this Configuration object. * * @param storeDefaults if true, then properties will be written * out even if they match the default value for a property */ public Map<String,Object> toProperties(boolean storeDefaults); /** * Get the set of all known property keys, including any equivalent keys, * appropriately prefixed. * * @param propertyName the name of the property for which the keys are * to be retrieved. * * @since 2.0.0 */ public List<String> getPropertyKeys(String propertyName); /** * Get the set of all known property keys, including any equivalent keys, * appropriately prefixed. * * @since 2.0.0 */ public Set<String> getPropertyKeys(); /** * Set this Configuration via the given map. Any keys missing from * the given map will not be set. Note that changes made to this map * will not be automatically reflected in this Configuration object. * IMPORTANT: If the map contains instantiated objects(rather than * string values), only the string representation of those objects * are considered in this configuration's <code>equals</code> and * <code>hashCode</code> methods. If the object's property has no * string form(such as an {@link ObjectValue}), the object is not * part of the equality and hashing calculations. */ public void fromProperties(Map map); /** * Adds a listener for any property changes. The property events fired * will <b>not</b> include the old value. * * @param listener the listener to receive notification of property changes */ public void addPropertyChangeListener(PropertyChangeListener listener); /** * Removes a listener for any property changes. * * @param listener the listener to remove */ public void removePropertyChangeListener(PropertyChangeListener listener); /** * Lock down the configuration's state. Attempting to set state on a * read-only configuration results in an exception. */ public void setReadOnly(int readOnly); /** * Return true if this configuration is immutable. */ public boolean isReadOnly(); /** * Call the instantiating get methods for all values. Up-front * instantiation allows one to avoid the synchronization necessary with * lazy instantiation. */ public void instantiateAll(); /** * Free the resources used by this object. */ public void close(); /** * Return a copy of this configuration. */ public Object clone(); /** * Gets a class loader that can be additionally used to load custom plugin values. * * @see Configurations#newInstance(String, ClassLoader) * @return an additional classloader for loading custom plugins. Can be null. * @since 2.3.0 */ ClassLoader getUserClassLoader(); /** * Sets an additional classloader to load custom plugin values. * In OSGi environment, we internally set the bundle class loader as * the user class loader. * * @param loader a class loader to load custom plugin values * @see PersistenceProviderImpl.createEntityManagerFactory(String, Map) * @since 2.3.0 */ void setUserClassLoader(ClassLoader loader); }