You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/08/13 18:36:57 UTC

svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Author: jukka
Date: Fri Aug 13 16:36:56 2010
New Revision: 985273

URL: http://svn.apache.org/viewvc?rev=985273&view=rev
Log:
JCR-890: concurrent read-only access to a session

Inline NodeTypeInstanceHandler into NodeState to avoid the extra instance variable in SessionImpl

Removed:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java?rev=985273&r1=985272&r2=985273&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java Fri Aug 13 16:36:56 2010
@@ -1255,13 +1255,7 @@ public class BatchedItemOperations exten
         prop.setMultiValued(def.isMultiple());
 
         // compute system generated values if necessary
-        InternalValue[] genValues = session.getNodeTypeInstanceHandler()
-                .computeSystemGeneratedPropertyValues(parent, def);
-        if (genValues != null) {
-            prop.setValues(genValues);
-        } else if (def.getDefaultValues() != null) {
-            prop.setValues(InternalValue.create(def.getDefaultValues()));
-        }
+        prop.setDefaultValues(parent, def, session.getUserID());
 
         // now add new property entry to parent
         parent.addPropertyName(propName);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=985273&r1=985272&r2=985273&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Fri Aug 13 16:36:56 2010
@@ -471,15 +471,8 @@ public class NodeImpl extends ItemImpl i
             propState.setType(type);
             propState.setMultiValued(propDef.isMultiple());
             // compute system generated values if necessary
-            InternalValue[] genValues =
-                sessionContext.getSessionImpl().getNodeTypeInstanceHandler()
-                .computeSystemGeneratedPropertyValues(data.getNodeState(), propDef);
-            if (genValues == null) {
-                genValues = InternalValue.create(propDef.getDefaultValues());
-            }
-            if (genValues != null) {
-                propState.setValues(genValues);
-            }
+            propState.setDefaultValues(
+                    data.getNodeState(), propDef, getSession().getUserID());
         } catch (ItemStateException ise) {
             String msg = "failed to add property " + name + " to " + this;
             log.debug(msg);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=985273&r1=985272&r2=985273&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Fri Aug 13 16:36:56 2010
@@ -174,11 +174,6 @@ public class SessionImpl extends Abstrac
     protected final InternalVersionManager versionMgr;
 
     /**
-     * node type instance handler
-     */
-    protected final NodeTypeInstanceHandler ntInstanceHandler;
-
-    /**
      * Listeners (weak references)
      */
     protected final Map<SessionListener, SessionListener> listeners =
@@ -253,7 +248,6 @@ public class SessionImpl extends Abstrac
                 createObservationManager(wspConfig.getName()));
 
         versionMgr = createVersionManager();
-        ntInstanceHandler = new NodeTypeInstanceHandler(userId);
     }
 
     /**
@@ -459,14 +453,6 @@ public class SessionImpl extends Abstrac
     }
 
     /**
-     * Returns the node type instance handler for this session
-     * @return the node type instance handler.
-     */
-    public NodeTypeInstanceHandler getNodeTypeInstanceHandler() {
-        return ntInstanceHandler;
-    }
-
-    /**
      * Sets the named attribute. If the value is <code>null</code>, then
      * the named attribute is removed.
      *

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java?rev=985273&r1=985272&r2=985273&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java Fri Aug 13 16:36:56 2010
@@ -18,15 +18,21 @@ package org.apache.jackrabbit.core.state
 
 import org.apache.jackrabbit.core.id.ItemId;
 import org.apache.jackrabbit.core.id.NodeId;
+import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.QPropertyDefinition;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
 
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.jcr.RepositoryException;
+
 /**
  * <code>NodeState</code> represents the state of a <code>Node</code>.
  */
