use of org.apache.xmpbox.type.ArrayProperty in project pdfbox by apache.
the class DomXmpParser method parseLiDescription.
private AbstractStructuredType parseLiDescription(XMPMetadata xmp, QName descriptor, Element liElement) throws XmpParsingException {
TypeMapping tm = xmp.getTypeMapping();
List<Element> elements = DomHelper.getElementChildren(liElement);
if (elements.isEmpty()) {
// The list is empty
return null;
}
// Instantiate abstract structured type with hint from first element
Element first = elements.get(0);
PropertyType ctype = checkPropertyDefinition(xmp, DomHelper.getQName(first));
Types tt = ctype.type();
AbstractStructuredType ast = instanciateStructured(tm, tt, descriptor.getLocalPart(), first.getNamespaceURI());
ast.setNamespace(descriptor.getNamespaceURI());
ast.setPrefix(descriptor.getPrefix());
PropertiesDescription pm;
if (tt.isStructured()) {
pm = tm.getStructuredPropMapping(tt);
} else {
pm = tm.getDefinedDescriptionByNamespace(first.getNamespaceURI());
}
for (Element element : elements) {
String prefix = element.getPrefix();
String name = element.getLocalName();
String namespace = element.getNamespaceURI();
PropertyType type = pm.getPropertyType(name);
if (type == null) {
// not defined
throw new XmpParsingException(ErrorType.NoType, "Type '" + name + "' not defined in " + element.getNamespaceURI());
} else if (type.card().isArray()) {
ArrayProperty array = tm.createArrayProperty(namespace, prefix, name, type.card());
ast.getContainer().addProperty(array);
Element bagOrSeq = DomHelper.getUniqueElementChild(element);
List<Element> lis = DomHelper.getElementChildren(bagOrSeq);
for (Element element2 : lis) {
AbstractField ast2 = parseLiElement(xmp, descriptor, element2, type.type());
if (ast2 != null) {
array.addProperty(ast2);
}
}
} else if (type.type().isSimple()) {
AbstractSimpleProperty sp = tm.instanciateSimpleProperty(namespace, prefix, name, element.getTextContent(), type.type());
loadAttributes(sp, element);
ast.getContainer().addProperty(sp);
} else if (type.type().isStructured()) {
// create a new structured type
AbstractStructuredType inner = instanciateStructured(tm, type.type(), name, null);
inner.setNamespace(namespace);
inner.setPrefix(prefix);
ast.getContainer().addProperty(inner);
ComplexPropertyContainer cpc = inner.getContainer();
if (DomHelper.isParseTypeResource(element)) {
parseDescriptionInner(xmp, element, cpc);
} else {
Element descElement = DomHelper.getFirstChildElement(element);
if (descElement != null) {
parseDescriptionInner(xmp, descElement, cpc);
}
}
} else {
throw new XmpParsingException(ErrorType.NoType, "Unidentified element to parse " + element + " (type=" + type + ")");
}
}
return ast;
}
use of org.apache.xmpbox.type.ArrayProperty in project pdfbox by apache.
the class PdfaExtensionHelper method populatePDFAType.
private static void populatePDFAType(XMPMetadata meta, PDFATypeType type, TypeMapping tm) throws XmpParsingException {
String ttype = type.getType();
String tns = type.getNamespaceURI();
String tprefix = type.getPrefixValue();
String tdescription = type.getDescription();
ArrayProperty fields = type.getFields();
if (ttype == null || tns == null || tprefix == null || tdescription == null) {
// all fields are mandatory
throw new XmpParsingException(ErrorType.RequiredProperty, "Missing field in type definition");
}
// create the structured type
// TODO
DefinedStructuredType structuredType = new DefinedStructuredType(meta, tns, tprefix, null);
// maybe a name exists
if (fields != null) {
List<AbstractField> definedFields = fields.getAllProperties();
for (AbstractField af3 : definedFields) {
if (af3 instanceof PDFAFieldType) {
populatePDFAFieldType((PDFAFieldType) af3, structuredType);
}
// else TODO
}
}
// add the structured type to list
PropertiesDescription pm = new PropertiesDescription();
for (Map.Entry<String, PropertyType> entry : structuredType.getDefinedProperties().entrySet()) {
pm.addNewProperty(entry.getKey(), entry.getValue());
}
tm.addToDefinedStructuredTypes(ttype, tns, pm);
}
use of org.apache.xmpbox.type.ArrayProperty in project pdfbox by apache.
the class XMPSchema method setUnqualifiedLanguagePropertyValue.
/**
* Set the value of a multi-lingual property.
*
* @param name
* The name of the property, it must include the namespace prefix, e.g. "pdf:Keywords"
* @param language
* The language code of the value. If null then "x-default" is assumed.
* @param value
* The value of the property in the specified language.
*/
public void setUnqualifiedLanguagePropertyValue(String name, String language, String value) {
if (language == null || language.isEmpty()) {
language = XmpConstants.X_DEFAULT;
}
AbstractField property = getAbstractProperty(name);
ArrayProperty arrayProp;
if (property != null) {
// Analyzing content of property
if (property instanceof ArrayProperty) {
arrayProp = (ArrayProperty) property;
// Try to find a definition
for (AbstractField child : arrayProp.getContainer().getAllProperties()) {
// try to find the same lang definition
if (child.getAttribute(XmpConstants.LANG_NAME).getValue().equals(language)) {
// the same language has been found
arrayProp.getContainer().removeProperty(child);
if (value != null) {
TextType langValue = createTextType(XmpConstants.LIST_NAME, value);
langValue.setAttribute(new Attribute(XMLConstants.XML_NS_URI, XmpConstants.LANG_NAME, language));
arrayProp.getContainer().addProperty(langValue);
}
reorganizeAltOrder(arrayProp.getContainer());
return;
}
}
// if no definition found, we add a new one
TextType langValue = createTextType(XmpConstants.LIST_NAME, value);
langValue.setAttribute(new Attribute(XMLConstants.XML_NS_URI, XmpConstants.LANG_NAME, language));
arrayProp.getContainer().addProperty(langValue);
reorganizeAltOrder(arrayProp.getContainer());
}
} else {
arrayProp = createArrayProperty(name, Cardinality.Alt);
TextType langValue = createTextType(XmpConstants.LIST_NAME, value);
langValue.setAttribute(new Attribute(XMLConstants.XML_NS_URI, XmpConstants.LANG_NAME, language));
arrayProp.getContainer().addProperty(langValue);
addProperty(arrayProp);
}
}
use of org.apache.xmpbox.type.ArrayProperty in project pdfbox by apache.
the class XMPSchema method getUnqualifiedLanguagePropertyValue.
/**
* Get the value of a multi-lingual property.
*
* @param name
* The name of the property, without the namespace prefix.
* @param expectedLanguage
* The language code of the value. If null then "x-default" is assumed.
*
* @return The value of the language property.
*/
public String getUnqualifiedLanguagePropertyValue(String name, String expectedLanguage) {
String language = (expectedLanguage != null) ? expectedLanguage : XmpConstants.X_DEFAULT;
AbstractField property = getAbstractProperty(name);
if (property != null) {
if (property instanceof ArrayProperty) {
ArrayProperty arrayProp = (ArrayProperty) property;
for (AbstractField child : arrayProp.getContainer().getAllProperties()) {
Attribute text = child.getAttribute(XmpConstants.LANG_NAME);
if (text != null && text.getValue().equals(language)) {
return ((TextType) child).getStringValue();
}
}
return null;
} else {
throw new IllegalArgumentException("The property '" + name + "' is not of Lang Alt type");
}
}
return null;
}
use of org.apache.xmpbox.type.ArrayProperty in project pdfbox by apache.
the class XMPSchema method getUnqualifiedLanguagePropertyLanguagesValue.
/**
* Get a list of all languages that are currently defined for a specific
* property.
*
* @param name The name of the property, it must include the namespace
* prefix, e.g. "pdf:Keywords".
*
* @return A list of all languages, this will return an non-null empty list
* if none have been defined, and null if the property doesn't exist.
*/
public List<String> getUnqualifiedLanguagePropertyLanguagesValue(String name) {
AbstractField property = getAbstractProperty(name);
if (property != null) {
if (property instanceof ArrayProperty) {
List<String> retval = new ArrayList<>();
ArrayProperty arrayProp = (ArrayProperty) property;
for (AbstractField child : arrayProp.getContainer().getAllProperties()) {
Attribute text = child.getAttribute(XmpConstants.LANG_NAME);
if (text != null) {
retval.add(text.getValue());
} else {
retval.add(XmpConstants.X_DEFAULT);
}
}
return retval;
} else {
throw new IllegalArgumentException("The property '" + name + "' is not of Lang Alt type");
}
}
// no property with that name
return null;
}
Aggregations