private void changeReadEncoding(String code, BufferedSegmentReader bufferedSegmentReader) throws EDIParseException, IOException { Charset charset = toCharsetMapping.get(code.toUpperCase()); if(charset == null) { throw new EDIParseException("Unknown UN/EDIFACT character stream encoding code '" + code + "'."); } bufferedSegmentReader.changeEncoding(charset); } }
private int forwardPastWhitespace() throws IOException { return forwardPastWhitespace(readChar()); }
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); } }
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); } }
public void process(InterchangeContext interchangeContext) throws IOException, SAXException { Delimiters delimiters = new Delimiters(); BufferedSegmentReader segmentReader = interchangeContext.getSegmentReader(); // The UNA segment code is still in the segment buffer... clear it before // reading the segment delimiters... segmentReader.getSegmentBuffer().setLength(0); // Read the delimiter chars one-by-one and set in the Delimiters instance... // 1st char is the component ("sub-element") delimiter... delimiters.setComponent( segmentReader.read(1)); // 2nd char is the field ("data-element") delimiter... delimiters.setField( segmentReader.read(1)); // 3rd char is the decimal point indicator... delimiters.setDecimalSeparator(segmentReader.read(1)); // 4th char is the escape char ("release")... delimiters.setEscape( segmentReader.read(1)); // 5th char is reserved for future use... segmentReader.read(1); // 6th char is the segment delimiter... delimiters.setSegment( segmentReader.read(1)); interchangeContext.pushDelimiters(delimiters); } }
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); }
segmentReader.moveToNextSegment(false); String[] fields = segmentReader.getCurrentSegmentFields(); String messageName = fields[2]; EdifactModel mappingModel = registry.getMappingModel(messageName, segmentReader.getDelimiters()); Edimap ediMap = mappingModel.getEdimap(); EDIParser parser = interchangeContext.newParser(mappingModel); segmentReader.setSegmentListener(untSegmentListener); segmentReader.setSegmentListener(null); if(hierarchyChangeListener != null) { hierarchyChangeListener.detachXMLReader(); segmentReader.getSegmentBuffer().setLength(0);
Delimiters delimiters = segmentReader.getDelimiters(); String[] currentComponentSubComponents = EDIUtils.split(componentMessageVal, delimiters.getSubComponent(), delimiters.getEscape()); for(int i = 0; i < currentComponentSubComponents.length; i++) { if(expectedSubComponents.get(i).isRequired() && currentComponentSubComponents[i].length() == 0) { throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segmentCode + "], field " + (fieldIndex + 1) + " (" + field + "), component " + (componentIndex + 1) + " (" + expectedComponent.getXmltag() + "), sub-component " + (i + 1) + " (" + expectedSubComponents.get(i).getXmltag() + ") expected to contain a value. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedSubComponents.get(i), segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields()); throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segmentCode + "], field " + (fieldIndex + 1) + " (" + field + "), component " + (componentIndex + 1) + " (" + expectedComponent.getXmltag() + ") expected to contain a value. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedComponent, segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields());
public void process(InterchangeContext interchangeContext) throws IOException, SAXException { BufferedSegmentReader segmentReader = interchangeContext.getSegmentReader(); segmentReader.moveToNextSegment(false); String[] fields = segmentReader.getCurrentSegmentFields(); String[] syntaxIdComponents = EDIUtils.split(fields[1], segmentReader.getDelimiters().getComponent(), segmentReader.getDelimiters().getEscape()); String segCode = segmentReader.peek(3, true); segmentReader.moveToNextSegment(false); interchangeContext.mapControlSegment(unzSegment, true); break;
throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segmentCode + "], field " + (fieldIndex + 1) + " (" + field + "), component " + (componentIndex + 1) + " (" + expectedComponent.getXmltag() + ") expected to contain " + expectedSubComponents.size() + " sub-components. Actually contains " + currentComponentSubComponents.length + " sub-components. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedComponent, segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields());
BufferedSegmentReader segmentReader = new BufferedSegmentReader(unedifactInterchange, defaultUNEdifactDelimiters); boolean validate = getFeature(EDIParser.FEATURE_VALIDATE); String segCode; segmentReader.mark(); segmentReader.setIgnoreNewLines(getFeature(EDIParser.FEATURE_IGNORE_NEWLINES)); segCode = segmentReader.peek(3, true); if(segCode.length() == 3) { interchangeContext = createInterchangeContext(segmentReader, validate, handlerFactory, namespaceDeclarationStack);
/** * 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 boolean onSegment(BufferedSegmentReader bufferedSegmentReader) { String[] fields = bufferedSegmentReader.getCurrentSegmentFields(); // Stop the current segment consumer if we have reached the UNT segment i.e. // only return true if it's not UNT... return !fields[0].equals("UNT"); } }
/** * Get the current EDI segment fields. * @return The current EDI segment fields array. * @throws IllegalStateException No current Segment. */ public String[] getCurrentSegmentFields() throws IllegalStateException { assertCurrentSegmentExists(); if(currentSegmentFields == null) { currentSegmentFields = EDIUtils.split(segmentBuffer.toString(), currentDelimiters.getField(), currentDelimiters.getEscape()); // If the segment delimiter is a LF, strip off any preceding CR characters... if(currentDelimiters.getSegment().equals("\n")) { int endIndex = currentSegmentFields.length - 1; if(currentSegmentFields[endIndex].endsWith("\r")) { int stringLen = currentSegmentFields[endIndex].length(); currentSegmentFields[endIndex] = currentSegmentFields[endIndex].substring(0, stringLen - 1); } } } return currentSegmentFields; }
int numFieldsMapped = segment.getFields().size(); boolean ignoreUnmappedFields = segment.isIgnoreUnmappedFields(); Delimiters delimiters = segmentReader.getDelimiters(); String fieldRepeat = delimiters.getFieldRepeat(); for(int i = 0; i < numFields; i++) {
private void parse(boolean indent) throws SAXException, IOException, EDIParseException { boolean ignoreUnmappedSegment = edifactModel.getEdimap().isIgnoreUnmappedSegments(); 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() && !ignoreUnmappedSegment) { 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); }
segmentReader.moveToNextSegment(false); String[] fields = segmentReader.getCurrentSegmentFields(); String messageName = fields[2]; EdifactModel mappingModel = registry.getMappingModel(messageName, segmentReader.getDelimiters()); Edimap ediMap = mappingModel.getEdimap(); EDIParser parser = interchangeContext.newParser(mappingModel); segmentReader.setSegmentListener(untSegmentListener); segmentReader.setSegmentListener(null); if(hierarchyChangeListener != null) { hierarchyChangeListener.detachXMLReader(); segmentReader.getSegmentBuffer().setLength(0);
Delimiters delimiters = segmentReader.getDelimiters(); String[] currentComponentSubComponents = EDIUtils.split(componentMessageVal, delimiters.getSubComponent(), delimiters.getEscape()); for(int i = 0; i < currentComponentSubComponents.length; i++) { if(expectedSubComponents.get(i).isRequired() && currentComponentSubComponents[i].length() == 0) { throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segmentCode + "], field " + (fieldIndex + 1) + " (" + field + "), component " + (componentIndex + 1) + " (" + expectedComponent.getXmltag() + "), sub-component " + (i + 1) + " (" + expectedSubComponents.get(i).getXmltag() + ") expected to contain a value. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedSubComponents.get(i), segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields()); throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segmentCode + "], field " + (fieldIndex + 1) + " (" + field + "), component " + (componentIndex + 1) + " (" + expectedComponent.getXmltag() + ") expected to contain a value. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedComponent, segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields());
public void process(InterchangeContext interchangeContext) throws IOException, SAXException { BufferedSegmentReader segmentReader = interchangeContext.getSegmentReader(); segmentReader.moveToNextSegment(false); String[] fields = segmentReader.getCurrentSegmentFields(); String[] syntaxIdComponents = EDIUtils.split(fields[1], segmentReader.getDelimiters().getComponent(), segmentReader.getDelimiters().getEscape()); String segCode = segmentReader.peek(3, true); segmentReader.moveToNextSegment(false); interchangeContext.mapControlSegment(unzSegment, true); break;
throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segmentCode + "], field " + (fieldIndex + 1) + " (" + field + "), component " + (componentIndex + 1) + " (" + expectedComponent.getXmltag() + ") expected to contain " + expectedSubComponents.size() + " sub-components. Actually contains " + currentComponentSubComponents.length + " sub-components. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedComponent, segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields());