Search in sources :

Example 6 with UpdateActionImpl

use of org.codice.ddf.spatial.ogc.csw.catalog.common.transaction.UpdateActionImpl in project ddf by codice.

the class TransactionRequestConverter method parseUpdateAction.

private UpdateAction parseUpdateAction(HierarchicalStreamReader reader, UnmarshallingContext context) {
    Map<String, String> xmlnsAttributeToUriMappings = getXmlnsAttributeToUriMappingsFromContext(context);
    Map<String, String> prefixToUriMappings = getPrefixToUriMappingsFromXmlnsAttributes(xmlnsAttributeToUriMappings);
    String typeName = StringUtils.defaultIfEmpty(reader.getAttribute(CswConstants.TYPE_NAME_PARAMETER), CswConstants.CSW_RECORD);
    String handle = StringUtils.defaultIfEmpty(reader.getAttribute(CswConstants.HANDLE_PARAMETER), "");
    // Move down to the content of the <Update>.
    reader.moveDown();
    UpdateAction updateAction;
    // Do we have a list of <RecordProperty> elements or a new <csw:Record>?
    if (reader.getNodeName().contains("RecordProperty")) {
        Map<String, Serializable> cswRecordProperties = new HashMap<>();
        while (reader.getNodeName().contains("RecordProperty")) {
            String cswField;
            Serializable newValue = null;
            // Move down to the <Name>.
            reader.moveDown();
            if (reader.getNodeName().contains("Name")) {
                String attribute = reader.getValue();
                cswField = CswRecordConverter.getCswAttributeFromAttributeName(attribute);
            } else {
                throw new ConversionException("Missing Parameter Value: missing a Name in a RecordProperty.");
            }
            // Move back up to the <RecordProperty>.
            reader.moveUp();
            String attrName = DefaultCswRecordMap.getDefaultMetacardFieldForPrefixedString(cswField);
            cswRecordProperties.put(attrName, null);
            // Is there a <Value>?
            while (reader.hasMoreChildren()) {
                // Move down to the <Value>.
                reader.moveDown();
                if (reader.getNodeName().contains("Value")) {
                    newValue = getRecordPropertyValue(reader, attrName);
                } else {
                    throw new ConversionException("Invalid Parameter Value: invalid element in a RecordProperty.");
                }
                Serializable currentValue = cswRecordProperties.get(attrName);
                if (currentValue != null) {
                    if (currentValue instanceof List) {
                        ((List) currentValue).add(newValue);
                    } else {
                        LinkedList<Serializable> list = new LinkedList<>();
                        list.add(currentValue);
                        list.add(newValue);
                        cswRecordProperties.put(attrName, list);
                    }
                } else {
                    cswRecordProperties.put(attrName, newValue);
                }
                // Back to the <RecordProperty>.
                reader.moveUp();
            }
            // Back to the <Update>, look for the next <RecordProperty>.
            reader.moveUp();
            if (!reader.hasMoreChildren()) {
                // Constraint, which is required.
                throw new ConversionException("Missing Parameter Value: missing a Constraint.");
            }
            // What's the next element in the <Update>?
            reader.moveDown();
        }
        // Now there should be a <Constraint> element.
        if (reader.getNodeName().contains("Constraint")) {
            StringWriter writer = new StringWriter();
            XStreamAttributeCopier.copyXml(reader, writer, xmlnsAttributeToUriMappings);
            QueryConstraintType constraint = getElementFromXml(writer.toString(), QueryConstraintType.class);
            // For any CSW attributes that map to basic metacard attributes (e.g. title,
            // modified date, etc.), update the basic metacard attributes as well.
            Map<String, String> cswToMetacardAttributeNames = DefaultCswRecordMap.getDefaultCswRecordMap().getCswToMetacardAttributeNames();
            Map<String, Serializable> cswRecordPropertiesWithMetacardAttributes = new HashMap<>(cswRecordProperties);
            for (Entry<String, Serializable> recordProperty : cswRecordProperties.entrySet()) {
                String cswAttributeName = recordProperty.getKey();
                // basic metacard attribute.
                if (cswToMetacardAttributeNames.containsKey(cswAttributeName)) {
                    String metacardAttrName = cswToMetacardAttributeNames.get(cswAttributeName);
                    // If this basic metacard attribute hasn't already been set, set it.
                    if (!cswRecordPropertiesWithMetacardAttributes.containsKey(metacardAttrName)) {
                        Attribute metacardAttr = cswRecordConverter.getMetacardAttributeFromCswAttribute(cswAttributeName, recordProperty.getValue(), metacardAttrName);
                        cswRecordPropertiesWithMetacardAttributes.put(metacardAttrName, metacardAttr.getValue());
                    }
                }
            }
            updateAction = new UpdateActionImpl(cswRecordPropertiesWithMetacardAttributes, typeName, handle, constraint, prefixToUriMappings);
        } else {
            throw new ConversionException("Missing Parameter Value: missing a Constraint.");
        }
    } else {
        context.put(CswConstants.TRANSFORMER_LOOKUP_KEY, TransformerManager.ID);
        context.put(CswConstants.TRANSFORMER_LOOKUP_VALUE, typeName);
        Metacard metacard = (Metacard) context.convertAnother(null, MetacardImpl.class, delegatingTransformer);
        updateAction = new UpdateActionImpl(metacard, typeName, handle);
        // Move back to the <Update>.
        reader.moveUp();
    }
    return updateAction;
}
Also used : ConversionException(com.thoughtworks.xstream.converters.ConversionException) Serializable(java.io.Serializable) UpdateActionImpl(org.codice.ddf.spatial.ogc.csw.catalog.common.transaction.UpdateActionImpl) UpdateAction(org.codice.ddf.spatial.ogc.csw.catalog.actions.UpdateAction) HashMap(java.util.HashMap) Attribute(ddf.catalog.data.Attribute) LinkedList(java.util.LinkedList) QueryConstraintType(net.opengis.cat.csw.v_2_0_2.QueryConstraintType) MetacardImpl(ddf.catalog.data.impl.MetacardImpl) Metacard(ddf.catalog.data.Metacard) StringWriter(java.io.StringWriter) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List)

Aggregations

UpdateActionImpl (org.codice.ddf.spatial.ogc.csw.catalog.common.transaction.UpdateActionImpl)6 MetacardImpl (ddf.catalog.data.impl.MetacardImpl)5 UpdateAction (org.codice.ddf.spatial.ogc.csw.catalog.actions.UpdateAction)5 CswTransactionRequest (org.codice.ddf.spatial.ogc.csw.catalog.common.transaction.CswTransactionRequest)5 ArrayList (java.util.ArrayList)4 Test (org.junit.Test)4 Metacard (ddf.catalog.data.Metacard)3 UpdateResponseImpl (ddf.catalog.operation.impl.UpdateResponseImpl)3 Serializable (java.io.Serializable)3 HashMap (java.util.HashMap)3 QueryConstraintType (net.opengis.cat.csw.v_2_0_2.QueryConstraintType)3 TransactionResponseType (net.opengis.cat.csw.v_2_0_2.TransactionResponseType)3 Update (ddf.catalog.operation.Update)2 UpdateRequest (ddf.catalog.operation.UpdateRequest)2 UpdateResponse (ddf.catalog.operation.UpdateResponse)2 UpdateImpl (ddf.catalog.operation.impl.UpdateImpl)2 TransactionSummaryType (net.opengis.cat.csw.v_2_0_2.TransactionSummaryType)2 ConversionException (com.thoughtworks.xstream.converters.ConversionException)1 Attribute (ddf.catalog.data.Attribute)1 Result (ddf.catalog.data.Result)1