blob: 4431f38e52efe0cc2471d3bc99a694fb19933ee8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. 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.xml.nodetype;
import java.util.LinkedList;
import java.util.List;
import javax.jcr.PropertyType;
import javax.jcr.version.OnParentVersionAction;
import org.apache.jackrabbit.name.IllegalNameException;
import org.apache.jackrabbit.name.QName;
import org.apache.jackrabbit.name.UnknownPrefixException;
import org.apache.jackrabbit.state.nodetype.NodeDefinitionState;
import org.apache.jackrabbit.state.nodetype.NodeTypeManagerState;
import org.apache.jackrabbit.state.nodetype.NodeTypeState;
import org.apache.jackrabbit.state.nodetype.PropertyDefinitionState;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* TODO
*/
class NodeTypeXMLReader extends DefaultHandler {
private StringBuffer buffer;
private SAXNamespaceResolver resolver;
private NodeTypeManagerState nodeTypeManagerState;
private List nodeTypeStates;
private NodeTypeState nodeTypeState;
private List supertypeNames;
private List propertyDefinitionStates;
private PropertyDefinitionState propertyDefinitionState;
private List defaultValues;
private List valueConstraints;
private List childNodeDefinitionStates;
private NodeDefinitionState childNodeDefinitionState;
private List requiredPrimaryTypeNames;
public NodeTypeManagerState getNodeTypeManagerState() {
return nodeTypeManagerState;
}
public void startDocument() {
buffer = new StringBuffer();
resolver = new SAXNamespaceResolver();
resolver.startDocument();
nodeTypeManagerState = new NodeTypeManagerState();
}
public void endDocument() {
resolver.endDocument();
}
public void startPrefixMapping(String prefix, String uri) {
resolver.startPrefixMapping(prefix, uri);
}
public void endPrefixMapping(String prefix) {
resolver.endPrefixMapping(prefix);
}
/** {@inheritDoc} */
public void startElement(
String uri, String localName, String qName, Attributes attributes)
throws SAXException {
buffer.setLength(0);
if (uri == null || uri.length() == 0) {
System.out.println("<" + localName + ">");
if (localName.equals("nodeTypes")) {
nodeTypeStates = new LinkedList();
} else if (localName.equals("nodeType")) {
nodeTypeState = getNodeTypeState(attributes);
supertypeNames = new LinkedList();
propertyDefinitionStates = new LinkedList();
childNodeDefinitionStates = new LinkedList();
} else if (localName.equals("supertypes")) {
} else if (localName.equals("supertype")) {
} else if (localName.equals("propertyDefinition")) {
propertyDefinitionState = getPropertyDefinitionState(attributes);
} else if (localName.equals("valueConstraints")) {
} else if (localName.equals("valueConstraint")) {
} else if (localName.equals("defaultValues")) {
} else if (localName.equals("defaultValue")) {
} else if (localName.equals("childNodeDefinition")) {
childNodeDefinitionState = getNodeDefinitionState(attributes);
} else if (localName.equals("requiredPrimaryTypes")) {
requiredPrimaryTypeNames = new LinkedList();
} else if (localName.equals("requiredPrimaryType")) {
} else {
throw new SAXException("Unknown element: " + localName);
}
}
resolver.startElement();
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
resolver.endElement();
if (uri == null || uri.length() == 0) {
System.out.println("</" + localName + ">");
if (localName.equals("nodeTypes")) {
nodeTypeManagerState.setNodeTypeStates((NodeTypeState[])
nodeTypeStates.toArray(new NodeTypeState[nodeTypeStates.size()]));
} else if (localName.equals("nodeType")) {
nodeTypeState.setSupertypeNames((QName[])
supertypeNames.toArray(new QName[supertypeNames.size()]));
nodeTypeState.setPropertyDefinitionStates((PropertyDefinitionState[])
propertyDefinitionStates.toArray(new PropertyDefinitionState[propertyDefinitionStates.size()]));
nodeTypeState.setChildNodeDefinitionStates((NodeDefinitionState[])
childNodeDefinitionStates.toArray(new NodeDefinitionState[childNodeDefinitionStates.size()]));
nodeTypeStates.add(nodeTypeState);
} else if (localName.equals("supertypes")) {
} else if (localName.equals("supertype")) {
supertypeNames.add(getName());
} else if (localName.equals("propertyDefinition")) {
propertyDefinitionStates.add(propertyDefinitionState);
} else if (localName.equals("valueConstraints")) {
} else if (localName.equals("valueConstraint")) {
} else if (localName.equals("defaultValues")) {
} else if (localName.equals("defaultValue")) {
} else if (localName.equals("childNodeDefinition")) {
childNodeDefinitionStates.add(childNodeDefinitionState);
} else if (localName.equals("requiredPrimaryTypes")) {
childNodeDefinitionState.setRequiredPrimaryTypeName((QName[])
requiredPrimaryTypeNames.toArray(new QName[requiredPrimaryTypeNames.size()]));
} else if (localName.equals("requiredPrimaryType")) {
requiredPrimaryTypeNames.add(getName());
} else {
throw new SAXException("Unknown element: " + localName);
}
}
buffer.setLength(0);
}
public void characters(char[] ch, int start, int length) {
buffer.append(ch, start, length);
}
public NodeTypeState getNodeTypeState(Attributes attributes) throws SAXException {
NodeTypeState state = new NodeTypeState();
state.setName(getName(attributes, "name"));
if (getValue(attributes, "primaryItemName").length() > 0) {
state.setPrimaryItemName(getName(attributes, "primaryItemName"));
}
state.setMixin(getBoolean(attributes, "isMixin"));
state.setHasOrderableChildNodes(getBoolean(attributes, "hasOrderableChildNodes"));
return state;
}
public NodeDefinitionState getNodeDefinitionState(Attributes attributes) throws SAXException {
NodeDefinitionState state = new NodeDefinitionState();
if (!getValue(attributes, "name").equals("*")) {
state.setName(getName(attributes, "name"));
}
if (getValue(attributes, "defaultPrimaryType").length() > 0) {
state.setDefaultPrimaryTypeName(getName(attributes, "defaultPrimaryType"));
}
state.setAutoCreated(getBoolean(attributes, "autoCreated"));
state.setMandatory(getBoolean(attributes, "mandatory"));
state.setOnParentVersion(OnParentVersionAction.valueFromName(getValue(attributes, "onParentVersion")));
state.setProtected(getBoolean(attributes, "protected"));
state.setAllowsSameNameSiblings(getBoolean(attributes, "sameNameSiblings"));
return state;
}
private PropertyDefinitionState getPropertyDefinitionState(Attributes attributes) throws SAXException {
PropertyDefinitionState state = new PropertyDefinitionState();
if (!getValue(attributes, "name").equals("*")) {
state.setName(getName(attributes, "name"));
}
state.setRequiredType(PropertyType.valueFromName(getValue(attributes, "requiredType")));
state.setAutoCreated(getBoolean(attributes, "autoCreated"));
state.setMandatory(getBoolean(attributes, "mandatory"));
state.setOnParentVersion(OnParentVersionAction.valueFromName(getValue(attributes, "onParentVersion")));
state.setProtected(getBoolean(attributes, "protected"));
state.setMultiple(getBoolean(attributes, "multiple"));
return state;
}
private QName getName() throws SAXException {
String value = buffer.toString();
try {
return QName.fromJCRName(value, resolver);
} catch (UnknownPrefixException e) {
throw new SAXException("Unknown prefix: " + value, e);
} catch (IllegalNameException e) {
throw new SAXException("Illegal name: " + value, e);
}
}
private String getValue(Attributes attributes, String name) throws SAXException {
String value = attributes.getValue("", name);
if (value != null) {
return value;
} else {
throw new SAXException("Required attribute " + name + " not found");
}
}
private QName getName(Attributes attributes, String name) throws SAXException {
String value = getValue(attributes, name);
try {
return QName.fromJCRName(value, resolver);
} catch (UnknownPrefixException e) {
throw new SAXException("Unknown prefix: " + value, e);
} catch (IllegalNameException e) {
throw new SAXException("Illegal name: " + value, e);
}
}
private boolean getBoolean(Attributes attributes, String name)
throws SAXException {
String value = getValue(attributes, name);
return Boolean.valueOf(value).booleanValue();
}
}