/*
* ModeShape (http://www.modeshape.org)
*
* Licensed 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.modeshape.jcr;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.ItemDefinition;
import javax.jcr.nodetype.NodeType;
import javax.jcr.version.OnParentVersionAction;
import org.modeshape.common.annotation.NotThreadSafe;
import org.modeshape.jcr.value.Name;
import org.modeshape.jcr.value.NamespaceRegistry;
import org.modeshape.jcr.value.Path;
import org.modeshape.jcr.value.Path.Segment;
import org.modeshape.jcr.value.ValueFormatException;
/**
* ModeShape convenience implementation to support the JCR 2 NodeDefinitionTemplate and PropertyDefinitionTemplate classes.
*/
@NotThreadSafe
abstract class JcrItemDefinitionTemplate implements ItemDefinition {
protected static void registerMissingNamespaces( ExecutionContext originalContext,
ExecutionContext newContext,
Path path ) {
for (Segment segment : path) {
registerMissingNamespaces(originalContext, newContext, segment.getName());
}
}
protected static void registerMissingNamespaces( ExecutionContext originalContext,
ExecutionContext newContext,
Name... names ) {
if (names == null) return;
NamespaceRegistry newRegistry = newContext.getNamespaceRegistry();
NamespaceRegistry originalRegistry = originalContext.getNamespaceRegistry();
for (Name name : names) {
if (name != null) {
String uri = name.getNamespaceUri();
if (!newRegistry.isRegisteredNamespaceUri(uri)) {
String prefix = originalRegistry.getPrefixForNamespaceUri(uri, false);
newRegistry.register(prefix, uri);
}
}
}
}
private final ExecutionContext context;
private boolean autoCreated = false;
private boolean mandatory = false;
private boolean isProtected = false;
private Name name;
private int onParentVersion = OnParentVersionAction.COPY;
JcrItemDefinitionTemplate( ExecutionContext context ) {
assert context != null;
this.context = context;
}
JcrItemDefinitionTemplate( JcrItemDefinitionTemplate original,
ExecutionContext context ) {
this.context = context;
this.autoCreated = original.autoCreated;
this.mandatory = original.mandatory;
this.isProtected = original.isProtected;
this.name = original.name;
this.onParentVersion = original.onParentVersion;
JcrItemDefinitionTemplate.registerMissingNamespaces(original.context, context, this.name);
}
ExecutionContext getExecutionContext() {
return context;
}
@Override
public NodeType getDeclaringNodeType() {
return null;
}
@Override
public String getName() {
if (name == null) return null;
return name.getString(context.getNamespaceRegistry());
}
@Override
public int getOnParentVersion() {
return onParentVersion;
}
@Override
public boolean isAutoCreated() {
return autoCreated;
}
@Override
public boolean isMandatory() {
return mandatory;
}
@Override
public boolean isProtected() {
return isProtected;
}
public ExecutionContext getContext() {
return context;
}
public void setAutoCreated( boolean autoCreated ) {
this.autoCreated = autoCreated;
}
public void setMandatory( boolean mandatory ) {
this.mandatory = mandatory;
}
public void setProtected( boolean isProtected ) {
this.isProtected = isProtected;
}
public void setName( String name ) throws ConstraintViolationException {
if (name == null) {
throw new ConstraintViolationException();
}
try {
this.name = context.getValueFactories().getNameFactory().create(name);
} catch (ValueFormatException vfe) {
throw new ConstraintViolationException(vfe);
}
}
public void setOnParentVersion( int onParentVersion ) {
assert onParentVersion == OnParentVersionAction.ABORT || onParentVersion == OnParentVersionAction.COMPUTE
|| onParentVersion == OnParentVersionAction.COPY || onParentVersion == OnParentVersionAction.IGNORE
|| onParentVersion == OnParentVersionAction.INITIALIZE || onParentVersion == OnParentVersionAction.VERSION;
this.onParentVersion = onParentVersion;
}
@Override
public String toString() {
return getName();
}
}