private SegmentGroup createGroup(String id, String name, String mandatory, String maxOccurance, Map<String, String> definitions) { SegmentGroup group = new SegmentGroup(); group.setXmltag(XmlTagEncoder.encode(name.trim())); String test = definitions.get(id); group.setDocumentation(test.trim()); group.setMinOccurs(mandatory.equals("M") ? 1 : 0); group.setMaxOccurs(Integer.valueOf(maxOccurance)); return group; }
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; }
public Pattern getSegcodePattern() { return segments.get(0).getSegcodePattern(); }
private boolean digestSegmentGroup(Node currentNode, List<SegmentGroup> segmentGroupList, String namespacePrefix, MappingNode parent) throws EDIConfigurationException { if (currentNode.getNodeName().equalsIgnoreCase(namespacePrefix + "segmentGroup")) { SegmentGroup segment = new SegmentGroup(); segment.setDocumentation(getNodeValue(currentNode, namespacePrefix + "documentation")); segmentGroupList.add(segment); digestSegment(currentNode, segment, namespacePrefix, parent); return true; } else if (currentNode.getNodeName().equalsIgnoreCase(namespacePrefix + "segment")) { Segment segment = new Segment(); segmentGroupList.add(segment); digestSegment(currentNode, segment, namespacePrefix, parent); return true; } return false; }
int minOccurs = expectedSegmentGroup.getMinOccurs(); int maxOccurs = expectedSegmentGroup.getMaxOccurs(); if (!currentSegmentFields[0].equals(expectedSegmentGroup.getSegcode())) { Matcher matcher = expectedSegmentGroup.getSegcodePattern().matcher(segmentReader.getSegmentBuffer()); if (!matcher.matches()) { if (segmentProcessingCount < minOccurs) { throw new EDIParseException(edifactModel.getEdimap(), "Must be a minimum of " + minOccurs + " instances of segment [" + expectedSegmentGroup.getSegcode() + "]. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedSegmentGroup, segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields()); } else { throw new EDIParseException(edifactModel.getEdimap(), "Reached end of EDI message stream but there must be a minimum of " + minOccurs + " instances of segment [" + expectedSegmentGroup.getSegcode() + "]. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedSegmentGroup, segmentReader.getCurrentSegmentNumber(), null); } else { startElement(expectedSegmentGroup, true); mapSegments(expectedSegmentGroup.getSegments(), currentSegmentFields); endElement(expectedSegmentGroup, true); throw new EDIParseException(edifactModel.getEdimap(), "Reached end of EDI message stream but there must be a minimum of " + minOccurs + " instances of segment [" + expectedSegmentGroup.getSegcode() + "]. Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", expectedSegmentGroup, segmentReader.getCurrentSegmentNumber(), null);
/** * Convert {@link SegmentGroup} into {@link EReference} to the given * {@link EClass} * * @param grp * @param refClass * @return */ public static EReference segmentGroupToEReference(SegmentGroup grp, EClass refClass) { EReference reference = EcoreFactory.eINSTANCE.createEReference(); reference.setContainment(true); reference.setName(toJavaName(grp.getXmltag(), false)); reference.setEType(refClass); reference.setLowerBound(grp.getMinOccurs()); reference.setUpperBound(grp.getMaxOccurs()); addMappingInformation(reference, grp); annotate(reference, "minOccurs", String.valueOf(grp.getMinOccurs())); annotate(reference, "maxOccurs", String.valueOf(grp.getMaxOccurs())); annotate(reference, SmooksMetadata.ANNOTATION_TYPE_KEY, SmooksMetadata.SEGMENT_GROUP_TYPE); annotate(reference, SmooksMetadata.SEGCODE, grp.getSegcode()); return reference; }
segmentGroup.setMaxOccurs(getNodeValueAsInteger(node, "maxOccurs")); segmentGroup.setMinOccurs(getNodeValueAsInteger(node, "minOccurs")); setValuesForMappingNode(node, segmentGroup, namespacePrefix, parent); Node currentNode = nodes.item(i); digestSegmentGroup(currentNode, segmentGroup.getSegments(), namespacePrefix, segmentGroup);
private void applyImportOnSegments(List<SegmentGroup> segmentGroup, Import imp, Map<String, Segment> importedSegments) throws EDIParseException { for (SegmentGroup segment : segmentGroup) { if (segment instanceof Segment) { applyImportOnSegment((Segment) segment, imp, importedSegments); } if (segment.getSegments() != null) { applyImportOnSegments(segment.getSegments(), imp, importedSegments); } } }
/** * 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 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; }
SegmentGroup rootGroup = new SegmentGroup(); rootGroup.setXmltag(XmlTagEncoder.encode(type)); edimap.setSegments(rootGroup);
public String getSegcode() { return segments.get(0).getSegcode(); }
/** * Converting {@link SegmentGroup} to {@link EClass} * * @param grp * @return */ public static EClass segmentGroupToEClass(SegmentGroup grp) { EClass clazz = EcoreFactory.eINSTANCE.createEClass(); clazz.setName(toJavaName(grp.getXmltag(), true)); addMappingInformation(clazz, grp); return clazz; }
/** * Creates a Map given an Edimap. All segments in edimap are stored as * values in the Map with the corresponding segcode as key. * * @param edimap the edimap containing segments to be inserted into Map. * @return Map containing all segment in edimap. */ private Map<String, Segment> createImportMap(Edimap edimap) { HashMap<String, Segment> result = new HashMap<String, Segment>(); for (SegmentGroup segmentGroup : edimap.getSegments().getSegments()) { if (segmentGroup instanceof Segment) { result.put(((Segment) segmentGroup).getSegcode(), (Segment) segmentGroup); } } return result; }
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); }
/** * Creating mapping classes * * @param root * @param commonClasses * @return */ private Set<EClass> createMappingClases(SegmentGroup root, Map<String, EClass> commonClasses) { Set<EClass> result = new HashSet<EClass>(); EClass rootClass = ECoreConversionUtils.segmentGroupToEClass(root); // We need to change the name of the Root class so it is not // the same as name of the package rootClass.setName(rootClass.getName().toUpperCase()); result.add(rootClass); ExtendedMetaData.INSTANCE.setName(rootClass, rootClass.getName()); result.add(ECoreConversionUtils.createDocumentRoot(rootClass)); processSegments(root.getSegments(), commonClasses, result, rootClass); return result; }
String id = getLineId(lineNo, matcher.group(1)); SegmentGroup group = createGroup(id, matcher.group(2), matcher.group(3), matcher.group(4), definitions); parentGroup.getSegments().add(group); String id = getLineId(lineNo, matcher.group(1)); Segment segment = createSegment(id, matcher.group(2), matcher.group(3), matcher.group(4), matcher.group(5), definitions, isSplitIntoImport, useShortName, segmentDefinitions); parentGroup.getSegments().add(segment); return extractPlusCharacter(matcher.group(6)).length() - 1; } else if (line.matches(SEGMENT_REGULAR)) { if (!ignoreSegments.contains(matcher.group(2))) { Segment segment = createSegment(id, matcher.group(2), matcher.group(3), matcher.group(4), matcher.group(5), definitions, isSplitIntoImport, useShortName, segmentDefinitions); parentGroup.getSegments().add(segment); if (!ignoreSegments.contains(matcher.group(2))) { Segment segment = createSegment(id, segcode, description, matcher.group(2), matcher.group(3), definitions, isSplitIntoImport, useShortName, segmentDefinitions); parentGroup.getSegments().add(segment);
/** * This method converting classes for common mapping model * * @param commonModel * @param commonClasses * @param commonPackage */ private Collection<EClass> createCommonClasses(Edimap commonModel, final Map<String, EClass> commonClasses) { Map<String, EClass> result = new HashMap<String, EClass>(); for (SegmentGroup grp : commonModel.getSegments().getSegments()) { // No segment groups are allowed in common part Segment segment = (Segment) grp; EClass clazz = ECoreConversionUtils.segmentToEClass(segment); if (!segment.getFields().isEmpty()) { commonClasses.put(segment.getSegcode(), clazz); Collection<EStructuralFeature> fields = processFields( segment.getFields(), result); clazz.getEStructuralFeatures().addAll(fields); } result.put(clazz.getName(), clazz); } // Adding DocumentRoot EClass droot = ECoreConversionUtils.createDocumentRoot(null); result.put(droot.getName(), droot); return result.values(); }
private void addMissingDefinitions(Edimap definitionModel) { Segment ugh = new Segment(); Segment ugt = new Segment(); ugh.setSegcode("UGH"); ugh.setXmltag("UGH"); ugh.addField(new Field("id", UNEdifact41ControlBlockHandlerFactory.NAMESPACE, true)); ugt.setSegcode("UGT"); ugt.setXmltag("UGT"); ugt.addField(new Field("id", UNEdifact41ControlBlockHandlerFactory.NAMESPACE, true)); definitionModel.getSegments().getSegments().add(ugh); definitionModel.getSegments().getSegments().add(ugt); }
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); } }