private void write(Edimap edimap) { Element edimapEl = newElement("edimap", doc); addImports(edimap.getImports(), edimapEl); addDescription(edimap.getDescription(), edimapEl); addDelimiters(edimap.getDelimiters(), edimapEl); SegmentGroup segments = edimap.getSegments(); Element segmentsEl = newElement("segments", edimapEl, segments); mapBeanProperties(segments, segmentsEl, "name", "xmltag"); addChildSegments(segments, segmentsEl); }
public static void write(Segment segment, Writer writer) throws IOException { Edimap ediMap = new Edimap(); SegmentGroup segments = new SegmentGroup(); segments.getSegments().add(segment); ediMap.setSegments(segments); ediMap.setDelimiters(UNEdifactInterchangeParser.defaultUNEdifactDelimiters); ediMap.setDescription(new Description().setName("TODO").setVersion("TODO")); write(ediMap, writer); }
public static Edimap parse(Reader dataReader, Reader compositeReader, Reader segmentReader, boolean useShortName) throws IOException, EdiParseException { Map<String, Component> datas = UnEdifactDefinitionReader.readComponents(dataReader, useShortName); Map<String, Field> composites = UnEdifactDefinitionReader.readFields(compositeReader, datas, useShortName); List<Segment> segments = UnEdifactDefinitionReader.readSegments(segmentReader, composites, datas, useShortName); Edimap edimap = new Edimap(); edimap.setSegments(new SegmentGroup()); edimap.getSegments().getSegments().addAll(segments); return edimap; }
agency = getValue(breader, MESSAGE_AGENCY); edimap = new Edimap(); SegmentGroup rootGroup = new SegmentGroup(); rootGroup.setXmltag(XmlTagEncoder.encode(type)); edimap.setSegments(rootGroup); delimiters.setSubComponent(DELIMITER_NOT_USED); delimiters.setEscape(ESCAPE); edimap.setDelimiters(delimiters); edimap.setDescription(new Description()); edimap.getDescription().setName(type); edimap.getDescription().setVersion(version + ":" + release + ":" + agency); edimap.getDescription().setNamespace(ControlBlockHandlerFactory.NAMESPACE_ROOT + ":" + agency.toLowerCase() + ":" + version.toLowerCase() + release.toLowerCase() + ":" + type.toLowerCase()); Import ediImport = new Import(); ediImport.setNamespace(agency); ediImport.setResource(definitionModel.getDescription().getName() + ".xml"); // TODO: Review with B�rd edimap.getImports().add(ediImport); } else { segmentDefinitions = getSegmentDefinitions(definitionModel);
/** * Digest attributes and child elements of Segments element. Populates Segments. * @param node the Segments element. * @param edimap the {@link org.dhatim.edisax.model.internal.Edimap} to populate. * @param namespacePrefix the prefix used to name elements in xml. * @throws org.dhatim.edisax.EDIConfigurationException is thrown when values are badly formatted. */ private void digestSegments(Node node, Edimap edimap, String namespacePrefix) throws EDIConfigurationException { SegmentGroup segments = new SegmentGroup(); setValuesForMappingNode(node, segments, namespacePrefix, null); segments.setNamespace(edimap.getDescription().getNamespace()); edimap.setSegments(segments); edimap.setIgnoreUnmappedSegments(getNodeValueAsBoolean(node, "ignoreUnmappedSegments")); NodeList nodes = node.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { Node currentNode = nodes.item(i); digestSegmentGroup(currentNode, edimap.getSegments().getSegments(), namespacePrefix, segments); } }
public Description getDescription() { if (description != null) { return description; } return getEdimap().getDescription(); }
Description desc = mapModel.getDescription(); pkg.setName(desc.getName().toLowerCase()); pkg.setNsPrefix(desc.getName().toLowerCase()); pkg.setNsURI(desc.getNamespace()); if (mapModel.getSrc() != null) { annotate(pkg, "src", mapModel.getSrc().toASCIIString()); annotate(pkg, "description.name", mapModel.getDescription().getName()); annotate(pkg, "description.version", mapModel.getDescription() .getVersion()); annotate(pkg, "delimeters.segment", mapModel.getDelimiters() .getSegment()); annotate(pkg, "delimeters.component", mapModel.getDelimiters() .getComponent()); annotate(pkg, "delimeters.field", mapModel.getDelimiters().getField()); annotate(pkg, "delimeters.fieldRepeat", mapModel.getDelimiters() .getFieldRepeat()); annotate(pkg, "delimeters.escape", mapModel.getDelimiters().getEscape()); annotate(pkg, "delimeters.ignoreCLRF", String.valueOf(mapModel.getDelimiters().ignoreCRLF())); return pkg;
private Edimap parseEDIDefinitionFiles() throws IOException, EdiParseException { Edimap edifactModel; Reader dataISR = null; Reader compositeISR = null; Reader segmentISR = null; try { dataISR = new InputStreamReader(new ByteArrayInputStream(definitionFiles.get("eded."))); compositeISR = new InputStreamReader(new ByteArrayInputStream(definitionFiles.get("edcd."))); segmentISR = new InputStreamReader(new ByteArrayInputStream(definitionFiles.get("edsd."))); edifactModel = UnEdifactDefinitionReader.parse(dataISR, compositeISR, segmentISR, useShortName); edifactModel.setDescription((Description) EDIUtils.MODEL_SET_DEFINITIONS_DESCRIPTION.clone()); edifactModel.getSegments().setXmltag("DefinitionMap"); edifactModel.setDelimiters(UNEdifactInterchangeParser.defaultUNEdifactDelimiters); } finally { if (dataISR != null) { dataISR.close(); } if (compositeISR != null) { compositeISR.close(); } if (segmentISR != null) { segmentISR.close(); } } return edifactModel; }
public UnEdifactSpecificationReader(ZipInputStream specificationInStream, boolean useImport, boolean useShortName) throws IOException { this.useImport = useImport; this.useShortName = useShortName; definitionFiles = new HashMap<String, byte[]>(); messageFiles = new HashMap<String, byte[]>(); readDefinitionEntries(specificationInStream, new ZipDirectoryEntry("eded.", definitionFiles), new ZipDirectoryEntry("edcd.", definitionFiles), new ZipDirectoryEntry("edsd.", definitionFiles), new ZipDirectoryEntry("edmd.", "*", messageFiles)); if (versions.size() != 1) { if (versions.size() == 0) { throw new EdiParseException("Seems that we have a directory containing 0 parseable version inside: " + versions + ".\n All messages:\n\t" + messages); } throw new EdiParseException("Seems that we have a directory containing more than one parseable version inside: " + versions + ".\n All messages:\n\t" + messages); } String version = versions.iterator().next(); // Read Definition Configuration definitionModel = parseEDIDefinitionFiles(); addMissingDefinitions(definitionModel); definitionModel.getDescription().setNamespace(ControlBlockHandlerFactory.NAMESPACE_ROOT + ":un:" + version + ":common"); //Interchange envelope is inserted into the definitions. Handcoded at the moment. try { String interchangeSegmentDefinitions = INTERCHANGE_DEFINITION_SHORTNAME; if (!useShortName) { interchangeSegmentDefinitions = INTERCHANGE_DEFINITION; } EdifactModel interchangeEnvelope = new EdifactModel(ClassUtil.getResourceAsStream(interchangeSegmentDefinitions, this.getClass())); definitionModel.getSegments().getSegments().addAll(interchangeEnvelope.getEdimap().getSegments().getSegments()); } catch (Exception e) { throw new EdiParseException(e.getMessage(), e); } }
private static void addModel(Edimap model, String pathPrefix, StringBuilder modelListBuilder, StringWriter messageEntryWriter, Archive archive) throws IOException { Description modelDesc = model.getDescription(); String messageEntryPath = pathPrefix + "/" + modelDesc.getName() + ".xml"; // Generate the mapping model for this message... messageEntryWriter.getBuffer().setLength(0); model.write(messageEntryWriter); // Add the generated mapping model to the archive... archive.addEntry(messageEntryPath, messageEntryWriter.toString()); // Add this messages archive entry to the mapping model list file... modelListBuilder.append("/" + messageEntryPath); modelListBuilder.append("!" + modelDesc.getName()); modelListBuilder.append("!" + modelDesc.getVersion()); modelListBuilder.append("!" + modelDesc.getNamespace()); modelListBuilder.append("\n"); }
Node<String> child, conflictNode; for (Import imp : edimap.getImports()) { URI importUri = imp.getResourceURI(); Map<String, Segment> importedSegments = null; applyImportOnSegments(edimap.getSegments().getSegments(), imp, importedSegments); edimap.getImports().clear();
private Map<String, Segment> getSegmentDefinitions(Edimap definitionModel) { Map<String, Segment> result = new HashMap<String, Segment>(); for (SegmentGroup segmentGroup : definitionModel.getSegments().getSegments()) { result.put(segmentGroup.getSegcode(), (Segment)segmentGroup); } return result; }
Edimap controlMap = new Edimap(); EdifactModel controlModel = new EdifactModel(controlMap); controlMap.setDescription(new Description().setName("EDI Message Interchange Control Model").setVersion("N/A")); controlSegmentParser.setMappingModel(controlModel);
/** * Returns the delimiters used in edifact format. * * @return delimiters. */ public Delimiters getDelimiters() { return getEdimap().getDelimiters(); }
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); }
private Edimap digestEDIConfig(Document configDoc) throws SAXException, EDIConfigurationException, IOException { XsdDOMValidator validator = new XsdDOMValidator(configDoc); if (validator.getNamespaces().size() == 0) { throw new EDIConfigurationException("The edi-message-mapping configuration must contain a namespace."); } if (validator.getNamespaces().size() > 1) { throw new EDIConfigurationException("Unsupported use of multiple configuration namespaces from inside the edi-message-mapping configuration."); } String ediNS = validator.getNamespaces().get(0).toString(); validator.validate(); Edimap edimap = new Edimap(modelURI); if(assertValidXSD(ediNS)) { digestXSDValidatedConfig(configDoc, edimap, ediNS); } else { throw new SAXException("Cannot parse edi-message-mapping configuration. Unsupported default Namespace '" + ediNS + "'."); } return edimap; }
/** * Digest attributes of Import element and populate Import. * @param node the Import element. * @param edimap the {@link org.dhatim.edisax.model.internal.Edimap} to populate. */ private void digestImport(Node node, Edimap edimap) { Import edimapImport = new Import(); edimap.getImports().add(edimapImport); URI resourceURI = importLocator.resolveURI(getAttributeValue(node, "resource")); edimapImport.setResourceURI(resourceURI); edimapImport.setNamespace(getAttributeValue(node, "namespace")); edimapImport.setTruncatableFields(getNodeValueAsBoolean(node, "truncatableFields")); edimapImport.setTruncatableComponents(getNodeValueAsBoolean(node, "truncatableComponents")); edimapImport.setTruncatableSegments(getNodeValueAsBoolean(node, "truncatableSegments")); }
/** * Digest attributes of Description element and populate Description. * @param node the Description element. * @param edimap the {@link org.dhatim.edisax.model.internal.Edimap} to populate. */ private static void digestDescription(Node node, Edimap edimap) { Description description = new Description(); edimap.setDescription(description); description.setName(getAttributeValue(node, "name")); description.setVersion(getAttributeValue(node, "version")); String namespace = getAttributeValue(node, "namespace"); if (namespace != null) { description.setNamespace(namespace); } else { description.setNamespace(XMLConstants.NULL_NS_URI); } }
/** * Digest attributes of Delimiter element and populate Delimiter. * @param node the Delimiter element. * @param edimap the {@link org.dhatim.edisax.model.internal.Edimap} to populate. */ private static void digestDelimiters(Node node, Edimap edimap) { Delimiters delimiters = new Delimiters(); edimap.setDelimiters(delimiters); delimiters.setSegment(getAttributeValue(node, "segment")); delimiters.setField(getAttributeValue(node, "field")); delimiters.setFieldRepeat(getAttributeValue(node, "fieldRepeat")); delimiters.setComponent(getAttributeValue(node, "component")); delimiters.setSubComponent(getAttributeValue(node, "sub-component")); delimiters.setEscape(getAttributeValue(node, "escape")); delimiters.setDecimalSeparator(getAttributeValue(node, "decimalSeparator")); }
public Set<String> getMessageNames() { Set<String> names = new LinkedHashSet<String>(); names.add(definitionModel.getDescription().getName()); names.addAll(messageFiles.keySet()); return names; }