public void parse() throws IOException, SAXException { if(contentHandler == null) { throw new IllegalStateException("'contentHandler' not set. Cannot parse EDI stream."); } if(segmentReader == null) { throw new IllegalStateException("'bufferedSegmentReader' not set. Cannot parse EDI stream."); } if(edifactModel == null || edifactModel.getEdimap() == null) { throw new IllegalStateException("'mappingModel' not set. Cannot parse EDI stream."); } try { parse(true); } finally { contentHandler = null; } }
/** * Parse the supplied mapping model config stream and return the generated EdiMap. * <p/> * Can be used to set the mapping model to be used during the parsing operation. * See {@link #setMappingModel(org.milyn.edisax.model.EdifactModel)}. * @param mappingConfigStream Config stream. Must conform with the * <a href="http://www.milyn.org/schema/edi-message-mapping-1.0.xsd">edi-message-mapping-1.0.xsd</a> * schema. * @return The EdifactModel for the mapping model. * @throws IOException Error reading the model stream. * @throws SAXException Invalid model. * @throws EDIConfigurationException when edi-mapping-configuration is incorrect. */ public static EdifactModel parseMappingModel(Reader mappingConfigStream) throws IOException, SAXException, EDIConfigurationException { return parseMappingModel(mappingConfigStream, null, null, URIResourceLocator.getSystemBaseURI()); }
public EDIParser newParser(EdifactModel mappingModel) { EDIParser parser = new EDIParser(); parser.setContentHandler(contentHandler); parser.setMappingModel(mappingModel); parser.setBufferedSegmentReader(segmentReader); parser.setIndentDepth(indentDepth); parser.getFeatures().putAll(features); parser.setFeature(EDIParser.FEATURE_VALIDATE, validate); parser.setNamespaceDeclarationStack(namespaceDeclarationStack); return parser; }
public void mapControlSegment(Segment controlSegment, boolean clearSegmentBuffer) throws SAXException { controlSegmentParser.startElement(controlSegment, true); controlSegmentParser.mapFields(segmentReader.getCurrentSegmentFields(), controlSegment); controlSegmentParser.endElement(controlSegment, true); // And clear the buffer... we're finished with this data... if(clearSegmentBuffer) { segmentReader.getSegmentBuffer().setLength(0); } }
/** * Map a single segment based on the current set of segment fields read from input and the segment mapping * config that these fields should map to. * @param currentSegmentFields Current set of segment fields read from input. * @param expectedSegment The segment mapping config that the currentSegmentFields should map to. * @throws IOException Error reading an EDI segment from the input stream. This will happen as the segment * reader tries to move to the next segment after performing this mapping. * @throws SAXException EDI processing exception. */ private void mapSegment(String[] currentSegmentFields, Segment expectedSegment) throws IOException, SAXException { startElement(expectedSegment, true); mapFields(currentSegmentFields, expectedSegment); if(segmentReader.moveToNextSegment()) { mapSegments(expectedSegment.getSegments()); } endElement(expectedSegment, true); }
String[] currentFieldComponents = EDIUtils.split(fieldMessageVal, delimiters.getComponent(), delimiters.getEscape()); assertComponentsOK(expectedField, fieldIndex, segmentCode, expectedComponents, currentFieldComponents); if (currentFieldComponents.length > 0 || !ignoreEmptyNodes()) { startElement(expectedField, true); Component expectedComponent = expectedComponents.get(i); mapComponent(componentMessageVal, expectedComponent, fieldIndex, i, segmentCode, expectedField.getXmltag()); endElement(expectedField, true); if (fieldMessageVal.length() > 0 || !ignoreEmptyNodes()) { startElement(expectedField, true); writeToContentHandler(fieldMessageVal); endElement(expectedField, false);
this.namespaceDeclarationStack = namespaceDeclarationStack; controlSegmentParser = new EDIParser(); controlSegmentParser.setBufferedSegmentReader(segmentReader); controlSegmentParser.setContentHandler(contentHandler); controlSegmentParser.setIndentDepth(indentDepth); this.containerManagedNamespaceStack = true; controlSegmentParser.setNamespaceDeclarationStack(this.namespaceDeclarationStack); controlSegmentParser.setMappingModel(controlModel);
String[] currentComponentSubComponents = EDIUtils.split(componentMessageVal, delimiters.getSubComponent(), delimiters.getEscape()); assertSubComponentsOK(expectedComponent, fieldIndex, componentIndex, segmentCode, field, expectedSubComponents, currentComponentSubComponents); if (currentComponentSubComponents.length > 0 || !ignoreEmptyNodes()) { startElement(expectedComponent, true); for(int i = 0; i < currentComponentSubComponents.length; i++) { if(expectedSubComponents.get(i).isRequired() && currentComponentSubComponents[i].length() == 0) { startElement(expectedSubComponents.get(i), true); writeToContentHandler(currentComponentSubComponents[i]); endElement(expectedSubComponents.get(i), false); endElement(expectedComponent, true); if (componentMessageVal.length() > 0 || !ignoreEmptyNodes()) { startElement(expectedComponent, true); writeToContentHandler(componentMessageVal); endElement(expectedComponent, false);
if(isValidURI(ediMappingModel)) { URIResourceLocator resourceLocator = new URIResourceLocator(); URI importBaseURI; importBaseURI = URIResourceLocator.extractBaseURI(resourceURI); return parseMappingModel(getMappingConfigData(resourceLocator, ediMappingModel), mappingDescription, resourceURI, importBaseURI); } else { return parseMappingModel(new StringReader(ediMappingModel), mappingDescription, null, baseURI);
interchangeContext.getControlSegmentParser().startElement(InterchangeContext.INTERCHANGE_MESSAGE_BLOCK_ELEMENT_NAME, unhSegment.getNamespace(), true, attrs); interchangeContext.mapControlSegment(unhSegment, false); parser.parse(); } finally { segmentReader.setSegmentListener(null); segmentReader.getSegmentBuffer().setLength(0); interchangeContext.getControlSegmentParser().endElement(InterchangeContext.INTERCHANGE_MESSAGE_BLOCK_ELEMENT_NAME, unhSegment.getNamespace(), true);
public void process(InterchangeContext interchangeContext) throws IOException, SAXException { BufferedSegmentReader segmentReader = interchangeContext.getSegmentReader(); segmentReader.moveToNextSegment(false); String[] fields = segmentReader.getCurrentSegmentFields(); StringBuffer segBuffer = segmentReader.getSegmentBuffer(); char[] segChars = new char[segBuffer.length()]; segBuffer.getChars(0, segBuffer.length(), segChars, 0); interchangeContext.getControlSegmentParser().startElement(fields[0], interchangeContext.getNamespace(), true); interchangeContext.getControlSegmentParser().getContentHandler().characters(segChars, 0, segChars.length); interchangeContext.getControlSegmentParser().endElement(fields[0], interchangeContext.getNamespace(), false); // And clear out the buffer... segmentReader.getSegmentBuffer().setLength(0); } }
private void parse(boolean indent) throws SAXException, IOException, EDIParseException { startElement(edifactModel.getEdimap().getSegments(), indent); // Work through all the segments in the model. Move to the first segment before starting... if(segmentReader.moveToNextSegment()) { mapSegments(edifactModel.getEdimap().getSegments().getSegments()); // If we reach the end of the mapping model and we still have more EDI segments in the message.... while (segmentReader.hasCurrentSegment()) { if (!EMPTY_LINE.matcher(segmentReader.getSegmentBuffer().toString()).matches()) { throw new EDIParseException(edifactModel.getEdimap(), "Reached end of mapping model but there are more EDI segments in the incoming message. Read " + segmentReader.getCurrentSegmentNumber() + " segment(s). Current EDI segment is [" + segmentReader.getSegmentBuffer() + "]"); } segmentReader.moveToNextSegment(); } } // Fire the endDocument event, as well as the endElement event... endElement(edifactModel.getEdimap().getSegments(), true); }
/** * Parse an EDI InputSource. */ public void parse(InputSource ediInputSource) throws IOException, SAXException { if(contentHandler == null) { throw new IllegalStateException("'contentHandler' not set. Cannot parse EDI stream."); } if(edifactModel == null || edifactModel.getEdimap() == null) { throw new IllegalStateException("'mappingModel' not set. Cannot parse EDI stream."); } try { // Create a reader for reading the EDI segments... segmentReader = new BufferedSegmentReader(ediInputSource, edifactModel.getDelimiters()); segmentReader.setIgnoreNewLines(getFeature(FEATURE_IGNORE_NEWLINES)); // Initialize the indent counter... indentDepth = new MutableInt(0); // Fire the startDocument event, as well as the startElement event... contentHandler.startDocument(); parse(false); contentHandler.endDocument(); } finally { contentHandler = null; } }
public void process(InterchangeContext interchangeContext) throws IOException, SAXException { BufferedSegmentReader segmentReader = interchangeContext.getSegmentReader(); interchangeContext.getControlSegmentParser().startElement("group", ungSegment.getNamespace(), true); segmentReader.moveToNextSegment(false); interchangeContext.mapControlSegment(ungSegment, true); while(true) { String segCode = segmentReader.peek(3, true); if(segCode.equals("UNE")) { segmentReader.moveToNextSegment(false); interchangeContext.mapControlSegment(uneSegment, true); break; } else if(segCode.length() > 0) { ControlBlockHandler handler = interchangeContext.getControlBlockHandler(segCode); handler.process(interchangeContext); } else { throw new EDIParseException("Unexpected end of UN/EDIFACT data stream. If stream was reset (e.g. after read charset was changed), please make sure underlying stream was properly reset."); } } interchangeContext.getControlSegmentParser().endElement("group", ungSegment.getNamespace(), true); } }
assertFieldsOK(currentSegmentFields, segment); String[] repeatedFields = EDIUtils.split(fieldMessageVal, fieldRepeat, delimiters.getEscape()); for(String repeatedField : repeatedFields) { mapField(repeatedField, expectedField, i, segmentCode); mapField(fieldMessageVal, expectedField, i, segmentCode);
private boolean ignoreEmptyNodes() { if (ignoreEmptyNodes == null) { ignoreEmptyNodes = getFeature(FEATURE_IGNORE_EMPTY_NODES); } return ignoreEmptyNodes; }
public boolean getFeature(String name) { return getFeatures().get(name); }
public void endElement(MappingNode node, boolean indent) throws SAXException { if (node.getXmltag() != null) { endElement(node.getXmltag(), node.getNamespace(), indent); } }
String[] currentFieldComponents = EDIUtils.split(fieldMessageVal, delimiters.getComponent(), delimiters.getEscape()); assertComponentsOK(expectedField, fieldIndex, segmentCode, expectedComponents, currentFieldComponents); if (currentFieldComponents.length > 0 || !ignoreEmptyNodes()) { startElement(expectedField, true); Component expectedComponent = expectedComponents.get(i); mapComponent(componentMessageVal, expectedComponent, fieldIndex, i, segmentCode, expectedField.getXmltag()); endElement(expectedField, true); if (fieldMessageVal.length() > 0 || !ignoreEmptyNodes()) { startElement(expectedField, true); writeToContentHandler(fieldMessageVal); endElement(expectedField, false);
this.namespaceDeclarationStack = namespaceDeclarationStack; controlSegmentParser = new EDIParser(); controlSegmentParser.setBufferedSegmentReader(segmentReader); controlSegmentParser.setContentHandler(contentHandler); controlSegmentParser.setIndentDepth(indentDepth); this.containerManagedNamespaceStack = true; controlSegmentParser.setNamespaceDeclarationStack(this.namespaceDeclarationStack); controlSegmentParser.setMappingModel(controlModel);