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; } }