private Segment createSegment(String id, String segcode, String name, String mandatory, String maxOccurance, Map<String, String> definitions, boolean isSplitIntoImport, boolean useShortName, Map<String, Segment> segmentDefinitions) { Segment segment = new Segment(); name = name.trim(); segment.setName(name); segment.setSegcode(segcode); segment.setNodeTypeRef(agency + ":" + segcode); if (!isSplitIntoImport) { Segment importedSegment = segmentDefinitions.get(segcode); if(importedSegment == null) { throw new EdiParseException("Unknown segment code '" + segcode + "'."); } segment.getFields().addAll(importedSegment.getFields()); if (importedSegment.getSegments().size() > 0) { segment.getSegments().addAll(importedSegment.getSegments()); } } if (useShortName) { segment.setXmltag(segcode); } else { segment.setXmltag(XmlTagEncoder.encode(name.trim())); } segment.setDocumentation(definitions.get(id).trim()); segment.setMinOccurs(mandatory.equals("M") ? 1 : 0); segment.setMaxOccurs(Integer.valueOf(maxOccurance)); segment.setTruncatable(true); return segment; }
/** * Set values in {@link org.dhatim.edisax.model.internal.Segment}. * @param segment the {@link org.dhatim.edisax.model.internal.Segment} to populate. * @param node the Segment element. */ private void setValuesForSegment(Segment segment, Node node, String namespacePrefix, MappingNode parent) { segment.setMaxOccurs(getNodeValueAsInteger(node, "maxOccurs")); segment.setMinOccurs(getNodeValueAsInteger(node, "minOccurs")); segment.setSegcode(getAttributeValue(node, "segcode")); segment.setTruncatable(getNodeValueAsBoolean(node, "truncatable")); segment.setIgnoreUnmappedFields(getNodeValueAsBoolean(node, "ignoreUnmappedFields")); segment.setDescription(getAttributeValue(node, "description")); setValuesForMappingNode(node, segment, namespacePrefix, parent); if(segment.getNodeTypeRef() == null) { // Backward compatibility support. Schema pre v 1.4 supported a segref // on <segment>, which we thn generalised as nodeTypeRef for all node types. segment.setNodeTypeRef(getAttributeValue(node, "segref")); } }
/** * Converting {@link Segment} to {@link EClass} * * @param segment * @return */ public static EClass segmentToEClass(Segment segment) { EClass clazz = segmentGroupToEClass(segment); annotate(clazz, SmooksMetadata.SEGCODE, segment.getSegcode()); annotate(clazz, "segcodePattern", segment.getSegcodePattern() .toString()); annotate(clazz, "truncable", String.valueOf(segment.isTruncatable())); annotate(clazz, "ignoreUnmappedFields", String.valueOf(segment.isIgnoreUnmappedFields())); annotate(clazz, "description", segment.getDescription()); annotate(clazz, SmooksMetadata.ANNOTATION_TYPE_KEY, SmooksMetadata.SEGMENT_TYPE); return clazz; }
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); }
Segment segment = new Segment(); segment.setSegcode(segcode); segment.setName(name); if (useShortName) { segment.setXmltag(XmlTagEncoder.encode(segcode.trim())); } else { segment.setXmltag(XmlTagEncoder.encode(name.trim())); segment.setDescription(description); segment.setTruncatable(true);
segment.getFields().addAll(importedSegment.getFields()); segment.setImportXmlTag(importedSegment.getXmltag()); if (importedSegment.getSegments().size() > 0) { segment.getSegments().addAll(importedSegment.getSegments()); segment.setTruncatable(truncatableSegments); for (Field field : segment.getFields()) { field.setTruncatable(isTruncatable(truncatableFields, field.isTruncatable())); if (truncatableComponents != null) {
private void assertFieldsOK(String[] currentSegmentFields, Segment segment) throws EDIParseException { List<Field> expectedFields = segment.getFields(); if (segment.isTruncatable()) { int numFieldsMissing = numFieldsExpected - currentSegmentFields.length; for (int i = expectedFields.size() - 1; i > (expectedFields.size() - numFieldsMissing - 1); i--) { throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segment.getSegcode() + "] expected to contain " + (numFieldsExpected - 1) + " fields. Actually contains " + (currentSegmentFields.length - 1) + " fields (not including segment code). Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", segment, segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields()); if (segment.isIgnoreUnmappedFields()) { numberOfFieldsToValidate = numFieldsExpected; } else { throw new EDIParseException(edifactModel.getEdimap(), "Segment [" + segment.getSegcode() + "] expected to contain " + (numFieldsExpected - 1) + " fields. Actually contains " + (currentSegmentFields.length - 1) + " fields (not including segment code). Currently at segment number " + segmentReader.getCurrentSegmentNumber() + ".", segment, segmentReader.getCurrentSegmentNumber(), segmentReader.getCurrentSegmentFields());
String segmentCode = segment.getSegcode(); List<Field> expectedFields = segment.getFields(); int numFieldsMapped = segment.getFields().size(); boolean ignoreUnmappedFields = segment.isIgnoreUnmappedFields(); Delimiters delimiters = segmentReader.getDelimiters(); String fieldRepeat = delimiters.getFieldRepeat();
Segment segment = (Segment) arg0; EClass clazz = null; if (segment.getNodeTypeRef() == null) { if (!segment.getFields().isEmpty()) { commonClasses.put(segment.getSegcode(), clazz); Collection<EStructuralFeature> fields = processFields( segment.getFields(), commonClasses); clazz.getEStructuralFeatures().addAll(fields);
/** * 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(); }
segment.getFields().add(field); digestField(currentNode, field, namespacePrefix, segment); } else { digestSegmentGroup(currentNode, segment.getSegments(), namespacePrefix, segment);
public Segment addField(Field field) { getFields().add(field); return this; }
/** * Just cut out a local part from the fully qualified name * * @param segment * @return */ private String getLocalPart(Segment segment) { // TODO Fix this hack String ref = segment.getNodeTypeRef(); return ref.substring(ref.indexOf(":") + 1); } }
/** * 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; }
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; }
/** * 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); }
private static void addFieldToSegment(Map<String, Field> fields, Map<String, Component> componens, Segment segment, String id, boolean isMandatory) { if (id.toUpperCase().startsWith("C")) { segment.getFields().add(copyField(fields.get(id), isMandatory)); } else { segment.getFields().add(convertToField(componens.get(id), isMandatory)); } }
/** * Inserts data from imported segment into the importing segment. Continues * through all the child segments of the importing segment. * * @param segment the importing segment. * @param imp import information like url and namespace. * @param importedSegments the imported segment. * @throws EDIParseException Thrown when a segref attribute in importing * segment contains a value not located in the imported segment but with the * namespace referencing the imported file. */ private void applyImportOnSegment(Segment segment, Import imp, Map<String, Segment> importedSegments) throws EDIParseException { if (segment.getNodeTypeRef() != null && segment.getNodeTypeRef().startsWith(imp.getNamespace() + ":")) { String key = segment.getNodeTypeRef().substring(segment.getNodeTypeRef().indexOf(':') + 1); Segment importedSegment = importedSegments.get(key); if (importedSegment == null) { throw new EDIParseException(edimap, "Referenced segment [" + key + "] does not exist in imported edi-message-mapping [" + imp.getResource() + "]"); } insertImportedSegmentInfo(segment, importedSegment, imp.isTruncatableSegments(), imp.isTruncatableFields(), imp.isTruncatableComponents()); } }
/** * Converts {@link Segment} to {@link EReference} * * @param segment * @param refClass * @return */ public static EReference segmentToEReference(Segment segment, EClass refClass) { EReference reference = segmentGroupToEReference(segment, refClass); annotate(reference, SmooksMetadata.ANNOTATION_TYPE_KEY, SmooksMetadata.SEGMENT_TYPE); annotate(reference, SmooksMetadata.SEGCODE, segment.getSegcode()); String name = segment.getSegcode(); char lastChar = reference.getName().charAt(reference.getName().length() - 1); if (Character.isDigit(lastChar)) { name = name + lastChar; } reference.setName(name); return reference; }
private void addChildSegments(SegmentGroup segmentGroup, Element parentSegment) { List<SegmentGroup> childSegments = segmentGroup.getSegments(); for(SegmentGroup childSegment : childSegments) { Element segmentEl; if(childSegment instanceof Segment) { segmentEl = newElement("segment", parentSegment, childSegment); mapBeanProperties(childSegment, segmentEl, "segcode", "nodeTypeRef", "description", "ignoreUnmappedFields", "truncatable"); addFields(((Segment)childSegment).getFields(), segmentEl); } else { segmentEl = newElement("segmentGroup", parentSegment, childSegment); } mapBeanProperties(childSegment, segmentEl, "name", "xmltag", "minOccurs", "maxOccurs"); addChildSegments(childSegment, segmentEl); } }