예제 #1
0
  /**
   * Get a map of the sites custom properties
   *
   * @return map of names and values
   */
  public ScriptableQNameMap<String, CustomProperty> getCustomProperties() {
    if (this.customProperties == null) {
      // create the custom properties map
      ScriptNode siteNode = new ScriptNode(this.siteInfo.getNodeRef(), this.serviceRegistry);
      // set the scope, for use when converting props to javascript objects
      siteNode.setScope(scope);
      this.customProperties =
          new ContentAwareScriptableQNameMap<String, CustomProperty>(
              siteNode, this.serviceRegistry);

      Map<QName, Serializable> props = siteInfo.getCustomProperties();
      for (QName qname : props.keySet()) {
        // get the property value
        Serializable propValue = props.get(qname);

        // convert the value
        NodeValueConverter valueConverter = siteNode.new NodeValueConverter();
        Serializable value = valueConverter.convertValueForScript(qname, propValue);

        // get the type and label information from the dictionary
        String title = null;
        String type = null;
        PropertyDefinition propDef = this.serviceRegistry.getDictionaryService().getProperty(qname);
        if (propDef != null) {
          type = propDef.getDataType().getName().toString();
          title = propDef.getTitle(this.serviceRegistry.getDictionaryService());
        }

        // create the custom property and add to the map
        CustomProperty customProp = new CustomProperty(qname.toString(), value, type, title);
        this.customProperties.put(qname.toString(), customProp);
      }
    }
    return this.customProperties;
  }
  public Map<PropertyDefinition, Object> generateDatasProperties(
      ClassDefinition type, Collection<PropertyDefinition> properties) throws Exception {
    Map<PropertyDefinition, Object> datasProperties = new HashMap<PropertyDefinition, Object>();

    Collection<PropertyDefinition> unicityProperties =
        generatorServices.getUnicityProperties(type, properties);

    Collection<PropertyDefinition> tempProperties = new ArrayList<PropertyDefinition>();
    tempProperties.addAll(properties);
    tempProperties.removeAll(unicityProperties);
    for (PropertyDefinition propertyDefinition : tempProperties) {
      if (!propertyDefinition.getName().getNamespaceURI().contains("alfresco")) {
        startAttributeIndex = 0;
        datasProperties.put(propertyDefinition, generateDatasProperty(propertyDefinition));
      }
    }

    if (unicityProperties.size() > 0) {
      startAttributeIndex = savedStartIndexAttribute.intValue();
      Map<PropertyDefinition, Object> dataUnicityProperties =
          generateDataForUnicityProperties(type, unicityProperties);
      if (dataUnicityProperties.size() > 0) {
        datasProperties.putAll(dataUnicityProperties);
      }
    }

    return datasProperties;
  }
 static String generateRandomString(String defaultValue, PropertyDefinition property) {
   String data = null;
   if (scenario.equals("random")) {
     if (defaultValue != null) {
       data = defaultValue + "_" + Integer.valueOf(randomGenerator.nextInt()).toString();
     } else {
       String[] parts = property.getName().toString().split("_");
       String propertyName = parts[parts.length - 1];
       data =
           propertyName.substring(0, propertyName.length() / 2)
               + "_"
               + Integer.valueOf(randomGenerator.nextInt()).toString();
     }
   } else if (scenario.equals("incremental")) {
     if (defaultValue != null) {
       data = defaultValue + "_" + Integer.valueOf(index.get(typeRef).get(property)).toString();
     } else {
       String[] parts = property.getName().toString().split("_");
       String propertyName = parts[parts.length - 1];
       data =
           propertyName.substring(0, propertyName.length() / 2)
               + "_"
               + Integer.valueOf(index.get(typeRef).get(property)).toString();
     }
   }
   return data;
 }
 private Map<PropertyDefinition, Object> generateDataForUnicityProperties(
     ClassDefinition type, Collection<PropertyDefinition> unicityProperties) throws Exception {
   Collection<Serial> dataProperties = new ArrayList<Serial>();
   boolean same = true;
   while (same) {
     dataProperties.clear();
     for (PropertyDefinition propertyDefinition : unicityProperties) {
       dataProperties.add(
           new Serial(
               type.getName().toString(),
               propertyDefinition.getName().toString(),
               generateDatasProperty(propertyDefinition)));
     }
     if (serializedData.size() > 0 && unicityProperties.size() > 0) {
       for (Serial dataProperty : dataProperties) {
         boolean contains = false;
         for (Serial serializedDataProperty : serializedData) {
           if (dataProperty.getType().equals(serializedDataProperty.getType())
               && dataProperty.getProperty().equals(serializedDataProperty.getProperty())
               && dataProperty
                   .getData()
                   .toString()
                   .equals(serializedDataProperty.getData().toString())) {
             contains = true;
           }
         }
         same &= contains;
       }
     } else {
       same = false;
     }
   }
   Map<PropertyDefinition, Object> finalDataProperties = new HashMap<PropertyDefinition, Object>();
   for (Serial dataProperty : dataProperties) {
     PropertyDefinition property =
         service.getProperty(QName.createQName(dataProperty.getProperty()));
     finalDataProperties.put(property, dataProperty.getData());
   }
   return finalDataProperties;
 }
