org.opendatakit.aggregate.format.element.XmlAttributeFormatter.java Source code

Java tutorial

Introduction

Here is the source code for org.opendatakit.aggregate.format.element.XmlAttributeFormatter.java

Source

/*
 * Copyright (C) 2011 University of Washington
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.opendatakit.aggregate.format.element;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringEscapeUtils;
import org.opendatakit.aggregate.constants.ParserConsts;
import org.opendatakit.aggregate.datamodel.FormElementModel;
import org.opendatakit.aggregate.format.Row;
import org.opendatakit.aggregate.submission.SubmissionRepeat;
import org.opendatakit.aggregate.submission.type.BlobSubmissionType;
import org.opendatakit.aggregate.submission.type.GeoPoint;
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
import org.opendatakit.common.utils.WebUtils;
import org.opendatakit.common.web.CallingContext;
import org.opendatakit.common.web.constants.BasicConsts;

/**
 * Emits attribute=\"value\" string for a list of properties.
 * Escapes value but does not handle non-XML-compliant attribute names.
 * Used for metadata fields.
 *
 * @author mitchellsundt@gmail.com
 *
 */
public class XmlAttributeFormatter implements ElementFormatter {

    /**
     * Construct a XML Element Formatter
     *
     */
    public XmlAttributeFormatter() {
    }

    private String asAttributeName(FormElementModel m) {
        if (m.isMetadata()) {
            switch (m.getType()) {
            case META_MODEL_VERSION:
                return ParserConsts.MODEL_VERSION_ATTRIBUTE_NAME;
            case META_UI_VERSION:
                return ParserConsts.UI_VERSION_ATTRIBUTE_NAME;
            case META_INSTANCE_ID:
                return ParserConsts.INSTANCE_ID_ATTRIBUTE_NAME;
            case META_SUBMISSION_DATE:
                return ParserConsts.SUBMISSION_DATE_ATTRIBUTE_NAME;
            case META_IS_COMPLETE:
                return ParserConsts.IS_COMPLETE_ATTRIBUTE_NAME;
            case META_DATE_MARKED_AS_COMPLETE:
                return ParserConsts.MARKED_AS_COMPLETE_DATE_ATTRIBUTE_NAME;
            default:
                throw new IllegalStateException("Unrecognized metadata");
            }
        } else {
            return m.getElementName();
        }
    }

    @Override
    public void formatUid(String uri, String propertyName, Row row) {
        // unneeded so unimplemented
    }

    @Override
    public void formatBinary(BlobSubmissionType blobSubmission, FormElementModel element, String ordinalValue,
            Row row, CallingContext cc) throws ODKDatastoreException {
        if (blobSubmission == null || (blobSubmission.getAttachmentCount(cc) == 0)
                || (blobSubmission.getContentHash(1, cc) == null)) {
            addToXmlValueToRow(null, asAttributeName(element), row);
        } else {
            addToXmlValueToRow(blobSubmission.getUnrootedFilename(1, cc), asAttributeName(element), row);
        }
    }

    @Override
    public void formatBoolean(Boolean bool, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(bool, asAttributeName(element), row);

    }

    @Override
    public void formatChoices(List<String> choices, FormElementModel element, String ordinalValue, Row row) {
        StringBuilder b = new StringBuilder();

        boolean first = true;
        for (String s : choices) {
            if (!first) {
                b.append(" ");
            }
            first = false;
            b.append(s);
        }
        addToXmlValueToRow(b.toString(), asAttributeName(element), row);
    }

    @Override
    public void formatDate(Date date, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(WebUtils.asSubmissionDateOnlyString(date), asAttributeName(element), row);
    }

    @Override
    public void formatDateTime(Date date, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(WebUtils.asSubmissionDateTimeString(date), asAttributeName(element), row);
    }

    @Override
    public void formatTime(Date date, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(WebUtils.asSubmissionTimeOnlyString(date), asAttributeName(element), row);
    }

    @Override
    public void formatDecimal(BigDecimal dub, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(dub, asAttributeName(element), row);
    }

    @Override
    public void formatGeoPoint(GeoPoint coordinate, FormElementModel element, String ordinalValue, Row row) {
        if (coordinate.getLongitude() != null && coordinate.getLatitude() != null) {
            String coordVal = coordinate.getLatitude().toString() + BasicConsts.SPACE
                    + coordinate.getLongitude().toString();
            if (coordinate.getAltitude() != null) {
                coordVal += BasicConsts.SPACE + coordinate.getAltitude().toString();
            } else {
                coordVal += BasicConsts.SPACE + "0.0";
            }
            if (coordinate.getAccuracy() != null) {
                coordVal += BasicConsts.SPACE + coordinate.getAccuracy().toString();
            } else {
                coordVal += BasicConsts.SPACE + "0.0";
            }
            addToXmlValueToRow(coordVal, asAttributeName(element), row);
        } else {
            addToXmlValueToRow(null, asAttributeName(element), row);
        }
    }

    @Override
    public void formatLong(Long longInt, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(longInt, asAttributeName(element), row);
    }

    @Override
    public void formatRepeats(SubmissionRepeat repeat, FormElementModel repeatElement, Row row, CallingContext cc)
            throws ODKDatastoreException {
        throw new IllegalStateException("unimplemented");
    }

    @Override
    public void formatString(String string, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(string, asAttributeName(element), row);
    }

    private void addToXmlValueToRow(Object value, String propertyName, Row row) {
        if (value != null) {
            String xmlString = propertyName + "=\"" + StringEscapeUtils.escapeXml10(value.toString()) + "\"";
            row.addFormattedValue(xmlString);
        }
    }

}