com.esri.geoevent.solutions.adapter.cot.CoTUtilities.java Source code

Java tutorial

Introduction

Here is the source code for com.esri.geoevent.solutions.adapter.cot.CoTUtilities.java

Source

package com.esri.geoevent.solutions.adapter.cot;

/*
 * #%L
 * CoTUtilities.java - Esri :: AGES :: Solutions :: Adapter :: CoT - Esri - 2013
 * org.codehaus.mojo-license-maven-plugin-1.5
 * $Id: update-file-header-config.apt.vm 17764 2012-12-12 10:22:04Z tchemit $
 * $HeadURL: https://svn.codehaus.org/mojo/tags/license-maven-plugin-1.5/src/site/apt/examples/update-file-header-config.apt.vm $
 * %%
 * Copyright (C) 2013 - 2014 Esri
 * %%
 * 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.
 * #L%
 */

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.TimeZone;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class CoTUtilities {

    private static final Log log = LogFactory.getLog(CoTUtilities.class);
    public static String UNKNOWN_SYMBOL = "SUZP-----------";

    // https://svn.ultra-prologic.com/svn/repos/trunk/group/igs/AViz/AWS%204.0/AWSData/utilities/CoTEventUtilities.cs

    // / <summary>
    // / This function converts the type field from Cursor On Target Event
    // / format to MIL-STD 2525B 15 character symbol codes
    // / </summary>
    // / <param name="cotType">The cursor on target type field data</param>
    // / <returns>A 15 character string representing the 2525B equivalent of the
    // / CoT event type if successful, <see
    // cref="UNKNOWN_SYMBOL">UNKNOWN_SYMBOL</see>
    // / otherwise.</returns>
    public static String getSymbolFromCot(String cotType) {
        try {
            if (cotType == null || cotType.isEmpty())
                return UNKNOWN_SYMBOL;

            StringBuilder retVal = new StringBuilder();
            String recognizedAffiliations = "fhupansjku".toUpperCase();
            String recognizedBattleSpaces = "PAGSUF";

            // Must be of the atom type or it is not supported
            if (cotType.substring(0, 1).equals("a")) {
                retVal.append("S");

                // Convert affiliation
                String cotAffiliation = cotType.substring(2, 3).toUpperCase();

                // If the given CoT affiliation is within the set of recognized
                // affiliations
                // then the 2525 equivalent is simply the upper case of the same
                // character
                if (recognizedAffiliations.indexOf(cotAffiliation) > -1) {
                    retVal.append(cotAffiliation.toUpperCase());
                } else {
                    retVal.append("O"); // O=None specified
                }

                // Convert battle space dimension
                if (cotType.length() > 3) {
                    String cotBattleSpace = cotType.substring(4, 5).toUpperCase();
                    if (recognizedBattleSpaces.indexOf(cotBattleSpace) > -1) {
                        retVal.append(cotBattleSpace);
                    } else {
                        retVal.append("X"); // X=Other (no frame)
                    }
                } else
                    retVal.append("X");

                // All CoT types assumed Present (as opposed to
                // anticipated/planned)
                retVal.append("P");

                // All remaining capital letters in the string are 1:1
                // equivalents of 2525(b) codes (although not all 2525b codes
                // are used in CoT).
                for (int i = 6; i < cotType.length(); i += 2) {
                    String next = cotType.substring(i, i + 1);
                    if (next.equals(next.toUpperCase())) {
                        retVal.append(next);
                    } else {
                        break;
                    }
                }

                // Fill out the remainder of the string
                int fillLength = 15 - retVal.toString().length();
                for (int i = 0; i < fillLength; i++) {
                    retVal.append("-");
                }

                return retVal.toString();
            } else {
                return UNKNOWN_SYMBOL;
            }
        } catch (Exception generalException) {
            log.error(generalException);
        } finally {
        }

        return UNKNOWN_SYMBOL;
    }

    /*
     * load in the Type descriptions from C:\Program Files (x86)\Cursor on
     * Target\fbcb2d\CoTtypes.xml As an example we will go from: a-.-A-M-F-D To
     * something like this: AIRBORNE COMMAND POST (C2)
     */
    public static ArrayList<CoTTypeDef> getCoTTypeMap(InputStream mapInputStream)
            throws ParserConfigurationException, SAXException, IOException {

        ArrayList<CoTTypeDef> types = null;

        String content = getStringFromFile(mapInputStream);

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputSource source = new InputSource();
        source.setCharacterStream(new StringReader(content));
        Document doc = db.parse(source);
        NodeList nodeList = doc.getElementsByTagName("types");
        types = typeBreakdown(nodeList.item(0));
        return types;
    }

    /*
     * load in the descriptions from the specified file
     */
    private static String getStringFromFile(InputStream is) {
        StringBuffer strContent = new StringBuffer("");

        try {
            int ch;

            while ((ch = is.read()) != -1)
                strContent.append((char) ch);
            is.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return strContent.toString();

    }

    private static ArrayList<CoTTypeDef> typeBreakdown(Node n) {

        ArrayList<CoTTypeDef> hash = new ArrayList<CoTTypeDef>();

        try {

            String name = n.getNodeName();

            if (name.startsWith("#")) {
                // no match here
                return new ArrayList<CoTTypeDef>();

            }
            StringBuffer sb = new StringBuffer();
            sb.append('<').append(name);

            NamedNodeMap attrs = n.getAttributes();
            if (attrs != null) {

                if (attrs.getLength() >= 3 && name.equals("cot")) {
                    String zero = attrs.item(0).getNodeName();
                    String one = attrs.item(1).getNodeName();
                    String two = attrs.item(2).getNodeName();

                    // for some reason the attributes are not coming back in
                    // order. make sure we get the ones we want
                    int k = 0;
                    int v = 1;
                    if (zero.equals("cot")) {
                        k = 0;
                    } else if (one.equals("cot")) {
                        k = 1;
                    } else if (two.equals("cot")) {
                        k = 2;
                    }

                    if (zero.equals("desc")) {
                        v = 0;
                    } else if (one.equals("desc")) {
                        v = 1;
                    } else if (two.equals("desc")) {
                        v = 2;
                    }
                    hash.add(new CoTTypeDef("^" + attrs.item(k).getNodeValue() + "$", attrs.item(v).getNodeValue(),
                            false));

                } else if (attrs.getLength() == 2 && name.equals("cot")) {
                    String zero = attrs.item(0).getNodeName();

                    // make sure we are grabbing the elements in the right order
                    int k = 0;
                    int v = 1;
                    if (zero.equals("cot")) {
                        k = 0;
                        v = 1;
                    } else {
                        k = 1;
                        v = 0;
                    }
                    hash.add(new CoTTypeDef("^" + attrs.item(k).getNodeValue() + "$", attrs.item(v).getNodeValue(),
                            false));

                } else if (attrs.getLength() == 2 && name.equals("weapon")) {

                    String zero = attrs.item(0).getNodeName();

                    // make sure we are grabbing the elements in the right order
                    int k = 0;
                    int v = 1;
                    if (zero.equals("cot")) {
                        k = 0;
                        v = 1;
                    } else {
                        k = 1;
                        v = 0;
                    }
                    hash.add(new CoTTypeDef("^" + attrs.item(k).getNodeValue() + "$", attrs.item(v).getNodeValue(),
                            false));

                } else if (attrs.getLength() == 2 && name.equals("relation")) {

                    String zero = attrs.item(0).getNodeName();
                    // make sure we are grabbing the elements in the right order
                    int k = 0;
                    int v = 1;
                    if (zero.equals("cot")) {
                        k = 0;
                        v = 1;
                    } else {
                        k = 1;
                        v = 0;
                    }
                    hash.add(new CoTTypeDef("^" + attrs.item(k).getNodeValue() + "$", attrs.item(v).getNodeValue(),
                            false));

                } else if (attrs.getLength() == 2 && name.equals("how")) {

                    String zero = attrs.item(0).getNodeName();
                    // make sure we are grabbing the elements in the right order
                    int k = 0;
                    int v = 1;
                    if (zero.equals("value")) {
                        k = 0;
                        v = 1;
                    } else {
                        k = 1;
                        v = 0;
                    }

                    hash.add(new CoTTypeDef("^" + attrs.item(k).getNodeValue() + "$", attrs.item(v).getNodeValue(),
                            false));

                } else if (attrs.getLength() == 2 && name.equals("is")) {
                    String zero = attrs.item(0).getNodeName();
                    // make sure we are grabbing the elements in the right order
                    int k = 0;
                    int v = 1;
                    if (zero.equals("match")) {
                        k = 0;
                        v = 1;
                    } else {
                        k = 1;
                        v = 0;
                    }
                    String s = attrs.item(v).getNodeValue();
                    if (!(s.equals("true") || s.equals("false") || s.equals("spare") || s.equals("any")
                            || s.equals("atoms"))) {
                        hash.add(new CoTTypeDef(attrs.item(k).getNodeValue(), attrs.item(v).getNodeValue(), true));

                    }
                } else if (attrs.getLength() == 2 && name.equals("how")) {
                    String zero = attrs.item(0).getNodeName();
                    // make sure we are grabbing the elements in the right order
                    int k = 0;
                    int v = 1;
                    if (zero.equals("value")) {
                        k = 0;
                        v = 1;
                    } else {
                        k = 1;
                        v = 0;
                    }
                    String s = attrs.item(v).getNodeValue();
                    if (!(s.equals("true") || s.equals("false") || s.equals("spare") || s.equals("any")
                            || s.equals("atoms"))) {
                        hash.add(new CoTTypeDef(attrs.item(k).getNodeValue(), attrs.item(v).getNodeValue(), false));

                    }
                }

            }

            String textContent = null;
            NodeList children = n.getChildNodes();

            if (children.getLength() == 0) {
                if ((textContent = n.getTextContent()) != null && !"".equals(textContent)) {

                } else {

                }
            } else {

                boolean hasValidChildren = false;
                for (int i = 0; i < children.getLength(); i++) {
                    ArrayList<CoTTypeDef> childHash = typeBreakdown(children.item(i));

                    if (childHash.size() > 0) {

                        hash.addAll(childHash);
                        hasValidChildren = true;
                    }
                }

                if (!hasValidChildren && ((textContent = n.getTextContent()) != null)) {

                }

            }

            return hash;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return hash;
        }

    }

    public static Date parseCoTDate(String dateString) throws Exception {
        if (!dateString.isEmpty()) {
            DateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'");
            formatter1.setTimeZone(TimeZone.getTimeZone("Zulu"));
            DateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            formatter2.setTimeZone(TimeZone.getTimeZone("Zulu"));
            Date date = null;
            try {
                if (date == null)
                    date = (Date) formatter1.parse(dateString);
            } catch (ParseException ex) {
            }
            try {
                if (date == null)
                    date = (Date) formatter2.parse(dateString);
            } catch (ParseException ex) {
            }
            return date;
        }
        return null;
    }

}