/*
* 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.jackrabbit.core;
import java.util.Calendar;
import java.util.Set;
import javax.jcr.RepositoryException;
import org.apache.jackrabbit.core.state.NodeState;
import org.apache.jackrabbit.core.state.PropertyState;
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;
/**
* The <code>NodeTypeInstanceHandler</code> is used to provide or initialize
* system protected properties (or child nodes).
*
*/
public class NodeTypeInstanceHandler {
/**
* Default user id in the case where the creating user cannot be determined.
*/
public static final String DEFAULT_USERID = "system";
/**
* userid to use for the "*By" autocreated properties
*/
private final String userId;
/**
* Creates a new node type instance handler.
* @param userId the user id. if <code>null</code>, {@value #DEFAULT_USERID} is used.
*/
public NodeTypeInstanceHandler(String userId) {
this.userId = userId == null
? DEFAULT_USERID
: userId;
}
/**
* Sets the system-generated or node type -specified default values
* of the given property. If such values are not specified, then the
* property is not modified.
*
* @param property property state
* @param parent parent node state
* @param def property definition
* @throws RepositoryException if the default values could not be created
*/
public void setDefaultValues(
PropertyState property, NodeState parent, QPropertyDefinition def)
throws RepositoryException {
InternalValue[] values =
computeSystemGeneratedPropertyValues(parent, def);
if (values == null && def.getDefaultValues() != null) {
values = InternalValue.create(def.getDefaultValues());
}
if (values != null) {
property.setValues(values);
}
}
/**
* Computes the values of well-known system (i.e. protected) properties.
*
* @param parent the parent node state
* @param def the definition of the property to compute
* @return the computed values
*/
public InternalValue[] computeSystemGeneratedPropertyValues(NodeState parent,
QPropertyDefinition def) {
InternalValue[] genValues = null;
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)) {
genValues = new InternalValue[]{InternalValue.create(parent.getNodeId().toString())};
}
} else if (NameConstants.JCR_PRIMARYTYPE.equals(name)) {
// jcr:primaryType property (of any node type)
genValues = new InternalValue[]{InternalValue.create(parent.getNodeTypeName())};
} else if (NameConstants.JCR_MIXINTYPES.equals(name)) {
// jcr:mixinTypes property (of any node type)
Set<Name> mixins = parent.getMixinTypeNames();
genValues = new InternalValue[mixins.size()];
int i = 0;
for (Name n : mixins) {
genValues[i++] = InternalValue.create(n);
}
} 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)) {
genValues = 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)) {
genValues = 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)) {
genValues = 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)) {
genValues = 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
genValues = new InternalValue[]{InternalValue.create("")};
}
}
return genValues;
}
}