Index: jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueFactory.java =================================================================== --- jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueFactory.java (revision 590729) +++ jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueFactory.java (working copy) @@ -114,4 +114,15 @@ * @throws IOException */ public QValue create(File value) throws RepositoryException, IOException; + + /** + * Given the QPropertyDefinition of an autocreated + * property, compute suitable values to be used in transient space until + * the newly created node gets saved. + * + * @param propertyDefinition definition of property for which values should be created + * @return computed value + * @throws RepositoryException + */ + public QValue[] computeAutoValues(QPropertyDefinition propertyDefinition) throws RepositoryException; } Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java =================================================================== --- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (revision 590729) +++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (working copy) @@ -712,32 +712,21 @@ // properties without default values Name declaringNT = def.getDeclaringNodeType(); Name name = def.getName(); - if (NameConstants.MIX_REFERENCEABLE.equals(declaringNT) && NameConstants.JCR_UUID.equals(name)) { - // mix:referenceable node type defines jcr:uuid - genValues = getQValues(parent.getUniqueID(), qValueFactory); - } else if (NameConstants.NT_BASE.equals(declaringNT)) { + if (NameConstants.NT_BASE.equals(declaringNT)) { // nt:base node type if (NameConstants.JCR_PRIMARYTYPE.equals(name)) { // jcr:primaryType property - genValues = new QValue[]{qValueFactory.create(parent.getNodeTypeName())}; + genValues = new QValue[]{qValueFactory.create(parent.getNodeTypeName())}; } else if (NameConstants.JCR_MIXINTYPES.equals(name)) { // jcr:mixinTypes property Name[] mixins = parent.getMixinTypeNames(); genValues = getQValues(mixins, qValueFactory); } - } else if (NameConstants.NT_HIERARCHYNODE.equals(declaringNT) && NameConstants.JCR_CREATED.equals(name)) { - // nt:hierarchyNode node type defines jcr:created property - genValues = new QValue[]{qValueFactory.create(Calendar.getInstance())}; - } else if (NameConstants.NT_RESOURCE.equals(declaringNT) && NameConstants.JCR_LASTMODIFIED.equals(name)) { - // nt:resource node type defines jcr:lastModified property - genValues = new QValue[]{qValueFactory.create(Calendar.getInstance())}; - } else if (NameConstants.NT_VERSION.equals(declaringNT) && NameConstants.JCR_CREATED.equals(name)) { - // nt:version node type defines jcr:created property - genValues = new QValue[]{qValueFactory.create(Calendar.getInstance())}; - } else { - // TODO: TOBEFIXED. other nodetype -> build some default value - log.warn("Missing implementation. Nodetype " + def.getDeclaringNodeType() + " defines autocreated property " + def.getName() + " without default value."); } + else { + // ask the SPI implementation for advice + genValues = qValueFactory.computeAutoValues(def); + } } return genValues; } @@ -756,9 +745,6 @@ } private static QValue[] getQValues(String uniqueID, QValueFactory factory) throws RepositoryException { - if (uniqueID == null) { - uniqueID = UUID.randomUUID().toString(); - } return new QValue[] {factory.create(uniqueID, PropertyType.STRING)}; } }