You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by cl...@apache.org on 2007/09/24 22:45:50 UTC
svn commit: r578959 -
/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java
Author: clombart
Date: Mon Sep 24 13:45:49 2007
New Revision: 578959
URL: http://svn.apache.org/viewvc?rev=578959&view=rev
Log:
Apply patch for JCR-1142.
Modified:
jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java
Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java?rev=578959&r1=578958&r2=578959&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java (original)
+++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java Mon Sep 24 13:45:49 2007
@@ -345,27 +345,32 @@
checkCompatiblePrimaryNodeTypes(session, node, classDescriptor, true);
}
- Object object = null;
+ ClassDescriptor alternativeDescriptor = null;
if (classDescriptor.usesNodeTypePerHierarchyStrategy()) {
- if (!node.hasProperty(ManagerConstant.DISCRIMINATOR_PROPERTY_NAME)) {
- throw new ObjectContentManagerException("Cannot fetch object of type '" + clazz.getName()
- + "' using NODETYPE_PER_HIERARCHY. Discriminator property is not present.");
+ if (node.hasProperty(ManagerConstant.DISCRIMINATOR_PROPERTY_NAME)) {
+ String className = node.getProperty(ManagerConstant.DISCRIMINATOR_PROPERTY_NAME).getValue().getString();
+ alternativeDescriptor = getClassDescriptor(ReflectionUtils.forName(className));
}
-
- String className = node.getProperty(ManagerConstant.DISCRIMINATOR_PROPERTY_NAME).getValue().getString();
- classDescriptor = getClassDescriptor(ReflectionUtils.forName(className));
- object = ReflectionUtils.newInstance(className);
} else {
if (classDescriptor.usesNodeTypePerConcreteClassStrategy()) {
String nodeType = node.getPrimaryNodeType().getName();
if (!nodeType.equals(classDescriptor.getJcrType())) {
- classDescriptor = classDescriptor.getDescendantClassDescriptor(nodeType);
+ alternativeDescriptor = classDescriptor.getDescendantClassDescriptor(nodeType);
}
}
- object = ReflectionUtils.newInstance(classDescriptor.getClassName());
+ }
+ // if we have an alternative class descriptor, check whether its
+ // extends (or is the same) as the requested class.
+ if (alternativeDescriptor != null) {
+ Class alternativeClazz = ReflectionUtils.forName(alternativeDescriptor.getClassName());
+ if (clazz.isAssignableFrom(alternativeClazz)) {
+ classDescriptor = alternativeDescriptor;
+ }
}
+ Object object = ReflectionUtils.newInstance(classDescriptor.getClassName());
+
if (! requestObjectCache.isCached(path))
{
requestObjectCache.cache(path, object);