示例#1
0
 protected void assertProperty(
     AbstractJcrProperty property,
     javax.jcr.Node node,
     String name,
     int propertyType,
     Object... values)
     throws Exception {
   assertThat(property.getName(), is(name));
   assertThat(property.getType(), is(propertyType));
   assertThat(property.getParent(), is(node));
   if (values.length > 1) {
     int i = 0;
     for (Value actual : property.getValues()) {
       String actualString = actual.getString();
       String expectedString = context.getValueFactories().getStringFactory().create(values[i]);
       assertThat(actualString, is(expectedString));
       assertCanObtainValue(actual, propertyType);
       ++i;
     }
     // Getting the single value should result in an error ...
     try {
       property.getValue();
       fail("Should not be able to call Property.getValue() on multi-valued properties");
     } catch (ValueFormatException e) {
       // expected ...
     }
   } else {
     String actualString = property.getValue().getString();
     String expectedString = context.getValueFactories().getStringFactory().create(values[0]);
     assertThat(actualString, is(expectedString));
     assertThat(actualString, is(property.getString()));
     assertCanObtainValue(property.getValue(), propertyType);
     // Getting the multiple values should result in an error ...
     try {
       property.getValues();
       fail("Should not be able to call Property.getValues() on single-valued properties");
     } catch (ValueFormatException e) {
       // expected ...
     }
     // Check resolving the reference ...
     if (propertyType == PropertyType.REFERENCE) {
       javax.jcr.Node referenced = property.getNode();
       assertThat(referenced, is(notNullValue()));
     }
   }
 }
  /**
   * Fires the appropriate SAX events on the content handler to build the XML elements for the
   * property.
   *
   * @param property the property to be exported
   * @param contentHandler the SAX content handler for which SAX events will be invoked as the XML
   *     document is created.
   * @param skipBinary if <code>true</code>, indicates that binary properties should not be exported
   * @throws SAXException if an exception occurs during generation of the XML document
   * @throws RepositoryException if an exception occurs accessing the content repository
   */
  private void emitProperty(Property property, ContentHandler contentHandler, boolean skipBinary)
      throws RepositoryException, SAXException {
    assert property instanceof AbstractJcrProperty
        : "Illegal attempt to use " + getClass().getName() + " on non-ModeShape property";

    AbstractJcrProperty prop = (AbstractJcrProperty) property;

    // first set the property sv:name attribute
    AttributesImpl propAtts = new AttributesImpl();
    propAtts.addAttribute(
        JcrSvLexicon.NAME.getNamespaceUri(),
        JcrSvLexicon.NAME.getLocalName(),
        getPrefixedName(JcrSvLexicon.NAME),
        PropertyType.nameFromValue(PropertyType.STRING),
        prop.getName());

    // and it's sv:type attribute
    propAtts.addAttribute(
        JcrSvLexicon.TYPE.getNamespaceUri(),
        JcrSvLexicon.TYPE.getLocalName(),
        getPrefixedName(JcrSvLexicon.TYPE),
        PropertyType.nameFromValue(PropertyType.STRING),
        PropertyType.nameFromValue(prop.getType()));

    // and it's sv:multiple attribute
    if (prop.isMultiple()) {
      propAtts.addAttribute(
          JcrSvLexicon.TYPE.getNamespaceUri(),
          JcrSvLexicon.TYPE.getLocalName(),
          getPrefixedName(JcrSvLexicon.MULTIPLE),
          PropertyType.nameFromValue(PropertyType.BOOLEAN),
          Boolean.TRUE.toString());
    }

    // output the sv:property element
    startElement(contentHandler, JcrSvLexicon.PROPERTY, propAtts);

    boolean modified = property.isModified();

    // then output a sv:value element for each of its values
    if (prop instanceof JcrMultiValueProperty) {
      Value[] values = prop.getValues();
      for (int i = 0; i < values.length; i++) {

        emitValue(values[i], contentHandler, property.getType(), skipBinary, modified);
      }
    } else {
      emitValue(property.getValue(), contentHandler, property.getType(), skipBinary, modified);
    }

    // end the sv:property element
    endElement(contentHandler, JcrSvLexicon.PROPERTY);
  }