@@ -862,6 +868,70 @@ public class NodeState extends ItemState
     //-------------------------------------------------< misc. helper methods >
 
     /**
+     * Computes the values of well-known system (i.e. protected) properties.
+     *
+     * @param def the definition of the property to compute
+     * @return the computed values
+     */
+    public InternalValue[] computeGeneratedValues(
+            QPropertyDefinition def, String userId) {
+        if (userId == null) {
+            userId = "system";
+        }
+
+        Name name = def.getName();
+        Name declaringNT = def.getDeclaringNodeType();
+
+        if (NameConstants.JCR_UUID.equals(name)) {
+            // jcr:uuid property of the mix:referenceable node type
+            if (NameConstants.MIX_REFERENCEABLE.equals(declaringNT)) {
+                return new InternalValue[]{InternalValue.create(getNodeId().toString())};
+            }
+        } else if (NameConstants.JCR_PRIMARYTYPE.equals(name)) {
+            // jcr:primaryType property (of any node type)
+            return new InternalValue[]{InternalValue.create(getNodeTypeName())};
+        } else if (NameConstants.JCR_MIXINTYPES.equals(name)) {
+            // jcr:mixinTypes property (of any node type)
+            Set<Name> mixins = getMixinTypeNames();
+            InternalValue[] values = new InternalValue[mixins.size()];
+            int i = 0;
+            for (Name n : mixins) {
+                values[i++] = InternalValue.create(n);
+            }
+            return values;
+        } else if (NameConstants.JCR_CREATED.equals(name)) {
+            // jcr:created property of a version or a mix:created
+            if (NameConstants.MIX_CREATED.equals(declaringNT)
+                    || NameConstants.NT_VERSION.equals(declaringNT)) {
+                return new InternalValue[]{InternalValue.create(Calendar.getInstance())};
+            }
+        } else if (NameConstants.JCR_CREATEDBY.equals(name)) {
+            // jcr:createdBy property of a mix:created
+            if (NameConstants.MIX_CREATED.equals(declaringNT)) {
+                return new InternalValue[]{InternalValue.create(userId)};
+            }
+        } else if (NameConstants.JCR_LASTMODIFIED.equals(name)) {
+            // jcr:lastModified property of a mix:lastModified
+            if (NameConstants.MIX_LASTMODIFIED.equals(declaringNT)) {
+                return new InternalValue[]{InternalValue.create(Calendar.getInstance())};
+            }
+        } else if (NameConstants.JCR_LASTMODIFIEDBY.equals(name)) {
+            // jcr:lastModifiedBy property of a mix:lastModified
+            if (NameConstants.MIX_LASTMODIFIED.equals(declaringNT)) {
+                return new InternalValue[]{InternalValue.create(userId)};
+            }
+        } else if (NameConstants.JCR_ETAG.equals(name)) {
+            // jcr:etag property of a mix:etag
+            if (NameConstants.MIX_ETAG.equals(declaringNT)) {
+                // TODO: provide real implementation
+                return new InternalValue[]{InternalValue.create("")};
+            }
+        }
+
+        return null;
+    }
+
+    /**
      * {@inheritDoc}
      */
     public long calculateMemoryFootprint() {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java?rev=985273&r1=985272&r2=985273&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java Fri Aug 13 16:36:56 2010
@@ -21,8 +21,10 @@ import org.apache.jackrabbit.core.id.Nod
 import org.apache.jackrabbit.core.id.ItemId;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.QPropertyDefinition;
 
 import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
 
 /**
  * <code>PropertyState</code> represents the state of a <code>Property</code>.
@@ -185,6 +187,28 @@ public class PropertyState extends ItemS
     }
 
     /**
+     * Sets the system-generated or node type -specified default values
+     * of this property. If such values are not specified, then this property
+     * is not modified.
+     * 
+     * @param parent parent node state
+     * @param def property definition
+     * @param userId user identifier associated with the current session
+     * @throws RepositoryException if the default values could not be created 
+     */
+    public void setDefaultValues(
+            NodeState parent, QPropertyDefinition def, String userId)
+            throws RepositoryException {
+        InternalValue[] values = parent.computeGeneratedValues(def, userId);
+        if (values == null) {
+            values = InternalValue.create(def.getDefaultValues());
+        }
+        if (values != null) {
+            setValues(values);
+        }
+    }
+
+    /**
      * Returns the value(s) of this property.
      *
      * @return the value(s) of this property.

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java?rev=985273&r1=985272&r2=985273&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java Fri Aug 13 16:36:56 2010
@@ -651,8 +651,8 @@ abstract public class VersionManagerImpl
                                               boolean useDefaultValues)
             throws RepositoryException {
         // compute system generated values if necessary
-        InternalValue[] values = session.getNodeTypeInstanceHandler().
-                computeSystemGeneratedPropertyValues(state.getState(), def);
+        InternalValue[] values =
+            state.getState().computeGeneratedValues(def, session.getUserID());
         if (values == null && useDefaultValues) {
             values = InternalValue.create(def.getDefaultValues());
         }



Re: svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Posted by Tobias Bocanegra <to...@day.com>.
i agree with stefan, further should the "computeGeneratedValues" be
extensible in the future - so adding them to the state is imo wrong,
too. i would rather have a more generic approach to this.
regards, toby

On Mon, Aug 16, 2010 at 10:12 AM, Stefan Guggisberg
<st...@day.com> wrote:
> sorry, but i don't agree with these changes.
> ItemState classes IMO shouldn't have any
> knowledge of node type semantics. in general
> they're only bean-like objects with simple setters
> and getters.
>
> a method like
>
> public void PropertyState#setDefaultValues(
>            NodeState parent, QPropertyDefinition def, String userId)
>            throws RepositoryException
>
> doesn't look right to me.
>
> cheers
> stefan
>
>
> On Fri, Aug 13, 2010 at 6:36 PM,  <ju...@apache.org> wrote:
>> Author: jukka
>> Date: Fri Aug 13 16:36:56 2010
>> New Revision: 985273
>>
>> URL: http://svn.apache.org/viewvc?rev=985273&view=rev
>> Log:
>> JCR-890: concurrent read-only access to a session
>>
>> Inline NodeTypeInstanceHandler into NodeState to avoid the extra instance variable in SessionImpl
>>
>> Removed:
>>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java
>> Modified:
>>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
>>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
>>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
>>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
>>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
>>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
>>
>> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
>> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java?rev=985273&r1=985272&r2=985273&view=diff
>> ==============================================================================
>> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java (original)
>> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java Fri Aug 13 16:36:56 2010
>> @@ -1255,13 +1255,7 @@ public class BatchedItemOperations exten
>>         prop.setMultiValued(def.isMultiple());
>>
>>         // compute system generated values if necessary
>> -        InternalValue[] genValues = session.getNodeTypeInstanceHandler()
>> -                .computeSystemGeneratedPropertyValues(parent, def);
>> -        if (genValues != null) {
>> -            prop.setValues(genValues);
>> -        } else if (def.getDefaultValues() != null) {
>> -            prop.setValues(InternalValue.create(def.getDefaultValues()));
>> -        }
>> +        prop.setDefaultValues(parent, def, session.getUserID());
>>
>>         // now add new property entry to parent
>>         parent.addPropertyName(propName);
>>
>> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
>> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=985273&r1=985272&r2=985273&view=diff
>> ==============================================================================
>> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
>> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Fri Aug 13 16:36:56 2010
>> @@ -471,15 +471,8 @@ public class NodeImpl extends ItemImpl i
>>             propState.setType(type);
>>             propState.setMultiValued(propDef.isMultiple());
>>             // compute system generated values if necessary
>> -            InternalValue[] genValues =
>> -                sessionContext.getSessionImpl().getNodeTypeInstanceHandler()
>> -                .computeSystemGeneratedPropertyValues(data.getNodeState(), propDef);
>> -            if (genValues == null) {
>> -                genValues = InternalValue.create(propDef.getDefaultValues());
>> -            }
>> -            if (genValues != null) {
>> -                propState.setValues(genValues);
>> -            }
>> +            propState.setDefaultValues(
>> +                    data.getNodeState(), propDef, getSession().getUserID());
>>         } catch (ItemStateException ise) {
>>             String msg = "failed to add property " + name + " to " + this;
>>             log.debug(msg);
>>
>> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
>> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=985273&r1=985272&r2=985273&view=diff
>> ==============================================================================
>> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
>> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Fri Aug 13 16:36:56 2010
>> @@ -174,11 +174,6 @@ public class SessionImpl extends Abstrac
>>     protected final InternalVersionManager versionMgr;
>>
>>     /**
>> -     * node type instance handler
>> -     */
>> -    protected final NodeTypeInstanceHandler ntInstanceHandler;
>> -
>> -    /**
>>      * Listeners (weak references)
>>      */
>>     protected final Map<SessionListener, SessionListener> listeners =
>> @@ -253,7 +248,6 @@ public class SessionImpl extends Abstrac
>>                 createObservationManager(wspConfig.getName()));
>>
>>         versionMgr = createVersionManager();
>> -        ntInstanceHandler = new NodeTypeInstanceHandler(userId);
>>     }
>>
>>     /**
>> @@ -459,14 +453,6 @@ public class SessionImpl extends Abstrac
>>     }
>>
>>     /**
>> -     * Returns the node type instance handler for this session
>> -     * @return the node type instance handler.
>> -     */
>> -    public NodeTypeInstanceHandler getNodeTypeInstanceHandler() {
>> -        return ntInstanceHandler;
>> -    }
>> -
>> -    /**
>>      * Sets the named attribute. If the value is <code>null</code>, then
>>      * the named attribute is removed.
>>      *
>>
>> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
>> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java?rev=985273&r1=985272&r2=985273&view=diff
>> ==============================================================================
>> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java (original)
>> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java Fri Aug 13 16:36:56 2010
>> @@ -18,15 +18,21 @@ package org.apache.jackrabbit.core.state
>>
>>  import org.apache.jackrabbit.core.id.ItemId;
>>  import org.apache.jackrabbit.core.id.NodeId;
>> +import org.apache.jackrabbit.core.value.InternalValue;
>>  import org.apache.jackrabbit.spi.Name;
>> +import org.apache.jackrabbit.spi.QPropertyDefinition;
>> +import org.apache.jackrabbit.spi.commons.name.NameConstants;
>>
>>  import java.util.ArrayList;
>> +import java.util.Calendar;
>>  import java.util.Collections;
>>  import java.util.HashSet;
>>  import java.util.LinkedHashSet;
>>  import java.util.List;
>>  import java.util.Set;
>>
>> +import javax.jcr.RepositoryException;
>> +
>>  /**
>>  * <code>NodeState</code> represents the state of a <code>Node</code>.
>>  */
>> @@ -862,6 +868,70 @@ public class NodeState extends ItemState
>>     //-------------------------------------------------< misc. helper methods >
>>
>>     /**
>> +     * Computes the values of well-known system (i.e. protected) properties.
>> +     *
>> +     * @param def the definition of the property to compute
>> +     * @return the computed values
>> +     */
>> +    public InternalValue[] computeGeneratedValues(
>> +            QPropertyDefinition def, String userId) {
>> +        if (userId == null) {
>> +            userId = "system";
>> +        }
>> +
>> +        Name name = def.getName();
>> +        Name declaringNT = def.getDeclaringNodeType();
>> +
>> +        if (NameConstants.JCR_UUID.equals(name)) {
>> +            // jcr:uuid property of the mix:referenceable node type
>> +            if (NameConstants.MIX_REFERENCEABLE.equals(declaringNT)) {
>> +                return new InternalValue[]{InternalValue.create(getNodeId().toString())};
>> +            }
>> +        } else if (NameConstants.JCR_PRIMARYTYPE.equals(name)) {
>> +            // jcr:primaryType property (of any node type)
>> +            return new InternalValue[]{InternalValue.create(getNodeTypeName())};
>> +        } else if (NameConstants.JCR_MIXINTYPES.equals(name)) {
>> +            // jcr:mixinTypes property (of any node type)
>> +            Set<Name> mixins = getMixinTypeNames();
>> +            InternalValue[] values = new InternalValue[mixins.size()];
>> +            int i = 0;
>> +            for (Name n : mixins) {
>> +                values[i++] = InternalValue.create(n);
>> +            }
>> +            return values;
>> +        } else if (NameConstants.JCR_CREATED.equals(name)) {
>> +            // jcr:created property of a version or a mix:created
>> +            if (NameConstants.MIX_CREATED.equals(declaringNT)
>> +                    || NameConstants.NT_VERSION.equals(declaringNT)) {
>> +                return new InternalValue[]{InternalValue.create(Calendar.getInstance())};
>> +            }
>> +        } else if (NameConstants.JCR_CREATEDBY.equals(name)) {
>> +            // jcr:createdBy property of a mix:created
>> +            if (NameConstants.MIX_CREATED.equals(declaringNT)) {
>> +                return new InternalValue[]{InternalValue.create(userId)};
>> +            }
>> +        } else if (NameConstants.JCR_LASTMODIFIED.equals(name)) {
>> +            // jcr:lastModified property of a mix:lastModified
>> +            if (NameConstants.MIX_LASTMODIFIED.equals(declaringNT)) {
>> +                return new InternalValue[]{InternalValue.create(Calendar.getInstance())};
>> +            }
>> +        } else if (NameConstants.JCR_LASTMODIFIEDBY.equals(name)) {
>> +            // jcr:lastModifiedBy property of a mix:lastModified
>> +            if (NameConstants.MIX_LASTMODIFIED.equals(declaringNT)) {
>> +                return new InternalValue[]{InternalValue.create(userId)};
>> +            }
>> +        } else if (NameConstants.JCR_ETAG.equals(name)) {
>> +            // jcr:etag property of a mix:etag
>> +            if (NameConstants.MIX_ETAG.equals(declaringNT)) {
>> +                // TODO: provide real implementation
>> +                return new InternalValue[]{InternalValue.create("")};
>> +            }
>> +        }
>> +
>> +        return null;
>> +    }
>> +
>> +    /**
>>      * {@inheritDoc}
>>      */
>>     public long calculateMemoryFootprint() {
>>
>> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
>> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java?rev=985273&r1=985272&r2=985273&view=diff
>> ==============================================================================
>> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java (original)
>> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java Fri Aug 13 16:36:56 2010
>> @@ -21,8 +21,10 @@ import org.apache.jackrabbit.core.id.Nod
>>  import org.apache.jackrabbit.core.id.ItemId;
>>  import org.apache.jackrabbit.core.value.InternalValue;
>>  import org.apache.jackrabbit.spi.Name;
>> +import org.apache.jackrabbit.spi.QPropertyDefinition;
>>
>>  import javax.jcr.PropertyType;
>> +import javax.jcr.RepositoryException;
>>
>>  /**
>>  * <code>PropertyState</code> represents the state of a <code>Property</code>.
>> @@ -185,6 +187,28 @@ public class PropertyState extends ItemS
>>     }
>>
>>     /**
>> +     * Sets the system-generated or node type -specified default values
>> +     * of this property. If such values are not specified, then this property
>> +     * is not modified.
>> +     *
>> +     * @param parent parent node state
>> +     * @param def property definition
>> +     * @param userId user identifier associated with the current session
>> +     * @throws RepositoryException if the default values could not be created
>> +     */
>> +    public void setDefaultValues(
>> +            NodeState parent, QPropertyDefinition def, String userId)
>> +            throws RepositoryException {
>> +        InternalValue[] values = parent.computeGeneratedValues(def, userId);
>> +        if (values == null) {
>> +            values = InternalValue.create(def.getDefaultValues());
>> +        }
>> +        if (values != null) {
>> +            setValues(values);
>> +        }
>> +    }
>> +
>> +    /**
>>      * Returns the value(s) of this property.
>>      *
>>      * @return the value(s) of this property.
>>
>> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
>> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java?rev=985273&r1=985272&r2=985273&view=diff
>> ==============================================================================
>> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java (original)
>> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java Fri Aug 13 16:36:56 2010
>> @@ -651,8 +651,8 @@ abstract public class VersionManagerImpl
>>                                               boolean useDefaultValues)
>>             throws RepositoryException {
>>         // compute system generated values if necessary
>> -        InternalValue[] values = session.getNodeTypeInstanceHandler().
>> -                computeSystemGeneratedPropertyValues(state.getState(), def);
>> +        InternalValue[] values =
>> +            state.getState().computeGeneratedValues(def, session.getUserID());
>>         if (values == null && useDefaultValues) {
>>             values = InternalValue.create(def.getDefaultValues());
>>         }
>>
>>
>>
>

Re: svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Posted by Stefan Guggisberg <st...@day.com>.
On Mon, Aug 16, 2010 at 10:40 AM, Jukka Zitting <ju...@gmail.com> wrote:
> Hi,
>
> On Mon, Aug 16, 2010 at 10:31 AM, Jukka Zitting <ju...@gmail.com> wrote:
>> How about putting the logic into NodeTypeRegistry?
>
> Hmm, that may neither be optimal, as currently the NTR has no
> knowledge of ItemStates.

agreed. IIRC that's why i made it a separate class.

cheers
stefan

>
> BR,
>
> Jukka Zitting
>

Re: svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Posted by Jukka Zitting <ju...@gmail.com>.
Hi,

On Mon, Aug 16, 2010 at 10:31 AM, Jukka Zitting <ju...@gmail.com> wrote:
> How about putting the logic into NodeTypeRegistry?

Hmm, that may neither be optimal, as currently the NTR has no
knowledge of ItemStates.

BR,

Jukka Zitting

Re: svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Posted by Stefan Guggisberg <st...@day.com>.
On Mon, Aug 16, 2010 at 11:10 AM, Jukka Zitting <ju...@gmail.com> wrote:
> Hi,
>
> On Mon, Aug 16, 2010 at 10:31 AM, Jukka Zitting <ju...@gmail.com> wrote:
>> On Mon, Aug 16, 2010 at 10:12 AM, Stefan Guggisberg
>> <st...@day.com> wrote:
>>> sorry, but i don't agree with these changes.
>>> ItemState classes IMO shouldn't have any
>>> knowledge of node type semantics.
>>
>> OK, I'll move them away from there.
>
> I reverted my earlier changes and committed an alternative solution in
> revision 985833. The relevant code now stays in
> NodeTypeInstanceHandler (with the extra helper method I added for
> setting default property values), but I removed the reference from
> SessionImpl to NodeTypeInstanceHandler. We may want to reintroduce
> that reference later if for example we want to make the
> NodeTypeInstanceHandler pluggable, but for now I'd like to avoid
> keeping extra stuff in SessionImpl.

agreed, thanks!

cheers
stefan

>
> BR,
>
> Jukka Zitting
>

Re: svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Posted by Jukka Zitting <ju...@gmail.com>.
Hi,

On Mon, Aug 16, 2010 at 10:31 AM, Jukka Zitting <ju...@gmail.com> wrote:
> On Mon, Aug 16, 2010 at 10:12 AM, Stefan Guggisberg
> <st...@day.com> wrote:
>> sorry, but i don't agree with these changes.
>> ItemState classes IMO shouldn't have any
>> knowledge of node type semantics.
>
> OK, I'll move them away from there.

I reverted my earlier changes and committed an alternative solution in
revision 985833. The relevant code now stays in
NodeTypeInstanceHandler (with the extra helper method I added for
setting default property values), but I removed the reference from
SessionImpl to NodeTypeInstanceHandler. We may want to reintroduce
that reference later if for example we want to make the
NodeTypeInstanceHandler pluggable, but for now I'd like to avoid
keeping extra stuff in SessionImpl.

BR,

Jukka Zitting

Re: svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Posted by Jukka Zitting <ju...@gmail.com>.
Hi,

On Mon, Aug 16, 2010 at 10:12 AM, Stefan Guggisberg
<st...@day.com> wrote:
> sorry, but i don't agree with these changes.
> ItemState classes IMO shouldn't have any
> knowledge of node type semantics.

OK, I'll move them away from there.

My main point with this commit was to get rid of the
NodeTypeInstanceHandler member variable in SessionImpl. That class
only contained the single computeSystemGeneratedPropertyValues()
method, which was essentially a static helper method. Turning it into
a member of NodeState seemed like a straightforward approach and the
extra method in PropertyState helped simplify calling code. You're
right in that I did fail to consider the overall design of the
ItemState classes, so I agree that the method should rather be
elsewhere.

How about putting the logic into NodeTypeRegistry?

BR,

Jukka Zitting

Re: svn commit: r985273 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ state/ version/

Posted by Stefan Guggisberg <st...@day.com>.
sorry, but i don't agree with these changes.
ItemState classes IMO shouldn't have any
knowledge of node type semantics. in general
they're only bean-like objects with simple setters
and getters.

a method like

public void PropertyState#setDefaultValues(
            NodeState parent, QPropertyDefinition def, String userId)
            throws RepositoryException

doesn't look right to me.

cheers
stefan


On Fri, Aug 13, 2010 at 6:36 PM,  <ju...@apache.org> wrote:
> Author: jukka
> Date: Fri Aug 13 16:36:56 2010
> New Revision: 985273
>
> URL: http://svn.apache.org/viewvc?rev=985273&view=rev
> Log:
> JCR-890: concurrent read-only access to a session
>
> Inline NodeTypeInstanceHandler into NodeState to avoid the extra instance variable in SessionImpl
>
> Removed:
>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java
> Modified:
>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
>    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java?rev=985273&r1=985272&r2=985273&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java Fri Aug 13 16:36:56 2010
> @@ -1255,13 +1255,7 @@ public class BatchedItemOperations exten
>         prop.setMultiValued(def.isMultiple());
>
>         // compute system generated values if necessary
> -        InternalValue[] genValues = session.getNodeTypeInstanceHandler()
> -                .computeSystemGeneratedPropertyValues(parent, def);
> -        if (genValues != null) {
> -            prop.setValues(genValues);
> -        } else if (def.getDefaultValues() != null) {
> -            prop.setValues(InternalValue.create(def.getDefaultValues()));
> -        }
> +        prop.setDefaultValues(parent, def, session.getUserID());
>
>         // now add new property entry to parent
>         parent.addPropertyName(propName);
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=985273&r1=985272&r2=985273&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Fri Aug 13 16:36:56 2010
> @@ -471,15 +471,8 @@ public class NodeImpl extends ItemImpl i
>             propState.setType(type);
>             propState.setMultiValued(propDef.isMultiple());
>             // compute system generated values if necessary
> -            InternalValue[] genValues =
> -                sessionContext.getSessionImpl().getNodeTypeInstanceHandler()
> -                .computeSystemGeneratedPropertyValues(data.getNodeState(), propDef);
> -            if (genValues == null) {
> -                genValues = InternalValue.create(propDef.getDefaultValues());
> -            }
> -            if (genValues != null) {
> -                propState.setValues(genValues);
> -            }
> +            propState.setDefaultValues(
> +                    data.getNodeState(), propDef, getSession().getUserID());
>         } catch (ItemStateException ise) {
>             String msg = "failed to add property " + name + " to " + this;
>             log.debug(msg);
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=985273&r1=985272&r2=985273&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Fri Aug 13 16:36:56 2010
> @@ -174,11 +174,6 @@ public class SessionImpl extends Abstrac
>     protected final InternalVersionManager versionMgr;
>
>     /**
> -     * node type instance handler
> -     */
> -    protected final NodeTypeInstanceHandler ntInstanceHandler;
> -
> -    /**
>      * Listeners (weak references)
>      */
>     protected final Map<SessionListener, SessionListener> listeners =
> @@ -253,7 +248,6 @@ public class SessionImpl extends Abstrac
>                 createObservationManager(wspConfig.getName()));
>
>         versionMgr = createVersionManager();
> -        ntInstanceHandler = new NodeTypeInstanceHandler(userId);
>     }
>
>     /**
> @@ -459,14 +453,6 @@ public class SessionImpl extends Abstrac
>     }
>
>     /**
> -     * Returns the node type instance handler for this session
> -     * @return the node type instance handler.
> -     */
> -    public NodeTypeInstanceHandler getNodeTypeInstanceHandler() {
> -        return ntInstanceHandler;
> -    }
> -
> -    /**
>      * Sets the named attribute. If the value is <code>null</code>, then
>      * the named attribute is removed.
>      *
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java?rev=985273&r1=985272&r2=985273&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java Fri Aug 13 16:36:56 2010
> @@ -18,15 +18,21 @@ package org.apache.jackrabbit.core.state
>
>  import org.apache.jackrabbit.core.id.ItemId;
>  import org.apache.jackrabbit.core.id.NodeId;
> +import org.apache.jackrabbit.core.value.InternalValue;
>  import org.apache.jackrabbit.spi.Name;
> +import org.apache.jackrabbit.spi.QPropertyDefinition;
> +import org.apache.jackrabbit.spi.commons.name.NameConstants;
>
>  import java.util.ArrayList;
> +import java.util.Calendar;
>  import java.util.Collections;
>  import java.util.HashSet;
>  import java.util.LinkedHashSet;
>  import java.util.List;
>  import java.util.Set;
>
> +import javax.jcr.RepositoryException;
> +
>  /**
>  * <code>NodeState</code> represents the state of a <code>Node</code>.
>  */
> @@ -862,6 +868,70 @@ public class NodeState extends ItemState
>     //-------------------------------------------------< misc. helper methods >
>
>     /**
> +     * Computes the values of well-known system (i.e. protected) properties.
> +     *
> +     * @param def the definition of the property to compute
> +     * @return the computed values
> +     */
> +    public InternalValue[] computeGeneratedValues(
> +            QPropertyDefinition def, String userId) {
> +        if (userId == null) {
> +            userId = "system";
> +        }
> +
> +        Name name = def.getName();
> +        Name declaringNT = def.getDeclaringNodeType();
> +
> +        if (NameConstants.JCR_UUID.equals(name)) {
> +            // jcr:uuid property of the mix:referenceable node type
> +            if (NameConstants.MIX_REFERENCEABLE.equals(declaringNT)) {
> +                return new InternalValue[]{InternalValue.create(getNodeId().toString())};
> +            }
> +        } else if (NameConstants.JCR_PRIMARYTYPE.equals(name)) {
> +            // jcr:primaryType property (of any node type)
> +            return new InternalValue[]{InternalValue.create(getNodeTypeName())};
> +        } else if (NameConstants.JCR_MIXINTYPES.equals(name)) {
> +            // jcr:mixinTypes property (of any node type)
> +            Set<Name> mixins = getMixinTypeNames();
> +            InternalValue[] values = new InternalValue[mixins.size()];
> +            int i = 0;
> +            for (Name n : mixins) {
> +                values[i++] = InternalValue.create(n);
> +            }
> +            return values;
> +        } else if (NameConstants.JCR_CREATED.equals(name)) {
> +            // jcr:created property of a version or a mix:created
> +            if (NameConstants.MIX_CREATED.equals(declaringNT)
> +                    || NameConstants.NT_VERSION.equals(declaringNT)) {
> +                return new InternalValue[]{InternalValue.create(Calendar.getInstance())};
> +            }
> +        } else if (NameConstants.JCR_CREATEDBY.equals(name)) {
> +            // jcr:createdBy property of a mix:created
> +            if (NameConstants.MIX_CREATED.equals(declaringNT)) {
> +                return new InternalValue[]{InternalValue.create(userId)};
> +            }
> +        } else if (NameConstants.JCR_LASTMODIFIED.equals(name)) {
> +            // jcr:lastModified property of a mix:lastModified
> +            if (NameConstants.MIX_LASTMODIFIED.equals(declaringNT)) {
> +                return new InternalValue[]{InternalValue.create(Calendar.getInstance())};
> +            }
> +        } else if (NameConstants.JCR_LASTMODIFIEDBY.equals(name)) {
> +            // jcr:lastModifiedBy property of a mix:lastModified
> +            if (NameConstants.MIX_LASTMODIFIED.equals(declaringNT)) {
> +                return new InternalValue[]{InternalValue.create(userId)};
> +            }
> +        } else if (NameConstants.JCR_ETAG.equals(name)) {
> +            // jcr:etag property of a mix:etag
> +            if (NameConstants.MIX_ETAG.equals(declaringNT)) {
> +                // TODO: provide real implementation
> +                return new InternalValue[]{InternalValue.create("")};
> +            }
> +        }
> +
> +        return null;
> +    }
> +
> +    /**
>      * {@inheritDoc}
>      */
>     public long calculateMemoryFootprint() {
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java?rev=985273&r1=985272&r2=985273&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java Fri Aug 13 16:36:56 2010
> @@ -21,8 +21,10 @@ import org.apache.jackrabbit.core.id.Nod
>  import org.apache.jackrabbit.core.id.ItemId;
>  import org.apache.jackrabbit.core.value.InternalValue;
>  import org.apache.jackrabbit.spi.Name;
> +import org.apache.jackrabbit.spi.QPropertyDefinition;
>
>  import javax.jcr.PropertyType;
> +import javax.jcr.RepositoryException;
>
>  /**
>  * <code>PropertyState</code> represents the state of a <code>Property</code>.
> @@ -185,6 +187,28 @@ public class PropertyState extends ItemS
>     }
>
>     /**
> +     * Sets the system-generated or node type -specified default values
> +     * of this property. If such values are not specified, then this property
> +     * is not modified.
> +     *
> +     * @param parent parent node state
> +     * @param def property definition
> +     * @param userId user identifier associated with the current session
> +     * @throws RepositoryException if the default values could not be created
> +     */
> +    public void setDefaultValues(
> +            NodeState parent, QPropertyDefinition def, String userId)
> +            throws RepositoryException {
> +        InternalValue[] values = parent.computeGeneratedValues(def, userId);
> +        if (values == null) {
> +            values = InternalValue.create(def.getDefaultValues());
> +        }
> +        if (values != null) {
> +            setValues(values);
> +        }
> +    }
> +
> +    /**
>      * Returns the value(s) of this property.
>      *
>      * @return the value(s) of this property.
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java?rev=985273&r1=985272&r2=985273&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java Fri Aug 13 16:36:56 2010
> @@ -651,8 +651,8 @@ abstract public class VersionManagerImpl
>                                               boolean useDefaultValues)
>             throws RepositoryException {
>         // compute system generated values if necessary
> -        InternalValue[] values = session.getNodeTypeInstanceHandler().
> -                computeSystemGeneratedPropertyValues(state.getState(), def);
> +        InternalValue[] values =
> +            state.getState().computeGeneratedValues(def, session.getUserID());
>         if (values == null && useDefaultValues) {
>             values = InternalValue.create(def.getDefaultValues());
>         }
>
>
>