/**
  * creates a node state for the given property def
  *
  * @param parent
  * @param propDef
  * @return
  * @throws RepositoryException
  */
 private VirtualNodeState createPropertyDefState(
     VirtualNodeState parent, QPropertyDefinition propDef, QNodeTypeDefinition ntDef, int n)
     throws RepositoryException {
   NodeId id =
       calculateStableId(
           ntDef.getName().toString()
               + "/"
               + NameConstants.JCR_PROPERTYDEFINITION.toString()
               + "/"
               + n);
   VirtualNodeState pState =
       createNodeState(
           parent, NameConstants.JCR_PROPERTYDEFINITION, id, NameConstants.NT_PROPERTYDEFINITION);
   // add properties
   if (!propDef.definesResidual()) {
     pState.setPropertyValue(NameConstants.JCR_NAME, InternalValue.create(propDef.getName()));
   }
   pState.setPropertyValue(
       NameConstants.JCR_AUTOCREATED, InternalValue.create(propDef.isAutoCreated()));
   pState.setPropertyValue(
       NameConstants.JCR_MANDATORY, InternalValue.create(propDef.isMandatory()));
   pState.setPropertyValue(
       NameConstants.JCR_ONPARENTVERSION,
       InternalValue.create(OnParentVersionAction.nameFromValue(propDef.getOnParentVersion())));
   pState.setPropertyValue(
       NameConstants.JCR_PROTECTED, InternalValue.create(propDef.isProtected()));
   pState.setPropertyValue(NameConstants.JCR_MULTIPLE, InternalValue.create(propDef.isMultiple()));
   pState.setPropertyValue(
       NameConstants.JCR_REQUIREDTYPE,
       InternalValue.create(PropertyType.nameFromValue(propDef.getRequiredType()).toUpperCase()));
   InternalValue[] defVals = InternalValue.create(propDef.getDefaultValues());
   // retrieve the property type from the first default value present with
   // the property definition. in case no default values are defined,
   // fallback to PropertyType.STRING in order to avoid creating a property
   // with type UNDEFINED which is illegal.
   int defValsType = PropertyType.STRING;
   if (defVals != null && defVals.length > 0) {
     defValsType = defVals[0].getType();
   }
   if (defVals != null) {
     pState.setPropertyValues(NameConstants.JCR_DEFAULTVALUES, defValsType, defVals);
   }
   QValueConstraint[] vc = propDef.getValueConstraints();
   InternalValue[] vals = new InternalValue[vc.length];
   for (int i = 0; i < vc.length; i++) {
     vals[i] = InternalValue.create(vc[i].getString());
   }
   pState.setPropertyValues(NameConstants.JCR_VALUECONSTRAINTS, PropertyType.STRING, vals);
   return pState;
 }
 /**
  * Create a new JCR property definition from the given <code>QPropertyDefinition</code>.
  *
  * @param qPd A SPI property definition.
  * @return the corresponding JCR property definition.
  * @throws RepositoryException if an error occurs.
  */
 public PropertyDefinition create(QPropertyDefinition qPd) throws RepositoryException {
   PropertyDefinitionTemplate pt = ntMgr.createPropertyDefinitionTemplate();
   pt.setName(getJCRName(qPd.getName()));
   pt.setAutoCreated(qPd.isAutoCreated());
   pt.setMandatory(qPd.isMandatory());
   pt.setOnParentVersion(qPd.getOnParentVersion());
   pt.setProtected(qPd.isProtected());
   pt.setRequiredType(qPd.getRequiredType());
   pt.setMultiple(qPd.isMultiple());
   pt.setFullTextSearchable(qPd.isFullTextSearchable());
   pt.setValueConstraints(
       createValueConstraints(qPd.getRequiredType(), qPd.getValueConstraints()));
   pt.setAvailableQueryOperators(qPd.getAvailableQueryOperators());
   pt.setQueryOrderable(qPd.isQueryOrderable());
   pt.setDefaultValues(createValues(qPd.getDefaultValues()));
   return pt;
 }