Author: ppoddar
Date: Thu Oct 1 21:30:39 2009
New Revision: 820804
URL: http://svn.apache.org/viewvc?rev=820804&view=rev
Log:
OPENJPA-250: Correct MetaDataRepository plug-in configuration.
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/MetaDataRepositoryValue.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configuration.java
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/MetaDataRepositoryValue.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/MetaDataRepositoryValue.java?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/MetaDataRepositoryValue.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/MetaDataRepositoryValue.java
Thu Oct 1 21:30:39 2009
@@ -35,9 +35,7 @@
extends PluginValue {
private static final String KEY = "MetaDataRepository";
- private static final String PRELOAD_STR = "Preload=true";
- private static final String NOLOCK_STR = "NoLock=true";
-
+
public MetaDataRepositoryValue() {
super(KEY, false);
String[] aliases = new String[] {
@@ -49,25 +47,6 @@
setString(aliases[0]);
}
- public boolean getPreload() {
- String p = getProperties();
- if (p != null && p.indexOf(PRELOAD_STR) >= 0) {
- return true;
- } else if (getNoLock() == true) {
- // No locking implies that we need to also preload.
- // Return true regardless of the value of the
- // preload flag.
- return true;
- }
- return false;
- }
- public boolean getNoLock(){
- String p = getProperties();
- if (p != null && p.indexOf(NOLOCK_STR) >= 0) {
- return true;
- }
- return false;
- }
public Object instantiate(Class type, Configuration c, boolean fatal) {
MetaDataRepository repos = null;
OpenJPAConfiguration conf = (OpenJPAConfiguration) c;
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
Thu Oct 1 21:30:39 2009
@@ -333,7 +333,7 @@
mapping = addString("Mapping");
metaFactoryPlugin = addPlugin("MetaDataFactory", false);
- metaRepositoryPlugin = (MetaDataRepositoryValue)addValue(new
MetaDataRepositoryValue());
+ metaRepositoryPlugin = addValue(new MetaDataRepositoryValue());
connectionFactory = addObject("ConnectionFactory");
connectionFactory.setInstantiatingGetter("getConnectionFactory");
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
Thu Oct 1 21:30:39 2009
@@ -60,6 +60,7 @@
import org.apache.openjpa.meta.MetaDataRepository;
import org.apache.openjpa.util.GeneralException;
import org.apache.openjpa.util.InvalidStateException;
+import org.apache.openjpa.util.MetaDataException;
import org.apache.openjpa.util.OpenJPAException;
import org.apache.openjpa.util.UserException;
import org.apache.openjpa.writebehind.WriteBehindCache;
@@ -163,21 +164,24 @@
_conf.getConnectionRetainModeConstant(), false).close();
}
- // This logic needs to happen here for a reason! The preloading of the
MDR
- // can not happen during the configuration of the MDR because when
running
- // in a container environment we need to be able to get an
uninitialized
- // MDR to pass to the PCClassFileTransformer. If we preload before
registering
+ // This eager metadata loading is invoked at construction.
+ // It can not happen during the MetaDataRepository configuration
because
+ // within a container environment an uninitialized repository must be
passed
+ // to the PCClassFileTransformer. If we attempt to load before
registering
// the class transformer, we miss the class being defined by the JVM
and in turn
// we fail to enhance our entities.
- OpenJPAConfigurationImpl impl = (OpenJPAConfigurationImpl) config;
- MetaDataRepositoryValue m = impl.metaRepositoryPlugin;
- if (m.getPreload() == true) {
- // Obtain a reference to the MetaDataRepository and trigger the
preload
+ try {
MetaDataRepository mdr = config.getMetaDataRepositoryInstance();
mdr.preload();
+ } catch (MetaDataException e) {
+ // recognize metadata related error if using early initialization
+ throw e;
+ } catch (Throwable t) {
+ // swallow other errors because merely trying to obtain a
repository
+ // may trigger a database connection
+
_conf.getConfigurationLog().error(_loc.get("factory-init-error",t));
}
-
- initWriteBehindCallback();
+ initWriteBehindCallback();
}
/**
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
Thu Oct 1 21:30:39 2009
@@ -274,32 +274,58 @@
_sourceMode &= ~mode;
}
+ /**
+ * Sets whether this repository will load all known persistent classes at
initialization.
+ * Defaults to false.
+ */
+ public boolean getPreload() {
+ return _preload;
+ }
+
+ /**
+ * Sets whether this repository will load all known persistent classes at
initialization.
+ * Defaults to false.
+ */
public void setPreload(boolean l) {
_preload = l;
}
+ /**
+ * Sets whether this repository will use unguarded access. Unguarded access
+ * can be safe if all metadata has been loaded at initialization.
+ */
public void setNoLock(boolean l) {
_noLock = l;
}
+
+ /**
+ * Affirms whether this repository will use unguarded access. Unguarded
access
+ * can be safe if all metadata has been loaded at initialization.
+ */
+ public boolean getNoLock() {
+ return _noLock;
+ }
/**
- * If the openjpa.MetaDataRepository plugin value preload=false is set,
this method will noop.
- * If preload=true this method gets the list of persistent classes and
calls to the
- * MetaDataFactory to load ALL metadata.
- * <p>
+ * Loads all the known persistent classes if {...@linkplain
#setPreload(boolean) early loading}
+ * initialization has been set. The configuration must enlist all classes.
*
- * If noLock=true, calling this method will also remove ALL locking from
this class.
+ * <br>
+ * If {...@linkplain #setNoLock(boolean) no lock} has been set then uses
unguarded access to
+ * all internal data container structures.
+ * If the openjpa.MetaDataRepository plugin value preload=false is set,
this method will noop.
* <p>
- *
* NOTE : This method is not thread safe and should ONLY be called by the
AbstractBrokerFactory
* constructor.
+ *
+ * @see #getPersistentTypeNames(boolean, ClassLoader)
*/
public void preload() {
- if (_preload == false) {
+ if (!_preload) {
return;
}
- if (_log.isTraceEnabled()) {
- _log.trace("MetaDataRepository preload=" + _preload + ",noLock=" +
_noLock);
+ if (_log.isInfoEnabled()) {
+ _log.info(_loc.get(_noLock ? "repos-preload" :
"repos-preload-nolock"));
}
// Remove locking and use unsynchronized maps.
@@ -319,15 +345,14 @@
MultiClassLoader multi =
AccessController.doPrivileged(J2DoPrivHelper.newMultiClassLoaderAction());
multi.addClassLoader(AccessController.doPrivileged(J2DoPrivHelper.getContextClassLoaderAction()));
multi.addClassLoader(AccessController.doPrivileged(J2DoPrivHelper
- .getClassLoaderAction(MetaDataRepository.class)));
+ .getClassLoaderAction(MetaDataRepository.class)));
Set<String> classes = getPersistentTypeNames(false, multi);
if (classes == null || classes.size() == 0) {
- throw new RuntimeException("No persistent classes listed when
trying to preload the MetaDataRepository");
+ throw new MetaDataException(_loc.get("repos-preload-none"));
}
- if (_log.isTraceEnabled() == true) {
- _log.trace(MetaDataRepository.class.getName()
- + " preloading the following classes : " + classes.toString());
+ if (_log.isTraceEnabled()) {
+ _log.trace(_loc.get("repos-preloading", this.getClass().getName(),
classes.toString()));
}
for (String c : classes) {
@@ -335,12 +360,9 @@
Class<?> cls =
AccessController.doPrivileged((J2DoPrivHelper.getForNameAction(c, true,
multi)));
_factory.load(cls, MODE_ALL, multi);
} catch (PrivilegedActionException pae) {
- // Unexpected!
- if (_log.isTraceEnabled() == true) {
- _log.trace(MetaDataRepository.class.getName() + "
encountered an unexpected exception ", pae);
- }
+ throw new MetaDataException(_loc.get("repos-preload-error"),
pae);
}
- }// end for
+ }
}
protected void lock() {
Modified:
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
Thu Oct 1 21:30:39 2009
@@ -187,6 +187,8 @@
bad-id-value: The given value "{0}" cannot be converted into an identity \
for "{2}". The value is the wrong type ({1}).
factory-init: Starting OpenJPA {0}
+factory-init-error: Error during initialization of configured properties:
"{0}"\
+ The initialization will continue.
factory-properties: Properties: {0}
inverse-consistency: An inverse inconsistency in the object model was \
detected while flushing the field "{0}" of the instance with id "{1}" \
Modified:
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
Thu Oct 1 21:30:39 2009
@@ -336,5 +336,15 @@
inherited class(es) are packaged in the same jar file.
meta-no-model: Meta class "{0}" for entity {1} can not be registered with \
following exception "{2}"
-no-mapped-by-in-mapped-super: Persistent relationship {0} defined by a mapped
superclass {1} must be \
- unidirectional.
\ No newline at end of file
+no-mapped-by-in-mapped-super: Persistent relationship {0} defined by a mapped \
+ superclass {1} must be unidirectional.
+repos-preload: Metadata is loaded during initialization. The persistent
classes \
+ must be enlisted in configuration to be loaded during initialization.
+repos-preload-nolock: Metadata is loaded during initialization with unguarded
access. \
+ The persistent classes must be enlisted in configuration to be loaded
during \
+ initialization.
+repos-preload-none: No persistent metadata found for loading during
initialization. \
+ The persistent classes must be enlisted in configuration to be loaded
during initialization.
+repos-preloading: Following metadata are being loaded during initialization by
"{0}": {1}.
+repos-preload-error: Unexpected error during early loading during
initialization. \
+ See nested stacktrace for details.
\ No newline at end of file
Modified:
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configuration.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configuration.java?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configuration.java
(original)
+++
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configuration.java
Thu Oct 1 21:30:39 2009
@@ -158,7 +158,8 @@
* Add the given value to the set of configuration properties. This
* method replaces any existing value under the same property.
*/
- public Value addValue(Value val);
+ public <T extends Value> T addValue(T val);
+ //public Value addValue(Value val);
/**
* Remove the given value from the set of configuration properties.
Modified:
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java?rev=820804&r1=820803&r2=820804&view=diff
==============================================================================
---
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java
(original)
+++
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java
Thu Oct 1 21:30:39 2009
@@ -994,7 +994,7 @@
return true;
}
- public Value addValue(Value val) {
+ public <T extends Value> T addValue(T val) {
_vals.add(val);
val.addListener(this);
return val;