Skip to content

Commit 76c6be2

Browse files
committed
Add fj-xml-to-json dep
1 parent 873a369 commit 76c6be2

File tree

9 files changed

+97
-211
lines changed

9 files changed

+97
-211
lines changed

fj-doc-base-json/pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@
4141
</dependency>
4242

4343
<dependency>
44-
<groupId>com.fasterxml.jackson.core</groupId>
45-
<artifactId>jackson-databind</artifactId>
46-
</dependency>
47-
44+
<groupId>org.fugerit.java</groupId>
45+
<artifactId>fj-xml-to-json</artifactId>
46+
</dependency>
47+
4848
</dependencies>
4949

5050
<organization>
@@ -54,4 +54,4 @@
5454

5555
<url>https://www.fugerit.org/perm/venus/</url>
5656

57-
</project>
57+
</project>

fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocJsonParser.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
import org.fugerit.java.doc.base.model.DocBase;
88
import org.fugerit.java.doc.base.parser.AbstractDocParser;
99
import org.fugerit.java.doc.base.parser.DocValidationResult;
10-
11-
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import org.fugerit.java.xml2json.XmlToJsonHandler;
1211

1312
public class DocJsonParser extends AbstractDocParser {
1413

1514
private DocObjectMapperHelper helper;
1615

17-
public DocJsonParser() {
16+
public DocJsonParser( XmlToJsonHandler handler ) {
1817
super( DocFacadeSource.SOURCE_TYPE_JSON );
19-
this.helper = new DocObjectMapperHelper( new ObjectMapper() );
18+
this.helper = new DocObjectMapperHelper( handler );
19+
}
20+
21+
public DocJsonParser() {
22+
this( new XmlToJsonHandler() );
2023
}
2124

2225
private DocObjectMapperHelper getHelper() {

fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocJsonToXml.java

Lines changed: 15 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,78 +2,31 @@
22

33
import java.io.Reader;
44
import java.io.Writer;
5-
import java.util.Iterator;
6-
7-
import javax.xml.parsers.DocumentBuilder;
8-
import javax.xml.parsers.DocumentBuilderFactory;
95

106
import org.fugerit.java.core.cfg.ConfigException;
7+
import org.fugerit.java.core.lang.helpers.StringUtils;
118
import org.fugerit.java.core.xml.dom.DOMIO;
12-
import org.fugerit.java.doc.base.facade.DocFacade;
13-
import org.fugerit.java.doc.base.parser.DocParserContext;
14-
import org.w3c.dom.Document;
9+
import org.fugerit.java.xml2json.XmlToJsonHandler;
1510
import org.w3c.dom.Element;
1611

1712
import com.fasterxml.jackson.databind.JsonNode;
1813
import com.fasterxml.jackson.databind.ObjectMapper;
1914

2015
public class DocJsonToXml {
2116

17+
private XmlToJsonHandler handler;
18+
2219
public DocJsonToXml() {
2320
this( new ObjectMapper() );
2421
}
2522

2623
public DocJsonToXml(ObjectMapper mapper) {
27-
super();
28-
this.mapper = mapper;
24+
this( new XmlToJsonHandler( mapper ) );
2925
}
3026

31-
private ObjectMapper mapper;
32-
33-
private void iterateElement( JsonNode current, Document doc, Element tag ) throws ConfigException {
34-
JsonNode elementsNode = current.get( DocObjectMapperHelper.PROPERTY_ELEMENTS );
35-
if ( elementsNode != null ) {
36-
if ( elementsNode.isArray() ) {
37-
Iterator<JsonNode> itElements = elementsNode.elements();
38-
while ( itElements.hasNext() ) {
39-
JsonNode currentElement = itElements.next();
40-
this.create(doc, tag, currentElement);
41-
}
42-
} else {
43-
throw new ConfigException( "Property must be an array : "+elementsNode );
44-
}
45-
}
46-
}
47-
48-
private void iterateAttribute( JsonNode current, Element tag ) {
49-
Iterator<String> itNames = current.fieldNames();
50-
while ( itNames.hasNext() ) {
51-
String currentName = itNames.next();
52-
if ( !DocObjectMapperHelper.isSpecialProperty( currentName ) ) {
53-
tag.setAttribute( currentName , current.get( currentName ).asText() );
54-
}
55-
}
56-
}
57-
58-
private Element create( Document doc, Element parent, JsonNode current ) throws ConfigException {
59-
Element tag = null;
60-
JsonNode tagNode = current.get( DocObjectMapperHelper.PROPERTY_TAG );
61-
if ( tagNode == null ) {
62-
throw new ConfigException( "Tag node is null : "+DocObjectMapperHelper.PROPERTY_TAG );
63-
} else {
64-
String tagName = tagNode.asText();
65-
tag = doc.createElement( tagName );
66-
if ( parent != null ) {
67-
parent.appendChild( tag );
68-
}
69-
JsonNode textNode = current.get( DocObjectMapperHelper.PROPERTY_TEXT );
70-
if ( textNode != null ) {
71-
tag.appendChild( doc.createTextNode( textNode.asText() ) );
72-
}
73-
this.iterateElement(current, doc, tag);
74-
this.iterateAttribute(current, tag);
75-
}
76-
return tag;
27+
public DocJsonToXml(XmlToJsonHandler handler) {
28+
super();
29+
this.handler = handler;
7730
}
7831

7932
public void writerAsXml( Reader jsonReader, Writer writer ) throws ConfigException {
@@ -85,26 +38,18 @@ public void writerAsXml( Reader jsonReader, Writer writer ) throws ConfigExcepti
8538

8639
public Element convertToElement( Reader jsonReader ) throws ConfigException {
8740
return ConfigException.get( () -> {
88-
JsonNode node = this.mapper.readTree( jsonReader );
41+
JsonNode node = this.handler.getMapper().readTree( jsonReader );
8942
return this.convert(node);
9043
} );
9144
}
9245

9346
public Element convert( JsonNode json ) throws ConfigException {
94-
return ConfigException.get( () -> {
95-
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
96-
dbf.setNamespaceAware( true );
97-
dbf.setValidating( false );
98-
DocumentBuilder builder = dbf.newDocumentBuilder();
99-
Document doc = builder.newDocument();
100-
Element root = this.create(doc, null, json);
101-
root.setAttribute( "xmlns" , DocFacade.SYSTEM_ID );
102-
root.setAttribute( "xmlns:xsi" , "http://www.w3.org/2001/XMLSchema-instance" );
103-
String xsdVersion = DocObjectMapperHelper.findVersion(json, DocFacade.CURRENT_VERSION) ;
104-
root.setAttribute( "xsi:schemaLocation" , DocParserContext.createXsdVersionXmlns(xsdVersion) );
105-
return root;
106-
} );
107-
47+
Element root = this.handler.convert(json);
48+
String xsdVersion = root.getAttribute( DocObjectMapperHelper.PROPERTY_XSD_VERSION );
49+
if ( StringUtils.isNotEmpty( xsdVersion ) ) {
50+
root.removeAttribute( DocObjectMapperHelper.PROPERTY_XSD_VERSION );
51+
}
52+
return root;
10853
}
10954

11055
}

fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocObjectMapperHelper.java

Lines changed: 27 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -4,100 +4,57 @@
44
import java.io.ByteArrayOutputStream;
55
import java.io.InputStreamReader;
66
import java.io.Reader;
7+
import java.io.StringReader;
8+
import java.io.StringWriter;
9+
import java.util.Arrays;
710
import java.util.HashSet;
8-
import java.util.Iterator;
9-
import java.util.Properties;
1011
import java.util.Set;
1112

12-
import org.fugerit.java.core.lang.helpers.StringUtils;
1313
import org.fugerit.java.core.xml.dom.DOMIO;
1414
import org.fugerit.java.doc.base.config.DocException;
15-
import org.fugerit.java.doc.base.facade.DocFacade;
1615
import org.fugerit.java.doc.base.model.DocBase;
17-
import org.fugerit.java.doc.base.parser.DocParserContext;
1816
import org.fugerit.java.doc.base.parser.DocValidationResult;
1917
import org.fugerit.java.doc.base.xml.DocXmlParser;
18+
import org.fugerit.java.xml2json.XmlToJsonConverter;
19+
import org.fugerit.java.xml2json.XmlToJsonHandler;
2020
import org.w3c.dom.Element;
2121

22-
import com.fasterxml.jackson.databind.JsonNode;
2322
import com.fasterxml.jackson.databind.ObjectMapper;
2423

2524
import lombok.extern.slf4j.Slf4j;
2625

2726
@Slf4j
2827
public class DocObjectMapperHelper {
28+
29+
private XmlToJsonHandler handler;
2930

30-
public DocObjectMapperHelper(ObjectMapper mapper) {
31+
public DocObjectMapperHelper(XmlToJsonHandler handler) {
3132
super();
32-
this.mapper = mapper;
33+
this.handler = handler;
3334
}
34-
35-
private ObjectMapper mapper;
3635

37-
public static final String PROPERTY_TAG = "_t";
36+
public DocObjectMapperHelper(ObjectMapper mapper) {
37+
this( new XmlToJsonHandler( mapper ) );
38+
}
39+
40+
public static final String PROPERTY_TAG = XmlToJsonConverter.DEF_PROPERTY_TAG;
3841

39-
public static final String PROPERTY_TEXT = "_v";
42+
public static final String PROPERTY_TEXT = XmlToJsonConverter.DEF_PROPERTY_TEXT;
4043

41-
public static final String PROPERTY_ELEMENTS = "_e";
44+
public static final String PROPERTY_ELEMENTS = XmlToJsonConverter.DEF_PROPERTY_ELEMENTS;
4245

4346
public static final String PROPERTY_XSD_VERSION = "xsd-version";
4447

45-
private static final Set<String> SPECIAL_PROPERTY_NAMES = new HashSet<>();
46-
static {
47-
SPECIAL_PROPERTY_NAMES.add( PROPERTY_TAG );
48-
SPECIAL_PROPERTY_NAMES.add( PROPERTY_TEXT );
49-
SPECIAL_PROPERTY_NAMES.add( PROPERTY_ELEMENTS );
50-
SPECIAL_PROPERTY_NAMES.add( PROPERTY_XSD_VERSION );
51-
}
52-
48+
private static final Set<String> SPECIAL_PROPERTY_NAMES = new HashSet<>( Arrays.asList( PROPERTY_TAG, PROPERTY_ELEMENTS, PROPERTY_TAG, PROPERTY_XSD_VERSION ) );
49+
5350
public static boolean isSpecialProperty( String propertyName ) {
5451
return SPECIAL_PROPERTY_NAMES.contains(propertyName);
5552
}
56-
57-
public static String findVersion( JsonNode root, String def ) {
58-
String res = def;
59-
JsonNode xsdVersion = root.get( PROPERTY_XSD_VERSION );
60-
if ( xsdVersion != null ) {
61-
res = xsdVersion.asText();
62-
}
63-
return res;
64-
}
65-
66-
private void handleElement( JsonNode node, DocParserContext context ) {
67-
Iterator<String> fieldsNames = node.fieldNames();
68-
Properties props = new Properties();
69-
String qName = null;
70-
String text = null;
71-
Iterator<JsonNode> elements = null;
72-
while ( fieldsNames.hasNext() ) {
73-
String currentName = fieldsNames.next();
74-
JsonNode currentValue = node.get( currentName );
75-
if ( PROPERTY_TEXT.equalsIgnoreCase( currentName ) ) {
76-
text = currentValue.asText();
77-
} else if ( PROPERTY_TAG.equalsIgnoreCase( currentName ) ) {
78-
qName = currentValue.asText();
79-
} else if ( PROPERTY_ELEMENTS.equalsIgnoreCase( currentName ) ) {
80-
elements = currentValue.elements();
81-
} else {
82-
props.setProperty( currentName , currentValue.asText() );
83-
}
84-
}
85-
context.handleStartElement(qName, props);
86-
if ( StringUtils.isNotEmpty( text ) ) {
87-
context.handleText(text);
88-
}
89-
if ( elements != null ) {
90-
while ( elements.hasNext() ) {
91-
this.handleElement( elements.next() , context );
92-
}
93-
}
94-
context.handleEndElement(qName);
95-
}
9653

9754
public DocValidationResult validateWorkerResult(Reader reader, boolean parseVersion) throws DocException {
9855
return DocException.get( () -> {
9956
DocValidationResult result = DocValidationResult.newDefaultNotDefinedResult();
100-
DocJsonToXml convert = new DocJsonToXml( this.mapper );
57+
DocJsonToXml convert = new DocJsonToXml( this.handler.getMapper() );
10158
Element root = convert.convertToElement( reader );
10259
try ( ByteArrayOutputStream buffer = new ByteArrayOutputStream() ) {
10360
DOMIO.writeDOMIndent(root, buffer);
@@ -120,14 +77,15 @@ public DocValidationResult validateWorkerResult(Reader reader, boolean parseVers
12077

12178
public DocBase parse(Reader reader) throws DocException {
12279
return DocException.get( () -> {
123-
DocParserContext context = new DocParserContext();
124-
context.startDocument();
125-
JsonNode root = this.mapper.readTree( reader );
126-
this.handleElement(root, context);
127-
context.endDocument();
80+
DocBase docBase = null;
81+
try ( StringWriter writer = new StringWriter() ) {
82+
this.handler.writerAsXml( reader , writer );
83+
try ( StringReader xml = new StringReader( writer.toString() ) ) {
84+
DocXmlParser parser = new DocXmlParser();
85+
docBase = parser.parse( xml );
86+
}
87+
}
12888
log.debug( "Parse done!" );
129-
DocBase docBase = context.getDocBase();
130-
docBase.setXsdVersion( findVersion(root, DocFacade.CURRENT_VERSION) );
13189
return docBase;
13290
});
13391
}
Lines changed: 9 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,31 @@
11
package org.fugerit.java.doc.json.parse;
22

33
import java.io.Reader;
4-
import java.util.ArrayList;
5-
import java.util.List;
6-
import java.util.Properties;
74

85
import org.fugerit.java.core.cfg.ConfigException;
9-
import org.fugerit.java.core.lang.helpers.StringUtils;
106
import org.fugerit.java.core.xml.dom.DOMIO;
11-
import org.fugerit.java.core.xml.dom.DOMUtils;
7+
import org.fugerit.java.xml2json.XmlToJsonHandler;
128
import org.w3c.dom.Document;
139
import org.w3c.dom.Element;
14-
import org.w3c.dom.Node;
15-
import org.w3c.dom.NodeList;
16-
import org.w3c.dom.Text;
1710

1811
import com.fasterxml.jackson.databind.JsonNode;
1912
import com.fasterxml.jackson.databind.ObjectMapper;
20-
import com.fasterxml.jackson.databind.node.ArrayNode;
21-
import com.fasterxml.jackson.databind.node.ObjectNode;
2213

2314
public class DocXmlToJson {
2415

16+
private XmlToJsonHandler hanlder;
17+
2518
public DocXmlToJson() {
2619
this( new ObjectMapper() );
2720
}
2821

2922
public DocXmlToJson(ObjectMapper mapper) {
30-
super();
31-
this.mapper = mapper;
23+
this( new XmlToJsonHandler( mapper ) );
3224
}
33-
34-
private ObjectMapper mapper;
35-
36-
private ObjectNode create( Element currentTag, ObjectNode currentNode ) throws Exception {
37-
// mapping normal properties
38-
Properties props = DOMUtils.attributesToProperties( currentTag );
39-
for ( Object k : props.keySet() ) {
40-
String key = String.valueOf( k );
41-
currentNode.put( key , props.getProperty( key ));
42-
}
43-
// adding special properties
44-
currentNode.put( DocObjectMapperHelper.PROPERTY_TAG , currentTag.getTagName() );
45-
if ( currentTag.hasChildNodes() ) {
46-
NodeList list = currentTag.getChildNodes();
47-
List<ObjectNode> kids = new ArrayList<>();
48-
StringBuilder textBuffer = new StringBuilder();
49-
for ( int k=0; k<list.getLength(); k++ ) {
50-
Node currentTagChild = list.item( k );
51-
if ( currentTagChild instanceof Element ) {
52-
kids.add( this.create((Element)currentTagChild, this.mapper.createObjectNode()) );
53-
} else if ( currentTagChild instanceof Text ) {
54-
textBuffer.append( ((Text)currentTagChild).getTextContent() );
55-
}
56-
}
57-
if ( !kids.isEmpty() ) {
58-
ArrayNode kidsNode = this.mapper.createArrayNode();
59-
for ( ObjectNode currentKid : kids ) {
60-
kidsNode.add( currentKid );
61-
}
62-
currentNode.set( DocObjectMapperHelper.PROPERTY_ELEMENTS, kidsNode );
63-
}
64-
String text = textBuffer.toString();
65-
if ( StringUtils.isNotEmpty( text ) ) {
66-
currentNode.put( DocObjectMapperHelper.PROPERTY_TEXT, text );
67-
}
68-
}
69-
return currentNode;
25+
26+
public DocXmlToJson(XmlToJsonHandler handler) {
27+
super();
28+
this.hanlder = handler;
7029
}
7130

7231
public JsonNode convertToJsonNode( Reader xml ) throws ConfigException {
@@ -78,7 +37,7 @@ public JsonNode convertToJsonNode( Reader xml ) throws ConfigException {
7837
}
7938

8039
public JsonNode convert( Element root ) throws ConfigException {
81-
return ConfigException.get( () -> this.create( root, this.mapper.createObjectNode() ) );
40+
return ConfigException.get( () -> this.hanlder.convert( root ) );
8241
}
8342

8443
}

0 commit comments

Comments
 (0)