blob: 0b2245964eb29ec438d7da1d0bdec188dc378b36 [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.meta;
import java.io.File;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import org.apache.openjpa.lib.meta.ClassArgParser;
/**
* The {@link MetaDataRepository} uses implementations of this interface
* to load and store metadata. Implementations need not be threadsafe.
*
* @author Patrick Linskey
* @author Abe White
* @author Pinaki Poddar
*/
public interface MetaDataFactory
extends MetaDataModes {
int STORE_DEFAULT = 0;
int STORE_PER_CLASS = 1;
int STORE_VERBOSE = 2;
/**
* Set the repository to load metadata into.
* This method will be called before use.
*/
void setRepository(MetaDataRepository repos);
/**
* Base directory for storing metadata. May not be called.
*/
void setStoreDirectory(File dir);
/**
* Storage mode. May not be called.
*/
void setStoreMode(int store);
/**
* If true, I/O's must exactly obey the mode directives given, and may
* not load additional information.
*/
void setStrict(boolean strict);
/**
* Load metadata for the given class in the given mode(s). If loading
* in {@link MetaDataModes#MODE_QUERY}, the class may be null. Loaded
* metadata should be added directly to the repository. It should have
* its source mode set appropriately via
* {@link ClassMetaData#setSourceMode}.
*
* @param mode the mode to load metadata in: if mapping information is
* stored together with metadata, then you can load mapping
* data even if this mode only includes
* {@link MetaDataModes#MODE_META MODE_META}, so long as
* the <code>strict</code> property hasn't been set
*/
void load(Class<?> cls, int mode, ClassLoader envLoader);
/**
* Store the given metadata.
*
* @param mode hint about what aspects of the metadata have changed
* @param output if non-null, rather than storing metadata directly,
* add entries mapping each output destination such
* as a <code>File</code> to the planned output for that
* destination in string form
* @return false if this factory is unable to store metadata
*/
boolean store(ClassMetaData[] metas, QueryMetaData[] queries,
SequenceMetaData[] seqs, int mode, Map<File, String> output);
/**
* Drop the metadata for the given classes in the given mode(s).
*
* @return false if any metadata could not be dropped
*/
boolean drop(Class<?>[] cls, int mode, ClassLoader envLoader);
/**
* Return the metadata defaults for this factory.
*/
MetaDataDefaults getDefaults();
/**
* Return all persistent class names, using the metadata locations supplied
* in configuration, optionally scanning the classpath.
* Return null if no types are supplied and this factory is unable to scan
* the classpath. This method should not be used directly by outside
* code; use {@link MetaDataRepository#getPersistentTypeNames} instead.
*
* @see MetaDataRepository#getPersistentTypeNames
* @see MetaDataRepository#loadPersistentTypes
*/
Set<String> getPersistentTypeNames(boolean devpath,
ClassLoader envLoader);
/**
* Return the type defining the given query name, if any.
*/
Class<?> getQueryScope(String queryName, ClassLoader loader);
/**
* Return the type defining the given result set mapping name, if any.
*/
Class<?> getResultSetMappingScope(String resultSetMappingName,
ClassLoader loader);
/**
* Return a properly-configured class arg parser for our expected
* metadata format.
*/
ClassArgParser newClassArgParser();
/**
* Clear any internal caches.
*/
void clear();
/**
* Add any extension keys used by this instance to the given set.
*/
void addClassExtensionKeys(Collection<?> exts);
/**
* Add any extension keys used by this instance to the given set.
*/
void addFieldExtensionKeys (Collection<?> exts);
/**
* Load XMLClassMetadata for the given class. Loaded
* metadata should be added directly to the repository.
*/
void loadXMLMetaData(Class<?> cls);
/**
* Gets the name of the meta-model class for the given fully-qualified
* managed class name.
*
* @since 2.0.0
*/
String getMetaModelClassName(String managedClassName);
/**
* Gets the name of the managed class for the given fully-qualified
* meta-model class name.
*
* @since 2.0.0
*/
String getManagedClassName(String metamodelClassName);
/**
* Affirms if the given class is a meta-class.
*
* @since 2.0.0
*/
boolean isMetaClass(Class<?> c);
/**
* Gets the managed class corresponding to the given meta-class.
*
* @return null if the given input is not a meta-class.
*
* @since 2.0.0
*/
Class<?> getManagedClass(Class<?> c);
}