/** * Sort weak reference values alphabetically to ensure consistent ordering. * @param name Property name * @param value Property value * @return Property value with sorted references */ private String sortWeakReferenceValues(String name, String value) { Set<String> refs = new TreeSet<>(); DocViewProperty prop = DocViewProperty.parse(name, value); for (int i = 0; i < prop.values.length; i++) { refs.add(prop.values[i]); } List<Value> values = new ArrayList<>(); for (String ref : refs) { values.add(new MockValue(ref, PropertyType.WEAKREFERENCE)); } try { String sortedValues = DocViewProperty.format(new MockProperty(name, true, values.toArray(new Value[values.size()]))); return sortedValues; } catch (RepositoryException ex) { throw new RuntimeException("Unable to format value for " + name, ex); } }
/** * Formats the given jcr property to the enhanced docview syntax. * @param prop the jcr property * @return the formatted string * @throws RepositoryException if a repository error occurs */ public static String format(Property prop) throws RepositoryException { return format(prop, false, false); }
private void collectNamespacePrefixNameArray(Set<String> prefixes, String name, String value) { DocViewProperty prop = DocViewProperty.parse(name, value); for (int i = 0; i < prop.values.length; i++) { String item = prop.values[i]; String namespacePrefix = StringUtils.substringBefore(item, ":"); collectNamespacePrefix(prefixes, namespacePrefix); } }
if (!ni.label.equals(ni.name) && ni.uuid == null) { ni.uuid = UUID.randomUUID().toString(); ni.props.put(JcrConstants.JCR_UUID, new DocViewProperty( JcrConstants.JCR_UUID, new String[]{ni.uuid}, false, PropertyType.STRING)); addMixRef = true; if (mix == null) { mix = new DocViewProperty(JcrConstants.JCR_MIXINTYPES, new String[]{JcrConstants.MIX_REFERENCEABLE}, true, PropertyType.NAME); ni.props.put(mix.name, mix); } else { System.arraycopy(mix.values, 0, vs, 0, mix.values.length); vs[mix.values.length] = JcrConstants.MIX_REFERENCEABLE; mix = new DocViewProperty(JcrConstants.JCR_MIXINTYPES, vs, true, PropertyType.NAME); ni.props.put(mix.name, mix); if (!PROTECTED_PROPERTIES.contains(p.name)) { try { p.apply(node); } catch (RepositoryException e) { log.warn("Error while setting property (ignore): " + e);
StringBuffer attrValue = new StringBuffer(); int type = prop.getType(); if (type == PropertyType.BINARY || isAmbiguous(prop)) { String referenceBinary = null; if (useBinaryReferences && type == PropertyType.BINARY) { case PropertyType.NAME: case PropertyType.PATH: escape(attrValue, strValue, true); break; default: } else { String strValue = ValueHelper.serialize(prop.getValue(), false); escape(attrValue, strValue, false);
values = new String[]{tmp.toString()}; return new DocViewProperty(name, values, isMulti, type, isBinaryRef);
return DocViewProperty.format(prop);
attributes.getURI(i), ISO9075.decode(attributes.getLocalName(i))); DocViewProperty info = DocViewProperty.parse( npResolver.getJCRName(pName), attributes.getValue(i));
new DocViewProperty(JcrConstants.JCR_MIXINTYPES, new String[0], true, PropertyType.NAME)); if (prop != null && !PROTECTED_PROPERTIES.contains(prop.name)) { try { modified |= prop.apply(node); } catch (RepositoryException e) { try { modified |= prop.apply(node); } catch (RepositoryException e1) { log.warn("Error while setting property (ignore): " + e1);
DocViewProperty authId = new DocViewProperty( "rep:authorizableId", new String[]{authNode.getProperty("rep:authorizableId").getString()},
private String filterMixinsPropertyValue(String value, Set<String> namespacePrefixesActuallyUsed) { if (this.excludeMixins.length == 0 || StringUtils.isBlank(value)) { return value; } DocViewProperty prop = DocViewProperty.parse(MIXINS_PROPERTY, value); List<Value> mixins = new ArrayList<>(); for (int i = 0; i < prop.values.length; i++) { String mixin = prop.values[i]; if (!exclude(mixin, this.excludeMixins)) { String namespacePrefix = StringUtils.substringBefore(mixin, ":"); collectNamespacePrefix(namespacePrefixesActuallyUsed, namespacePrefix); mixins.add(new MockValue(mixin, PropertyType.STRING)); } } if (mixins.isEmpty()) { return null; } try { return DocViewProperty.format(new MockProperty(MIXINS_PROPERTY, true, mixins.toArray(new Value[mixins.size()]))); } catch (RepositoryException ex) { throw new RuntimeException("Unable to format value for " + MIXINS_PROPERTY, ex); } }
boolean sort = qName.equals(NameConstants.JCR_MIXINTYPES); attrs.addAttribute(qName.getNamespaceURI(), qName.getLocalName(), attrName, CDATA_TYPE, DocViewProperty.format(prop, sort, useBinaryReferences));
/** * Parse JSON value from XML Attribute. * @param value XML attribute value * @return Value object */ public static Object parseValue(final String name, final String value) { if (value == null) { return null; } DocViewProperty prop = DocViewProperty.parse(name, value); // convert values if (prop.isMulti) { Class<?> arrayType = getType(prop.type); if (arrayType == null) { return null; } Object result = Array.newInstance(arrayType, prop.values.length); for (int i=0; i<prop.values.length; i++) { Array.set(result, i, convertValue(prop.values[i], prop.type, true)); } return result; } else { return convertValue(prop.values[0], prop.type, false); } }