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

Java tutorial

Introduction

Here is the source code for org.opendatakit.aggregate.format.element.XmlElementFormatter.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.HtmlUtil;
import org.opendatakit.aggregate.datamodel.FormElementModel;
import org.opendatakit.aggregate.format.Row;
import org.opendatakit.aggregate.format.structure.XmlFormatter;
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;

/**
 * Formats xml tags <name>value</name> with proper escaping for
 * reconstructing the submission xml that Collect may have used
 * when submitting data.
 *
 * NOTE: This class does not use the Row object for the
 * reconstruction, but instead writes to the XmlFormatter
 * output stream directly.
 *
 * @author wbrunette@gmail.com
 * @author mitchellsundt@gmail.com
 *
 */
public class XmlElementFormatter implements ElementFormatter {
    XmlFormatter xmlFormatter;

    String prefix = "";

    /**
     * Construct a XML Element Formatter
    * @param xmlFormatter
     *
     */
    public XmlElementFormatter(XmlFormatter xmlFormatter) {
        this.xmlFormatter = xmlFormatter;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    @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, element.getElementName(), row);
        } else {
            addToXmlValueToRow(blobSubmission.getUnrootedFilename(1, cc), element.getElementName(), row);
        }
    }

    @Override
    public void formatBoolean(Boolean bool, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(bool, element.getElementName(), 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);
        }
        String str = b.toString();
        if (str.length() > 0) {
            addToXmlValueToRow(str, element.getElementName(), row);
        } else {
            addToXmlValueToRow(null, element.getElementName(), row);
        }
    }

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

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

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

    @Override
    public void formatDecimal(BigDecimal dub, FormElementModel element, String ordinalValue, Row row) {
        addToXmlValueToRow(dub, element.getElementName(), 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, element.getElementName(), row);
        } else {
            addToXmlValueToRow(null, element.getElementName(), row);
        }

    }

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

    @Override
    public void formatRepeats(SubmissionRepeat repeat, FormElementModel repeatElement, Row row, CallingContext cc)
            throws ODKDatastoreException {
    }

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

    private void addToXmlValueToRow(Object value, String propertyName, Row row) {

        if (value != null) {
            String xmlString = HtmlUtil.createBeginTag(prefix + propertyName);
            xmlString += StringEscapeUtils.escapeXml10(value.toString());
            xmlString += HtmlUtil.createEndTag(prefix + propertyName);
            xmlFormatter.writeXml(xmlString);
        } else {
            xmlFormatter.writeXml(HtmlUtil.createSelfClosingTag(prefix + propertyName));
        }
    }

}