public void printInfo(boolean printCoordinates) { System.out.printf( "%d, %s: %d parts, %d points", this.getRecordNumber(), this.getShapeType(), this.getNumberOfParts(), this.getNumberOfPoints()); for (Map.Entry<String, Object> a : this.getAttributes().getEntries()) { if (a.getKey() != null) System.out.printf(", %s", a.getKey()); if (a.getValue() != null) System.out.printf(", %s", a.getValue()); } System.out.println(); System.out.print("\tAttributes: "); for (Map.Entry<String, Object> entry : this.getAttributes().getEntries()) { System.out.printf("%s = %s, ", entry.getKey(), entry.getValue()); } System.out.println(); if (!printCoordinates) return; VecBuffer vb = this.getPointBuffer(0); for (LatLon ll : vb.getLocations()) { System.out.printf("\t%f, %f\n", ll.getLatitude().degrees, ll.getLongitude().degrees); } }
/** * Helper function that takes a Map of String, String where key contains the value of an evaluated * SynapsePath expression and value contains the type of SynapsePath in use. * * <p>It returns the type of conversion required (XML | JSON | String) based on the actual * returned value and the path type. * * @param entry * @return */ private String inferReplacementType(Map.Entry<String, String> entry) { if (entry.getValue().equals(SynapsePath.X_PATH) && isWellFormedXML(entry.getKey())) { return XML_TYPE; } else if (entry.getValue().equals(SynapsePath.X_PATH) && !isWellFormedXML(entry.getKey())) { return STRING_TYPE; } else if (entry.getValue().equals(SynapsePath.JSON_PATH) && isJson(entry.getKey())) { return JSON_TYPE; } else if (entry.getValue().equals(SynapsePath.JSON_PATH) && !isJson((entry.getKey()))) { return STRING_TYPE; } else { return STRING_TYPE; } }
public void exportAsXML(XMLStreamWriter xmlWriter) throws IOException, XMLStreamException { if (xmlWriter == null) { String message = Logging.getMessage("Export.UnsupportedOutputObject"); Logging.logger().warning(message); throw new IllegalArgumentException(message); } xmlWriter.writeStartElement("Record"); xmlWriter.writeAttribute("id", Integer.toString(this.getRecordNumber())); xmlWriter.writeAttribute( "shape", this.getShapeType().substring(this.getShapeType().lastIndexOf("Shape") + 5)); xmlWriter.writeAttribute("parts", Integer.toString(this.getNumberOfParts())); xmlWriter.writeAttribute("points", Integer.toString(this.getNumberOfPoints())); xmlWriter.writeCharacters("\n"); for (Map.Entry<String, Object> a : this.getAttributes().getEntries()) { xmlWriter.writeStartElement("Attribute"); xmlWriter.writeAttribute("name", a.getKey() != null ? a.getKey().toString() : ""); xmlWriter.writeAttribute("value", a.getValue() != null ? a.getValue().toString() : ""); xmlWriter.writeEndElement(); // Attribute xmlWriter.writeCharacters("\n"); } if (this.getNumberOfParts() > 0) { VecBuffer vb = this.getPointBuffer(0); for (LatLon ll : vb.getLocations()) { xmlWriter.writeStartElement("Point"); xmlWriter.writeAttribute("x", Double.toString(ll.getLatitude().degrees)); xmlWriter.writeAttribute("y", Double.toString(ll.getLongitude().degrees)); xmlWriter.writeEndElement(); // Point xmlWriter.writeCharacters("\n"); } } // TODO: export record-type specific fields xmlWriter.writeEndElement(); // Record }
/** * Replaces the payload format with SynapsePath arguments which are evaluated using * getArgValues(). * * @param format * @param result * @param synCtx */ private void replace(String format, StringBuffer result, MessageContext synCtx) { HashMap<String, String>[] argValues = getArgValues(synCtx); HashMap<String, String> replacement; Map.Entry<String, String> replacementEntry; String replacementValue = null; Matcher matcher; matcher = pattern.matcher(format); try { while (matcher.find()) { String matchSeq = matcher.group(); int argIndex; try { argIndex = Integer.parseInt(matchSeq.substring(1, matchSeq.length())); } catch (NumberFormatException e) { argIndex = Integer.parseInt(matchSeq.substring(2, matchSeq.length() - 1)); } replacement = argValues[argIndex - 1]; replacementEntry = replacement.entrySet().iterator().next(); if (mediaType.equals(JSON_TYPE) && inferReplacementType(replacementEntry).equals(XML_TYPE)) { // XML to JSON conversion here try { replacementValue = "<jsonObject>" + replacementEntry.getKey() + "</jsonObject>"; OMElement omXML = AXIOMUtil.stringToOM(replacementValue); replacementValue = JsonUtil.toJsonString(omXML) .toString() .replaceAll( ESCAPE_DOUBLE_QUOTE_WITH_FIVE_BACK_SLASHES, ESCAPE_DOUBLE_QUOTE_WITH_NINE_BACK_SLASHES) .replaceAll( ESCAPE_DOLLAR_WITH_TEN_BACK_SLASHES, ESCAPE_DOLLAR_WITH_SIX_BACK_SLASHES); replacementValue = JsonUtil.toJsonString(omXML).toString(); } catch (XMLStreamException e) { handleException( "Error parsing XML for JSON conversion, please check your xPath expressions return valid XML: ", synCtx); } catch (AxisFault e) { handleException("Error converting XML to JSON", synCtx); } } else if (mediaType.equals(XML_TYPE) && inferReplacementType(replacementEntry).equals(JSON_TYPE)) { // JSON to XML conversion here try { OMElement omXML = JsonUtil.toXml(IOUtils.toInputStream(replacementEntry.getKey()), false); if (JsonUtil.isAJsonPayloadElement(omXML)) { // remove <jsonObject/> from result. Iterator children = omXML.getChildElements(); String childrenStr = ""; while (children.hasNext()) { childrenStr += (children.next()).toString().trim(); } replacementValue = childrenStr; } else { /// ~ replacementValue = omXML.toString(); } // replacementValue = omXML.toString(); } catch (AxisFault e) { handleException( "Error converting JSON to XML, please check your JSON Path expressions return valid JSON: ", synCtx); } } else { // No conversion required, as path evaluates to regular String. replacementValue = replacementEntry.getKey(); // This is to replace " with \" and \\ with \\\\ if (mediaType.equals(JSON_TYPE) && inferReplacementType(replacementEntry).equals(STRING_TYPE) && (!replacementValue.startsWith("{") && !replacementValue.startsWith("["))) { replacementValue = replacementValue .replaceAll( Matcher.quoteReplacement("\\\\"), ESCAPE_BACK_SLASH_WITH_SIXTEEN_BACK_SLASHES) .replaceAll("\"", ESCAPE_DOUBLE_QUOTE_WITH_TEN_BACK_SLASHES); } else if ((mediaType.equals(JSON_TYPE) && inferReplacementType(replacementEntry).equals(JSON_TYPE)) && (!replacementValue.startsWith("{") && !replacementValue.startsWith("["))) { // This is to handle only the string value replacementValue = replacementValue.replaceAll("\"", ESCAPE_DOUBLE_QUOTE_WITH_TEN_BACK_SLASHES); } } matcher.appendReplacement(result, replacementValue); } } catch (ArrayIndexOutOfBoundsException e) { log.error("#replace. Mis-match detected between number of formatters and arguments", e); } matcher.appendTail(result); }