/* * Copyright (c) 2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * 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.wso2.carbon.registry.jcr.util.nodetype.xml; import org.apache.axiom.om.OMElement; import org.jaxen.JaxenException; import org.wso2.carbon.registry.jcr.RegistryValue; import org.wso2.carbon.registry.jcr.nodetype.RegistryNodeDefinitionTemplate; import org.wso2.carbon.registry.jcr.nodetype.RegistryPropertyDefinitionTemplate; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.nodetype.*; import javax.jcr.query.qom.QueryObjectModelConstants; import javax.jcr.version.OnParentVersionAction; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class NodeTypeReader { NodeTypeManager nodeTypeManager; NodeTypeTemplate nodeTypeTemplate; public NodeTypeReader(NodeTypeManager nodeTypeManager) { this.nodeTypeManager = nodeTypeManager; } private void buildSupertypes(OMElement omElement) throws ConstraintViolationException { Iterator supertypeIt = omElement.getChildrenWithLocalName("supertypes"); while (supertypeIt.hasNext()) { //one time process OMElement supertypes = (OMElement) supertypeIt.next(); Iterator it1 = supertypes.getChildrenWithLocalName("supertype"); List<String> superTypeList = new ArrayList<String>(); while (it1.hasNext()) { superTypeList.add(((OMElement) it1.next()).getText()); //super types } nodeTypeTemplate.setDeclaredSuperTypeNames(superTypeList.toArray(new String[0])); } } private void buildChildNodeDefs(OMElement omElement) throws RepositoryException { Iterator cndIt = omElement.getChildrenWithLocalName("childNodeDefinition"); while (cndIt.hasNext()) { NodeDefinitionTemplate nodeDefinitionTemplate = nodeTypeManager.createNodeDefinitionTemplate(); OMElement childDefs = (OMElement) cndIt.next(); nodeDefinitionTemplate.setName(getAttrValue("name", childDefs)); // TODO should validate * nodeDefinitionTemplate.setAutoCreated(Boolean.valueOf(getAttrValue("autoCreated", childDefs))); nodeDefinitionTemplate.setMandatory(Boolean.valueOf(getAttrValue("mandatory", childDefs))); nodeDefinitionTemplate.setProtected(Boolean.valueOf(getAttrValue("protected", childDefs))); nodeDefinitionTemplate.setOnParentVersion(OnParentVersionAction.valueFromName(getAttrValue("onParentVersion", childDefs))); nodeDefinitionTemplate.setSameNameSiblings(Boolean.valueOf(getAttrValue("sameNameSiblings", childDefs))); String dpt = getAttrValue("defaultPrimaryType", childDefs); // check value length >0 if (dpt != null && dpt.length() > 0) { nodeDefinitionTemplate.setDefaultPrimaryTypeName(dpt); } Iterator reqPriTypesIt = childDefs.getChildrenWithLocalName("requiredPrimaryTypes"); while (reqPriTypesIt.hasNext()) { //one time OMElement supertypes = (OMElement) reqPriTypesIt.next(); Iterator supertype = supertypes.getChildrenWithLocalName("requiredPrimaryType"); List<String> rptList = new ArrayList<String>(); while (supertype.hasNext()) { rptList.add(((OMElement) supertype.next()).getText()); // requiredPrimaryType } nodeDefinitionTemplate.setRequiredPrimaryTypeNames(rptList.toArray(new String[0])); } ((RegistryNodeDefinitionTemplate) nodeDefinitionTemplate). setDeclaringNodeTypeName(nodeTypeTemplate.getName()); nodeTypeTemplate.getNodeDefinitionTemplates().add(nodeDefinitionTemplate); } } private String getAttrValue(String key, OMElement omElement) { if ((omElement.getAttribute(new QName(key)) != null) && !"".equals(omElement.getAttribute(new QName(key)).getAttributeValue())) { return omElement.getAttribute(new QName(key)).getAttributeValue(); } else { return null; } } private void buildPropertyDefs(OMElement omElement) throws RepositoryException { Iterator iterator = omElement.getChildrenWithName(new QName("propertyDefinition")); while (iterator.hasNext()) { PropertyDefinitionTemplate propertyDefinitionTemplate = nodeTypeManager.createPropertyDefinitionTemplate(); OMElement child = (OMElement) iterator.next(); propertyDefinitionTemplate.setName( getAttrValue("name", child)); propertyDefinitionTemplate.setAutoCreated(Boolean.valueOf( getAttrValue("autoCreated", child))); propertyDefinitionTemplate.setMandatory(Boolean.valueOf( getAttrValue("mandatory", child))); propertyDefinitionTemplate.setProtected(Boolean.valueOf( getAttrValue("protected", child))); propertyDefinitionTemplate.setOnParentVersion(OnParentVersionAction. valueFromName(getAttrValue("onParentVersion", child))); propertyDefinitionTemplate.setMultiple(Boolean.valueOf( getAttrValue("multiple", child))); propertyDefinitionTemplate.setFullTextSearchable(Boolean.valueOf( getAttrValue("isFullTextSearchable", child))); propertyDefinitionTemplate.setQueryOrderable(Boolean.valueOf( getAttrValue("isQueryOrderable", child))); String aqop = getAttrValue("availableQueryOperators", child); if (aqop != null && aqop.length() > 0) { String[] ops = aqop.split(" "); List<String> queryOpt = new ArrayList<String>(); for (String op1 : ops) { String opt = op1.trim(); if (opt.equals(Constants.EQ_ENTITY)) { queryOpt.add(QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO); } else if (opt.equals(Constants.NE_ENTITY)) { queryOpt.add(QueryObjectModelConstants.JCR_OPERATOR_NOT_EQUAL_TO); } else if (opt.equals(Constants.LT_ENTITY)) { queryOpt.add(QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN); } else if (opt.equals(Constants.LE_ENTITY)) { queryOpt.add(QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN_OR_EQUAL_TO); } else if (opt.equals(Constants.GT_ENTITY)) { queryOpt.add(QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN); } else if (opt.equals(Constants.GE_ENTITY)) { queryOpt.add(QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN_OR_EQUAL_TO); } else if (opt.equals(Constants.LIKE_ENTITY)) { queryOpt.add(QueryObjectModelConstants.JCR_OPERATOR_LIKE); } else { throw new NoSuchNodeTypeException("Not a valid query operator" + op1); } } propertyDefinitionTemplate.setAvailableQueryOperators( queryOpt.toArray(new String[0])); } propertyDefinitionTemplate.setRequiredType(PropertyType.valueFromName( getAttrValue("requiredType", child))); String valueConstraints = getAttrValue("valueConstraints", child); if (valueConstraints != null) { // Values should put inside [] String tmp = valueConstraints.substring(1, valueConstraints.length() - 1); String s[] = tmp.split(","); propertyDefinitionTemplate.setValueConstraints(s); } String defaultValues = getAttrValue("defaultValues", child); if ((defaultValues != null) && (!"".equals(defaultValues))) { // should put inside [] String tmp = defaultValues.substring(1, defaultValues.length() - 1); String s[] = tmp.split(","); Value[] values = new Value[s.length]; for (int i = 0; i < s.length; i++) { // Creates an array of Value instances values[i] = new RegistryValue(s[i]); } propertyDefinitionTemplate.setDefaultValues(values); } ((RegistryPropertyDefinitionTemplate) propertyDefinitionTemplate). setDeclaringNodeTypeName(nodeTypeTemplate.getName()); // TODO support following additionally // <valueConstraints> <valueConstraint/> </valueConstraints> // <defaultValues> <defaultValues/> </defaultValues> nodeTypeTemplate.getPropertyDefinitionTemplates().add(propertyDefinitionTemplate); } } public NodeTypeTemplate buildNodeType(OMElement omElement) throws JaxenException, RepositoryException { nodeTypeTemplate = nodeTypeManager.createNodeTypeTemplate(); nodeTypeTemplate.setName(getAttrValue("name", omElement)); nodeTypeTemplate.setMixin(Boolean.valueOf(getAttrValue("isMixin", omElement))); nodeTypeTemplate.setOrderableChildNodes(Boolean.valueOf(getAttrValue("hasOrderableChildNodes", omElement))); nodeTypeTemplate.setAbstract(Boolean.valueOf(getAttrValue("isAbstract", omElement))); nodeTypeTemplate.setQueryable(Boolean.valueOf(getAttrValue("isQueryable", omElement))); nodeTypeTemplate.setPrimaryItemName(getAttrValue("primaryItemName", omElement)); buildSupertypes(omElement); buildChildNodeDefs(omElement); buildPropertyDefs(omElement); // System.out.println(omElement.toString()); return nodeTypeTemplate; } }