Search in sources :

Example 1 with PropertiesDescription

use of org.apache.xmpbox.type.PropertiesDescription 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;
}
Also used : Types(org.apache.xmpbox.type.Types) ArrayProperty(org.apache.xmpbox.type.ArrayProperty) AbstractField(org.apache.xmpbox.type.AbstractField) PropertiesDescription(org.apache.xmpbox.type.PropertiesDescription) Element(org.w3c.dom.Element) AbstractSimpleProperty(org.apache.xmpbox.type.AbstractSimpleProperty) ComplexPropertyContainer(org.apache.xmpbox.type.ComplexPropertyContainer) PropertyType(org.apache.xmpbox.type.PropertyType) TypeMapping(org.apache.xmpbox.type.TypeMapping) ArrayList(java.util.ArrayList) NodeList(org.w3c.dom.NodeList) List(java.util.List) AbstractStructuredType(org.apache.xmpbox.type.AbstractStructuredType)

Example 2 with PropertiesDescription

use of org.apache.xmpbox.type.PropertiesDescription 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);
}
Also used : ArrayProperty(org.apache.xmpbox.type.ArrayProperty) DefinedStructuredType(org.apache.xmpbox.type.DefinedStructuredType) AbstractField(org.apache.xmpbox.type.AbstractField) PropertiesDescription(org.apache.xmpbox.type.PropertiesDescription) PDFAFieldType(org.apache.xmpbox.type.PDFAFieldType) PDFAPropertyType(org.apache.xmpbox.type.PDFAPropertyType) PropertyType(org.apache.xmpbox.type.PropertyType) Map(java.util.Map) NamedNodeMap(org.w3c.dom.NamedNodeMap)

Aggregations

AbstractField (org.apache.xmpbox.type.AbstractField)2 ArrayProperty (org.apache.xmpbox.type.ArrayProperty)2 PropertiesDescription (org.apache.xmpbox.type.PropertiesDescription)2 PropertyType (org.apache.xmpbox.type.PropertyType)2 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Map (java.util.Map)1 AbstractSimpleProperty (org.apache.xmpbox.type.AbstractSimpleProperty)1 AbstractStructuredType (org.apache.xmpbox.type.AbstractStructuredType)1 ComplexPropertyContainer (org.apache.xmpbox.type.ComplexPropertyContainer)1 DefinedStructuredType (org.apache.xmpbox.type.DefinedStructuredType)1 PDFAFieldType (org.apache.xmpbox.type.PDFAFieldType)1 PDFAPropertyType (org.apache.xmpbox.type.PDFAPropertyType)1 TypeMapping (org.apache.xmpbox.type.TypeMapping)1 Types (org.apache.xmpbox.type.Types)1 Element (org.w3c.dom.Element)1 NamedNodeMap (org.w3c.dom.NamedNodeMap)1 NodeList (org.w3c.dom.NodeList)1