/** * */ package org.jboss.tools.smooks.configuration.editors.utils; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.stream.StreamSource; import org.jboss.tools.smooks.configuration.editors.IXMLStructuredObject; import org.jboss.tools.smooks.configuration.editors.xml.TagList; import org.jboss.tools.smooks.configuration.editors.xml.XMLObjectAnalyzer; import org.jboss.tools.smooks.model.json12.Json12Package; import org.jboss.tools.smooks.model.json12.Json12Reader; import org.jboss.tools.smooks.model.smooks.AbstractReader; import org.jboss.tools.smooks.model.smooks.SmooksResourceListType; import org.milyn.Smooks; import org.milyn.cdr.Parameter; import org.milyn.json.JSONReaderConfigurator; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * @author Dart * */ public class JsonInputDataParser { public static final String LINK_JSON_READER = "linkJSONReader"; //$NON-NLS-1$ public static final String KEY = "_key_"; //$NON-NLS-1$ public static final String NULL_REPLACE = "nullReplace"; //$NON-NLS-1$ public static final String ENCODING2 = "encoding"; //$NON-NLS-1$ public static final String SPACE_REPLACE = "spaceReplace"; //$NON-NLS-1$ public static final String PREFIX_ON_NUMERIC = "prefixOnNumeric"; //$NON-NLS-1$ public static final String ILLEGAL_REPLACE = "illegalReplace"; //$NON-NLS-1$ public static final String INDENT = "indent"; //$NON-NLS-1$ public static final String ARRAY_ELEMENT_NAME = "arrayElementName"; //$NON-NLS-1$ public static final String ROOT_NAME = "rootName"; //$NON-NLS-1$ public IXMLStructuredObject parseJsonFile(InputStream inputStream, Object readerObj) throws ParserConfigurationException { String rootName = null; String arrayElementName = null; String keyWhitspaceReplacement = null; String keyPrefixOnNumeric = null; String illegalElementNameCharReplacement = null; String nullValueReplacement = null; String encoding = null; String indent = null; Map<String, String> keyMap = new HashMap<String, String>(); if (readerObj == null) return null; // if (readerObj instanceof JsonReader) { // JsonReader reader = (JsonReader) readerObj; // rootName = reader.getRootName(); // arrayElementName = reader.getArrayElementName(); // keyPrefixOnNumeric = reader.getKeyPrefixOnNumeric(); // keyWhitspaceReplacement = reader.getKeyWhitspaceReplacement(); // illegalElementNameCharReplacement = // reader.getIllegalElementNameCharReplacement(); // nullValueReplacement = reader.getNullValueReplacement(); // encoding = reader.getEncoding(); // KeyMap km = reader.getKeyMap(); // if (km != null) { // List<Key> keyList = km.getKey(); // for (Iterator<?> iterator = keyList.iterator(); iterator.hasNext();) // { // Key key = (Key) iterator.next(); // keyMap.put(key.getFrom(), key.getTo()); // } // } // } if (readerObj instanceof Json12Reader) { Json12Reader reader = (Json12Reader) readerObj; rootName = reader.getRootName(); arrayElementName = reader.getArrayElementName(); keyPrefixOnNumeric = reader.getKeyPrefixOnNumeric(); keyWhitspaceReplacement = reader.getKeyWhitspaceReplacement(); illegalElementNameCharReplacement = reader.getIllegalElementNameCharReplacement(); nullValueReplacement = reader.getNullValueReplacement(); encoding = reader.getEncoding(); boolean isSet = reader.eIsSet(Json12Package.Literals.JSON12_READER__INDENT); if (isSet) { indent = String.valueOf(reader.isIndent()); } org.jboss.tools.smooks.model.json12.KeyMap km = reader.getKeyMap(); if (km != null) { List<?> keyList = km.getKey(); for (Iterator<?> iterator = keyList.iterator(); iterator.hasNext();) { org.jboss.tools.smooks.model.json12.Key key = (org.jboss.tools.smooks.model.json12.Key) iterator .next(); keyMap.put(key.getFrom(), key.getTo()); } } } return this.parseJsonFile(inputStream, rootName, arrayElementName, keyWhitspaceReplacement, keyPrefixOnNumeric, illegalElementNameCharReplacement, nullValueReplacement, keyMap, indent, encoding); } public IXMLStructuredObject parseJsonFile(InputStream stream, SmooksResourceListType resourceList) throws FileNotFoundException, ParserConfigurationException, InvocationTargetException { List<AbstractReader> readers = resourceList.getAbstractReader(); int count = 0; int index = -1; for (Iterator<?> iterator2 = readers.iterator(); iterator2.hasNext();) { AbstractReader abstractReader = (AbstractReader) iterator2.next(); if (abstractReader instanceof Json12Reader) { count++; if (index == -1) { index = readers.indexOf(abstractReader); } } } if (count > 1) { // throw new // RuntimeException("The smooks config file should have only one JSON reader"); } if (index != -1) { return parseJsonFile(stream, readers.get(index)); } return null; } public IXMLStructuredObject parseJsonFile(String filePath, SmooksResourceListType resourceList) throws FileNotFoundException, ParserConfigurationException, InvocationTargetException { FileInputStream stream = new FileInputStream(filePath); return this.parseJsonFile(stream, resourceList); } public IXMLStructuredObject parseJsonFile(String filePath, String rootName, String arrayElementName, String keyWhitspaceReplacement, String keyPrefixOnNumeric, String illegalElementNameCharReplacement, String nullValueReplacement, Map<String, String> keyMap, String indent, String encoding) throws FileNotFoundException, ParserConfigurationException, InvocationTargetException { return this.parseJsonFile(new FileInputStream(SmooksUIUtils.parseFilePath(filePath)), rootName, arrayElementName, keyWhitspaceReplacement, keyPrefixOnNumeric, illegalElementNameCharReplacement, nullValueReplacement, keyMap, indent, encoding); } public IXMLStructuredObject parseJsonFile(InputStream inputStream, String rootName, String arrayElementName, String keyWhitspaceReplacement, String keyPrefixOnNumeric, String illegalElementNameCharReplacement, String nullValueReplacement, Map<String, String> keyMap, String indent, String encoding) throws ParserConfigurationException { Smooks smooks = new Smooks(); JSONReaderConfigurator readerConfig = new JSONReaderConfigurator(); if (arrayElementName != null) { readerConfig.setArrayElementName(arrayElementName); } if (rootName != null) { readerConfig.setRootName(rootName); } if (keyWhitspaceReplacement != null) { readerConfig.setKeyWhitspaceReplacement(keyWhitspaceReplacement); } if (keyPrefixOnNumeric != null) { readerConfig.setKeyPrefixOnNumeric(keyPrefixOnNumeric); } if (illegalElementNameCharReplacement != null) { readerConfig.setIllegalElementNameCharReplacement(illegalElementNameCharReplacement); } if (nullValueReplacement != null) { readerConfig.setNullValueReplacement(nullValueReplacement); } if (keyMap != null) { readerConfig.setKeyMap(keyMap); } readerConfig.setEncoding(Charset.forName(encoding)); if (indent != null) { // readerConfig.set } // readerConfig.setParameter(ENCODING2, encoding); smooks.setReaderConfig(readerConfig); // Use a DOM result to capture the message model for the supplied CSV // message... DOMResult result = new DOMResult(); // Filter the message through Smooks and capture the result as a DOM in // the domResult instance... smooks.filterSource(new StreamSource(inputStream), result); Document document = (Document) result.getNode(); XMLObjectAnalyzer analyzer = new XMLObjectAnalyzer(); TagList tagList = analyzer.analyze(document, null , null); try { if (smooks != null) { smooks.close(); smooks = null; } if (inputStream != null) { inputStream.close(); inputStream = null; } result = null; } catch (Throwable t) { // ignore // t.printStackTrace(); } return tagList; } protected Parameter keyMapToParameter(Map<String, String> keyMap) throws ParserConfigurationException { Parameter keyMapParam = new Parameter("keyMap", "dummyVal"); //$NON-NLS-1$ //$NON-NLS-2$ DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Element keyMapElement = docBuilder.newDocument().createElement("keyMap"); //$NON-NLS-1$ Set<Map.Entry<String, String>> keyMapEntries = keyMap.entrySet(); for (Map.Entry<String, String> keyMapEntry : keyMapEntries) { Element keyElement = keyMapElement.getOwnerDocument().createElementNS("*", "key"); //$NON-NLS-1$ //$NON-NLS-2$ keyElement.setAttribute("from", keyMapEntry.getKey()); //$NON-NLS-1$ keyElement.setAttribute("to", keyMapEntry.getValue()); //$NON-NLS-1$ keyMapElement.appendChild(keyElement); } keyMapParam.setXML(keyMapElement); return keyMapParam; } }