예제 #5
0
  /* (non-Javadoc)
   * @see org.alfresco.service.cmr.view.Exporter#value(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName, java.io.Serializable)
   */
  public void value(NodeRef nodeRef, QName property, Object value, int index) {
    try {
      // determine data type of value
      QName valueDataType = null;
      PropertyDefinition propDef = dictionaryService.getProperty(property);
      DataTypeDefinition dataTypeDef = (propDef == null) ? null : propDef.getDataType();
      if (dataTypeDef == null || dataTypeDef.getName().equals(DataTypeDefinition.ANY)) {
        dataTypeDef = (value == null) ? null : dictionaryService.getDataType(value.getClass());
        if (dataTypeDef != null) {
          valueDataType = dataTypeDef.getName();
        }
      }

      // convert node references to paths
      if (value instanceof NodeRef && referenceType.equals(ReferenceType.PATHREF)) {
        NodeRef valueNodeRef = (NodeRef) value;
        if (nodeRef.getStoreRef().equals(valueNodeRef.getStoreRef())) {
          Path nodeRefPath = createPath(context.getExportOf(), nodeRef, valueNodeRef);
          value = (nodeRefPath == null) ? null : nodeRefPath.toPrefixString(namespaceService);
        }
      }

      // output value wrapper if value is null or property data type is ANY or value is part of
      // collection
      if (value == null || valueDataType != null || index != -1) {
        AttributesImpl attrs = new AttributesImpl();
        if (value == null) {
          attrs.addAttribute(
              NamespaceService.REPOSITORY_VIEW_PREFIX,
              ISNULL_LOCALNAME,
              ISNULL_QNAME.toPrefixString(),
              null,
              "true");
        }
        if (valueDataType != null) {
          attrs.addAttribute(
              NamespaceService.REPOSITORY_VIEW_PREFIX,
              DATATYPE_LOCALNAME,
              DATATYPE_QNAME.toPrefixString(),
              null,
              toPrefixString(valueDataType));
        }
        contentHandler.startElement(
            NamespaceService.REPOSITORY_VIEW_PREFIX,
            VALUE_LOCALNAME,
            toPrefixString(VALUE_QNAME),
            attrs);
      }

      // output value
      String strValue = (String) DefaultTypeConverter.INSTANCE.convert(String.class, value);
      if (strValue != null) {
        for (int i = 0; i < strValue.length(); i++) {
          char[] temp = new char[] {strValue.charAt(i)};
          contentHandler.characters(temp, 0, 1);
        }
      }

      // output value wrapper if property data type is any
      if (value == null || valueDataType != null || index != -1) {
        contentHandler.endElement(
            NamespaceService.REPOSITORY_VIEW_PREFIX, VALUE_LOCALNAME, toPrefixString(VALUE_QNAME));
      }
    } catch (SAXException e) {
      throw new ExporterException(
          "Failed to process value event - nodeRef "
              + nodeRef
              + "; property "
              + toPrefixString(property)
              + "; value "
              + value,
          e);
    }
  }
