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; }
/** * 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; }
/** * Set values in {@link org.milyn.edisax.model.internal.Segment}. * @param segment the {@link org.milyn.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")); } }
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.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 = 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().add(field); digestField(currentNode, field, namespacePrefix, segment); } else { digestSegmentGroup(currentNode, segment.getSegments(), namespacePrefix, segment);
public Segment addField(Field field) { getFields().add(field); return this; }
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(); }
private JClass getCommonType(MappingNode mappingNode, String nodeTypeRef, Map<MappingNode, JClass> typeSet) { Set<Map.Entry<MappingNode, JClass>> commonTypes = typeSet.entrySet(); for(Map.Entry<MappingNode, JClass> typeEntry : commonTypes) { MappingNode entryMappingNode = typeEntry.getKey(); String entryNodeTypeRef = entryMappingNode.getNodeTypeRef(); if(entryMappingNode instanceof Segment) { if(nodeTypeRef.equals(((Segment)entryMappingNode).getSegcode())) { return typeEntry.getValue(); } } else if(entryNodeTypeRef != null && entryMappingNode.getClass() == mappingNode.getClass()) { // Must be the same node type exactly... if(nodeTypeRef.equals(entryNodeTypeRef)) { return typeEntry.getValue(); } } } return null; }
/** * 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); } }
/** * 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 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; }
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.getFields().add(field); digestField(currentNode, field, namespacePrefix, segment); } else { digestSegmentGroup(currentNode, segment.getSegments(), namespacePrefix, segment);