test/javatestfile.java

Mon, 13 Nov 2017 13:52:00 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 13 Nov 2017 13:52:00 +0100
changeset 61
47a5fc33590a
parent 25
f82aa7afe872
permissions
-rw-r--r--

ucx is now used as external library

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2014 Mike Becker. All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  *
    28  */
    30 package de.uapcore.sigred.doc.base;
    32 import de.uapcore.sigred.doc.Resources;
    33 import de.uapcore.sigrapi.impl.Digraph;
    34 import de.uapcore.sigrapi.impl.Graph;
    35 import de.uapcore.sigrapi.IGraph;
    36 import java.io.IOException;
    37 import java.io.InputStream;
    38 import java.io.OutputStream;
    39 import java.util.concurrent.atomic.AtomicBoolean;
    40 import java.util.concurrent.atomic.AtomicReference;
    41 import org.apache.xerces.impl.Constants;
    42 import org.dom4j.Document;
    43 import org.dom4j.DocumentException;
    44 import org.dom4j.DocumentHelper;
    45 import org.dom4j.Element;
    46 import org.dom4j.Namespace;
    47 import org.dom4j.QName;
    48 import org.dom4j.io.OutputFormat;
    49 import org.dom4j.io.SAXReader;
    50 import org.dom4j.io.XMLWriter;
    51 import org.xml.sax.ErrorHandler;
    52 import org.xml.sax.SAXException;
    53 import org.xml.sax.SAXParseException;
    55 public abstract class AbstractGraphDocument<T extends IGraph>
    56         extends FileBackedDocument {
    58     protected static final Namespace NAMESPACE = Namespace.get("sigred",
    59         "http://develop.uap-core.de/sigred/");
    61     private static final
    62         QName TAG_GRAPHDOC = QName.get("graph-document", NAMESPACE);
    63     private static final
    64         QName TAG_GRAPH = QName.get("graph", NAMESPACE);
    65     private static final
    66         QName TAG_DIGRAPH = QName.get("digraph", NAMESPACE);
    67     private static final
    68         QName TAG_METADATA = QName.get("metadata", NAMESPACE);
    70     protected final T graph;
    72     private final GraphDocumentMetadata metadata;
    74     public AbstractGraphDocument(Class<T> graphType) {
    75         T g;
    76         try {
    77             g = graphType.newInstance();
    78         } catch (ReflectiveOperationException e) {
    79             assert false;
    80             g = null; // for the compiler
    81         }
    82         graph = g;
    83         metadata = new GraphDocumentMetadata();
    84     }
    86     public T getGraph() {
    87         return graph;
    88     }
    90     public GraphDocumentMetadata getMetadata() {
    91         return metadata;
    92     }
    94     protected abstract void writeGraph(Element rootNode) throws IOException;
    95     protected abstract void readGraph(Element rootNode) throws IOException;
    97     @Override
    98     public void writeTo(OutputStream out) throws IOException {
    99         Document doc = DocumentHelper.createDocument();
   101         Element rootNode = doc.addElement(TAG_GRAPHDOC);
   103         Element metadataNode = rootNode.addElement(TAG_METADATA);
   105         metadata.write(metadataNode);
   107         if (graph instanceof Graph) {
   108             writeGraph(rootNode.addElement(TAG_GRAPH));
   109         } else if (graph instanceof Digraph) {
   110             writeGraph(rootNode.addElement(TAG_DIGRAPH));
   111         } else {
   112             throw new IOException("unsupported graph type");
   113         }
   115         XMLWriter writer = new XMLWriter(out, OutputFormat.createPrettyPrint());
   116         writer.write(doc);
   117         writer.flush();
   118     }
   120     @Override
   121     public void readFrom(InputStream in) throws IOException {
   122         try {
   123             SAXReader reader = new SAXReader(true);
   124             reader.setStripWhitespaceText(true);
   126             reader.setFeature(Constants.XERCES_FEATURE_PREFIX+
   127                 Constants.SCHEMA_VALIDATION_FEATURE, true);
   128             reader.setProperty(Constants.XERCES_PROPERTY_PREFIX +
   129                 Constants.SCHEMA_LOCATION, String.format("%s %s",
   130                     NAMESPACE.getURI(), Resources.class.getResource(
   131                         "graph-document.xsd").toExternalForm()));
   133             final AtomicBoolean passed = new AtomicBoolean(true);
   134             final AtomicReference<SAXParseException> xmlerror = new AtomicReference<>();
   135             // TODO: we should do more detailed error handling here
   136             reader.setErrorHandler(new ErrorHandler() {
   137                 @Override
   138                 public void warning(SAXParseException exception) throws SAXException {
   139                 }
   141                 @Override
   142                 public void error(SAXParseException exception) throws SAXException {
   143                     xmlerror.set(exception);
   144                     passed.set(false);
   145                 }
   147                 @Override
   148                 public void fatalError(SAXParseException exception) throws SAXException {
   149                     xmlerror.set(exception);
   150                     passed.set(false);
   151                 }
   153             });
   154             Document doc = reader.read(in);
   155             if (!passed.get()) {
   156                 // TODO: provide details (maybe via separate error object?)
   157                 throw xmlerror.get();
   158             }
   160             doc.normalize();
   162             Element root = doc.getRootElement();
   163             metadata.read(root.element(TAG_METADATA));
   165             if (graph instanceof Graph) {
   166                 readGraph(root.element(TAG_GRAPH));
   167             } else if (graph instanceof Digraph) {
   168                 readGraph(root.element(TAG_DIGRAPH));
   169             } else {
   170                 throw new IOException("unsupported graph type");
   171             }
   172         } catch (DocumentException | SAXException ex) {
   173             throw new IOException(ex);
   174         }
   175     }
   176 }

mercurial