예제 #6
0
  /*
   *  (non-Javadoc)
   * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
   */
  public void startElement(String uri, String localName, String qName, Attributes atts)
      throws SAXException {
    try {
      // construct qname for element
      QName elementName = decodeQName(QName.createQName(qName, importResolver));

      // setup parent context
      ParentContext parentContext = null;
      if (contextStack.empty()) {
        // create root parent context
        parentContext = new ParentContext(elementName, dictionaryService, importer);
      } else {
        // create parent context
        NodeContext parentNode = (NodeContext) contextStack.peek();
        parentContext = new ParentContext(elementName, parentNode);
      }

      // create node context
      NodeContext node = new NodeContext(elementName, parentContext, null);
      node.setChildName(elementName.toPrefixString(importResolver));
      contextStack.push(node);

      // process node properties
      for (int i = 0; i < atts.getLength(); i++) {
        QName propName = decodeQName(QName.createQName(atts.getURI(i), atts.getLocalName(i)));
        String value = atts.getValue(i);

        //
        // process "well-known" properties
        //

        if (propName.equals(JCRPrimaryTypeProperty.PROPERTY_NAME)) {
          // primary type
          QName primaryTypeQName = QName.createQName(value, importResolver);
          TypeDefinition typeDef = dictionaryService.getType(primaryTypeQName);
          if (typeDef == null) {
            throw new InvalidTypeException(primaryTypeQName);
          }
          node.setTypeDefinition(typeDef);
        } else if (propName.equals(JCRMixinTypesProperty.PROPERTY_NAME)) {
          // aspects
          String[] aspects = value.split(" ");
          for (String aspect : aspects) {
            // ignore JCR specific aspects
            QName aspectQName = QName.createQName(aspect, importResolver);
            if (!(JCRNamespace.JCR_URI.equals(aspectQName.getNamespaceURI())
                || JCRNamespace.MIX_URI.equals(aspectQName.getNamespaceURI()))) {
              AspectDefinition aspectDef = dictionaryService.getAspect(aspectQName);
              if (aspectDef == null) {
                throw new InvalidTypeException(aspectQName);
              }
              node.addAspect(aspectDef);
            }
          }
        } else if (JCRUUIDProperty.PROPERTY_NAME.equals(propName)) {
          node.setUUID(value);
        }

        //
        // Note: ignore JCR specific properties
        //

        else if (JCRNamespace.JCR_URI.equals(propName.getNamespaceURI())) {
        }

        //
        // process all other properties
        //

        else {
          // determine type of property
          PropertyDefinition propDef = dictionaryService.getProperty(propName);
          if (propDef == null) {
            throw new ImporterException(
                "Property " + propName + " is not known to the repository data dictionary");
          }
          DataTypeDefinition dataTypeDef = propDef.getDataType();

          // extract values from node xml attribute
          String[] propValues = null;
          PropertyContext propertyContext =
              new PropertyContext(elementName, node, propName, dataTypeDef.getName());
          if (dataTypeDef.getName().equals(DataTypeDefinition.CONTENT)) {
            // Note: we only support single valued content properties
            propValues = new String[] {value};
          } else {
            // attempt to split multi-value properties
            propValues = value.split(" ");
          }

          // extract values appropriately
          for (String propValue : propValues) {
            propertyContext.startValue();
            propertyContext.appendCharacters(propValue.toCharArray(), 0, propValue.length());
            propertyContext.endValue();
          }

          // add each value to the node
          if (propertyContext.isMultiValue()) {
            node.addPropertyCollection(propName);
          }
          List<StringBuffer> nodeValues = propertyContext.getValues();
          for (StringBuffer nodeValue : nodeValues) {
            // first, cast value to appropriate type (using JCR converters)
            Serializable objVal =
                (Serializable)
                    session.getTypeConverter().convert(dataTypeDef, nodeValue.toString());
            String strValue = DefaultTypeConverter.INSTANCE.convert(String.class, objVal);
            node.addProperty(propName, strValue);
          }
        }
      }

      // import node
      NodeRef nodeRef = node.getImporter().importNode(node);
      node.setNodeRef(nodeRef);
    } catch (Exception e) {
      throw new SAXException("Failed to process element " + qName, e);
    }
  }
 private Object generateDatasProperty(PropertyDefinition propertyDefinition) throws Exception {
   if (scenario.equals("incremental")) {
     if (numOfSame.get(typeRef).get(propertyDefinition) == null) {
       Integer value =
           Integer.valueOf(
               RandomMethods.nextIntInInterval(
                   startAttributeIndex, startAttributeIndex + numOfTypes + 1));
       numOfSame.get(typeRef).put(propertyDefinition, value);
       index.get(typeRef).put(propertyDefinition, Integer.valueOf(startAttributeIndex));
     } else {
       Integer value =
           Integer.valueOf(numOfSame.get(typeRef).get(propertyDefinition).intValue() - 1);
       if (value.intValue() >= startAttributeIndex) {
         numOfSame.get(typeRef).put(propertyDefinition, value);
         Integer indexValue =
             Integer.valueOf(index.get(typeRef).get(propertyDefinition).intValue() + 1);
         index.get(typeRef).put(propertyDefinition, indexValue);
       } else {
         Integer newValue =
             Integer.valueOf(
                 RandomMethods.nextIntInInterval(
                     startAttributeIndex, startAttributeIndex + numOfTypes + 1));
         numOfSame.get(typeRef).put(propertyDefinition, newValue);
         index.get(typeRef).put(propertyDefinition, Integer.valueOf(startAttributeIndex));
       }
     }
   } else if (scenario.equals("random")) {
     numOfSame.get(typeRef).put(propertyDefinition, Integer.valueOf(0));
   }
   Object randomData = new Object();
   String defaultValue = propertyDefinition.getDefaultValue();
   QName dataTypeOfProperty = propertyDefinition.getDataType().getName();
   List<ConstraintDefinition> constraints = propertyDefinition.getConstraints();
   if (constraints.size()
       == 1) { // we suppose there is a one-to-one correspondence between property and enumeration
     for (ConstraintDefinition constraint : constraints) {
       randomData = RandomMethods.getRandomlyValue(constraint);
     }
   } else {
     if (numOfSame
         .get(typeRef)
         .get(propertyDefinition)
         .equals(Integer.valueOf(startAttributeIndex))) {
       randomData =
           RandomMethods.generateDataByDataTypeProperty(
               dataTypeOfProperty, defaultValue, propertyDefinition);
     } else if (!numOfSame
             .get(typeRef)
             .get(propertyDefinition)
             .equals(Integer.valueOf(startAttributeIndex))
         && sameData.get(typeRef).get(propertyDefinition) == null) {
       randomData =
           RandomMethods.generateDataByDataTypeProperty(
               dataTypeOfProperty, defaultValue, propertyDefinition);
       sameData.get(typeRef).put(propertyDefinition, randomData);
     } else if (!numOfSame
             .get(typeRef)
             .get(propertyDefinition)
             .equals(Integer.valueOf(startAttributeIndex))
         && sameData.get(typeRef).get(propertyDefinition) != null) {
       randomData = sameData.get(typeRef).get(propertyDefinition);
     }
   }
   return randomData;
 }
  private CategoryPaths getCategoryPaths(
      NodeRef nodeRef, Set<QName> aspects, Map<QName, Serializable> properties) {
    ArrayList<Pair<Path, QName>> categoryPaths = new ArrayList<Pair<Path, QName>>();
    ArrayList<ChildAssociationRef> categoryParents = new ArrayList<ChildAssociationRef>();

    nodeDAO.setCheckNodeConsistency();
    for (QName classRef : aspects) {
      AspectDefinition aspDef = dictionaryService.getAspect(classRef);
      if (!isCategorised(aspDef)) {
        continue;
      }
      LinkedList<Pair<Path, QName>> aspectPaths = new LinkedList<Pair<Path, QName>>();
      for (PropertyDefinition propDef : aspDef.getProperties().values()) {
        if (!propDef.getDataType().getName().equals(DataTypeDefinition.CATEGORY)) {
          // The property is not a category
          continue;
        }
        // Don't try to iterate if the property is null
        Serializable propVal = properties.get(propDef.getName());
        if (propVal == null) {
          continue;
        }
        for (NodeRef catRef : DefaultTypeConverter.INSTANCE.getCollection(NodeRef.class, propVal)) {
          if (catRef == null) {
            continue;
          }
          // can be running in context of System user, hence use input nodeRef
          catRef = tenantService.getName(nodeRef, catRef);

          try {
            Pair<Long, NodeRef> pair = nodeDAO.getNodePair(catRef);
            if (pair != null) {
              for (Path path : nodeDAO.getPaths(pair, false)) {
                aspectPaths.add(new Pair<Path, QName>(path, aspDef.getName()));
              }
            }
          } catch (InvalidNodeRefException e) {
            // If the category does not exists we move on the next
          }
        }
      }
      categoryPaths.addAll(aspectPaths);
    }
    // Add member final element
    for (Pair<Path, QName> pair : categoryPaths) {
      if (pair.getFirst().last() instanceof Path.ChildAssocElement) {
        Path.ChildAssocElement cae = (Path.ChildAssocElement) pair.getFirst().last();
        ChildAssociationRef assocRef = cae.getRef();
        ChildAssociationRef categoryParentRef =
            new ChildAssociationRef(
                assocRef.getTypeQName(),
                assocRef.getChildRef(),
                QName.createQName("member"),
                nodeRef);
        pair.getFirst().append(new Path.ChildAssocElement(categoryParentRef));
        categoryParents.add(categoryParentRef);
      }
    }

    return new CategoryPaths(categoryPaths, categoryParents);
  }