blob: d47a729b231987abef69cd945f226c4bbcdbb421 [file] [log] [blame]
/*
* 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.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
/**
* Hooks for deriving products with additional functionality.
* Parses configuration information from global, default or explictly-specified
* resources. All implementations of this interface will have a chance to mutate
* a {@link Configuration} both before and after the user-specified
* configuration data is loaded. The order in which the product derivations are
* evaluated is determined by the specificity of the derivation type.
*
* @author Abe White
* @author Pinaki Poddar
* @since 0.4.1
*/
public interface ProductDerivation {
int TYPE_PRODUCT = 100;
int TYPE_FEATURE = 1000;
/**
* Return the type of derivation.
*/
int getType();
/**
* Return the configuration prefix for properties of this product.
*/
String getConfigurationPrefix();
/**
* Ensure that this derivation is valid. This action might consist of
* loading classes for the product this derivation represents to be sure
* they exist. Throw any throwable to indicate an invalid derivation.
* Invalid derivations will not be used.
*/
void validate()
throws Exception;
/**
* Load globals into the returned ConfigurationProvider, or return null if
* no globals are found.
*/
ConfigurationProvider loadGlobals(ClassLoader loader)
throws Exception;
/**
* Load defaults into the returned ConfigurationProvider, or return null if
* no defaults are found.
*/
ConfigurationProvider loadDefaults(ClassLoader loader)
throws Exception;
/**
* Load the given given resource into the returned ConfigurationProvider,
* or return null if it is not a resource this receiver understands.
* The given class loader may be null.
*
* @param anchor optional named anchor within a multiple-configuration
* resource
*/
ConfigurationProvider load(String resource, String anchor,
ClassLoader loader)
throws Exception;
/**
* Load given file, or return null if it is not a file this receiver
* understands.
*
* @param anchor optional named anchor within a multiple-configuration file
*/
ConfigurationProvider load(File file, String anchor)
throws Exception;
/**
* Return a string identifying the default resource location for this
* product derivation, if one exists. If there is no default location,
* returns <code>null</code>.
*
* @since 1.1.0
*/
String getDefaultResourceLocation();
/**
* Return a List<String> of all the anchors defined in <code>file</code>.
* The returned names are not fully-qualified, so must be used in
* conjunction with <code>file</code> in calls
* to {@link #load(java.io.File, String)}.
*
* Returns <code>null</code> or an empty list if no anchors could be found.
*
* @since 1.1.0
*/
List<String> getAnchorsInFile(File file) throws IOException,
Exception;
/**
* Return a List<String> of all the anchors defined in
* <code>resource</code>. The returned names are not
* fully-qualified, so must be used in conjunction with
* <code>resource</code> in calls to {@link #load(java.io.File, String)}.
*
* Returns <code>null</code> or an empty list if no anchors could be found.
*
* @since 1.1.0
*/
List<String> getAnchorsInResource(String resource) throws Exception;
/**
* Provides the instance with a callback to mutate the initial properties
* of the {@link ConfigurationProvider}. This is primarily to alter or
* add properties that determine what type of configuration is constructed,
* and therefore is typically used at runtime only.
*
* @return true if given ConfigurationProvider has been mutated.
*/
boolean beforeConfigurationConstruct(ConfigurationProvider cp);
/**
* Provides the instance with the opportunity to mutate
* <code>conf</code> before the user configuration is applied.
*
* @return true if given Configuration has been mutated.
*/
boolean beforeConfigurationLoad(Configuration conf);
/**
* Called after the specification has been set.
*
* @return true if given Configuration has been mutated.
*/
boolean afterSpecificationSet(Configuration conf);
/**
* Called before the given Configuration is closed.
*
* @since 0.9.7
*/
void beforeConfigurationClose(Configuration conf);
/**
* Return set of Query hint keys recognized by this receiver.
*
* @since 2.0.0
*/
Set<String> getSupportedQueryHints();
}