Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 411377 | Differences between
and this patch

Collapse All | Expand All

(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java (-1 / +2 lines)
Lines 88-94 public class XMLCompositeCollectionMappingNodeValue extends XMLRelationshipMappi Link Here
88
        } else {
88
        } else {
89
        	return marshalRecord.emptyCollection(xPathFragment, namespaceResolver, xmlCompositeCollectionMapping.getWrapperNullPolicy() != null);
89
        	return marshalRecord.emptyCollection(xPathFragment, namespaceResolver, xmlCompositeCollectionMapping.getWrapperNullPolicy() != null);
90
        }
90
        }
91
        marshalRecord.startCollection(); 
91
        
92
        
92
        
93
        int size =marshalRecord.getCycleDetectionStack().size(); 
93
        int size =marshalRecord.getCycleDetectionStack().size(); 
94
        //when writing the collection need to see if any of the objects we are writing are in the parent collection inverse ref
94
        //when writing the collection need to see if any of the objects we are writing are in the parent collection inverse ref
Lines 98-103 public class XMLCompositeCollectionMappingNodeValue extends XMLRelationshipMappi Link Here
98
        		return false;
98
        		return false;
99
        	}
99
        	}
100
         }
100
         }
101
        marshalRecord.startCollection(); 
101
        iterator = cp.iteratorFor(collection);
102
        iterator = cp.iteratorFor(collection);
102
        while (cp.hasNext(iterator)) {
103
        while (cp.hasNext(iterator)) {
103
            Object objectValue = cp.next(iterator, session);
104
            Object objectValue = cp.next(iterator, session);
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/XMLMarshaller.java (-1 / +4 lines)
Lines 40-45 import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession; Link Here
40
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
40
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
41
import org.eclipse.persistence.internal.oxm.mappings.Field;
41
import org.eclipse.persistence.internal.oxm.mappings.Field;
42
import org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecord;
42
import org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecord;
43
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
43
import org.eclipse.persistence.internal.oxm.record.namespaces.PrefixMapperNamespaceResolver;
44
import org.eclipse.persistence.internal.oxm.record.namespaces.PrefixMapperNamespaceResolver;
44
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
45
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
45
import org.eclipse.persistence.oxm.JSONWithPadding;
46
import org.eclipse.persistence.oxm.JSONWithPadding;
Lines 1004-1010 public abstract class XMLMarshaller< Link Here
1004
        } else if (result instanceof SAXResult) {
1005
        } else if (result instanceof SAXResult) {
1005
            SAXResult saxResult = (SAXResult) result;
1006
            SAXResult saxResult = (SAXResult) result;
1006
            marshal(object, saxResult.getHandler());
1007
            marshal(object, saxResult.getHandler());
1007
        } else {
1008
        } else if (result instanceof ExtendedResult){           
1009
            marshal(object, ((ExtendedResult)result).createRecord(), session, xmlDescriptor, isXMLRoot);
1010
        }else {
1008
            if (result.getClass().equals(staxResultClass)) {
1011
            if (result.getClass().equals(staxResultClass)) {
1009
                try {
1012
                try {
1010
                    Object xmlStreamWriter = PrivilegedAccessHelper.invokeMethod(staxResultGetStreamWriterMethod, result);
1013
                    Object xmlStreamWriter = PrivilegedAccessHelper.invokeMethod(staxResultGetStreamWriterMethod, result);
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/record/ExtendedResult.java (+32 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
3
 * This program and the accompanying materials are made available under the
4
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
5
 * which accompanies this distribution.
6
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
7
 * and the Eclipse Distribution License is available at
8
 * http://www.eclipse.org/org/documents/edl-v10.php.
9
 *
10
 * Contributors:
11
 *     Denise Smith - 2.6 - initial implementation
12
 ******************************************************************************/
13
package org.eclipse.persistence.internal.oxm.record;
14
15
import javax.xml.transform.Result;
16
17
public abstract class ExtendedResult implements Result {
18
19
    private String systemId;
20
21
    public abstract org.eclipse.persistence.oxm.record.MarshalRecord createRecord();
22
    
23
    @Override
24
    public void setSystemId(String systemId) {
25
        this.systemId = systemId;        
26
    }
27
28
    @Override
29
    public String getSystemId() {
30
        return systemId;
31
    }
32
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/record/json/JsonStructureReader.java (-116 / +2 lines)
Lines 40-109 import javax.xml.namespace.QName; Link Here
40
40
41
import org.eclipse.persistence.exceptions.XMLMarshalException;
41
import org.eclipse.persistence.exceptions.XMLMarshalException;
42
import org.eclipse.persistence.internal.oxm.CollectionGroupingElementNodeValue;
42
import org.eclipse.persistence.internal.oxm.CollectionGroupingElementNodeValue;
43
import org.eclipse.persistence.internal.oxm.ConversionManager;
44
import org.eclipse.persistence.internal.oxm.Constants;
43
import org.eclipse.persistence.internal.oxm.Constants;
45
import org.eclipse.persistence.internal.oxm.ContainerValue;
44
import org.eclipse.persistence.internal.oxm.ContainerValue;
46
import org.eclipse.persistence.internal.oxm.MappingNodeValue;
45
import org.eclipse.persistence.internal.oxm.MappingNodeValue;
47
import org.eclipse.persistence.internal.oxm.MediaType;
48
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
46
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
49
import org.eclipse.persistence.internal.oxm.NodeValue;
47
import org.eclipse.persistence.internal.oxm.NodeValue;
50
import org.eclipse.persistence.internal.oxm.Root;
48
import org.eclipse.persistence.internal.oxm.Root;
51
import org.eclipse.persistence.internal.oxm.Unmarshaller;
49
import org.eclipse.persistence.internal.oxm.Unmarshaller;
52
import org.eclipse.persistence.internal.oxm.XPathFragment;
50
import org.eclipse.persistence.internal.oxm.XPathFragment;
53
import org.eclipse.persistence.internal.oxm.mappings.Field;
54
import org.eclipse.persistence.internal.oxm.record.AbstractUnmarshalRecord;
55
import org.eclipse.persistence.internal.oxm.record.SAXUnmarshallerHandler;
51
import org.eclipse.persistence.internal.oxm.record.SAXUnmarshallerHandler;
56
import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
52
import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
57
import org.eclipse.persistence.internal.oxm.XPathNode;
53
import org.eclipse.persistence.internal.oxm.XPathNode;
58
import org.eclipse.persistence.internal.oxm.record.XMLReaderAdapter;
59
import org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler;
54
import org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler;
60
import org.eclipse.persistence.oxm.mappings.nullpolicy.AbstractNullPolicy;
61
import org.eclipse.persistence.oxm.record.XMLRootRecord;
55
import org.eclipse.persistence.oxm.record.XMLRootRecord;
62
import org.xml.sax.ErrorHandler;
63
import org.xml.sax.InputSource;
56
import org.xml.sax.InputSource;
64
import org.xml.sax.SAXException;
57
import org.xml.sax.SAXException;
65
import org.xml.sax.helpers.AttributesImpl;
58
import org.xml.sax.helpers.AttributesImpl;
66
59
67
public class JsonStructureReader extends XMLReaderAdapter {
60
public class JsonStructureReader extends JsonPReader {
68
61
69
    private static final String TRUE = "true";
70
    private static final String FALSE = "false";
71
    private String attributePrefix = null;
72
    private NamespaceResolver namespaces = null;
73
    private boolean includeRoot;
74
    private String textWrapper;
75
    private Class unmarshalClass;
76
    private boolean isInCollection;
77
    private JsonStructure jsonStructure;
62
    private JsonStructure jsonStructure;
78
    private JsonAttributes attributes = new JsonAttributes();
63
    private JsonAttributes attributes = new JsonAttributes();
79
64
80
81
    public JsonStructureReader(Unmarshaller u) {
65
    public JsonStructureReader(Unmarshaller u) {
82
        this(u, null);        
66
        this(u, null);        
83
    }
67
    }
84
    
68
    
85
    public JsonStructureReader(Unmarshaller u, Class clazz) {
69
    public JsonStructureReader(Unmarshaller u, Class clazz) {
86
        this(u.getAttributePrefix(), u.getNamespaceResolver(), u.getNamespaceResolver() != null, u.isIncludeRoot(), u.getNamespaceSeparator(), u.getErrorHandler(), u.getValueWrapper(), clazz);
70
        super(u.getAttributePrefix(), u.getNamespaceResolver(), u.getNamespaceResolver() != null, u.isIncludeRoot(), u.getNamespaceSeparator(), u.getErrorHandler(), u.getValueWrapper(), clazz);
87
    }
88
89
    private JsonStructureReader(String attrPrefix, NamespaceResolver nr,boolean namespaceAware, boolean includeRoot,Character namespaceSeparator, ErrorHandler errorHandler, String textWrapper, Class unmarshalClass) {
90
        this.attributePrefix = attrPrefix;
91
        if (attributePrefix == Constants.EMPTY_STRING) {
92
            attributePrefix = null;
93
        }
94
        namespaces = nr;
95
        this.namespaceAware = namespaceAware;
96
        if (namespaceSeparator == null) {
97
            this.namespaceSeparator = Constants.DOT;
98
        } else {
99
            this.namespaceSeparator = namespaceSeparator;
100
        }
101
        this.includeRoot = includeRoot;
102
        this.setErrorHandler(errorHandler);
103
        this.textWrapper = textWrapper;
104
        this.unmarshalClass = unmarshalClass;
105
    }
71
    }
106
    
107
72
108
    public void setJsonStructure(JsonStructure jsonStructure) {
73
    public void setJsonStructure(JsonStructure jsonStructure) {
109
        this.jsonStructure = jsonStructure;
74
        this.jsonStructure = jsonStructure;
Lines 152-168 public class JsonStructureReader extends XMLReaderAdapter { Link Here
152
        }
117
        }
153
    }
118
    }
154
119
155
    @Override
156
    public void parse(String systemId) {
157
        try {
158
            parse(new InputSource(systemId));
159
        } catch (IOException e) {
160
            throw XMLMarshalException.unmarshalException(e);
161
        } catch (SAXException e) {
162
            throw XMLMarshalException.unmarshalException(e);
163
        }
164
    }
165
166
    public void parseRoot(JsonValue jsonValue) throws SAXException {
120
    public void parseRoot(JsonValue jsonValue) throws SAXException {
167
        if (namespaces != null) {
121
        if (namespaces != null) {
168
            Map<String, String> namespacePairs = namespaces.getPrefixesToNamespaces();
122
            Map<String, String> namespacePairs = namespaces.getPrefixesToNamespaces();
Lines 453-526 public class JsonStructureReader extends XMLReaderAdapter { Link Here
453
407
454
    }
408
    }
455
409
456
    public boolean isNullRepresentedByXsiNil(AbstractNullPolicy nullPolicy) {
457
        return true;
458
    }
459
460
    private void startCollection() {
461
        isInCollection = true;
462
    }
463
464
    private void endCollection() {
465
        isInCollection = false;
466
    }
467
468
    public boolean isInCollection() {
469
        return isInCollection;
470
    }
471
472
    private boolean isTextValue(String localName) {
473
        XPathNode currentNode = ((UnmarshalRecord) contentHandler).getXPathNode();
474
        if (currentNode == null) {
475
            return textWrapper != null && textWrapper.equals(localName);
476
        }
477
478
        return ((currentNode.getNonAttributeChildrenMap() == null || currentNode.getNonAttributeChildrenMap().size() == 0 || (currentNode.getNonAttributeChildrenMap().size() == 1 && currentNode.getTextNode() != null))&& textWrapper != null && textWrapper.equals(localName));
479
    }
480
481
    @Override
482
    public Object convertValueBasedOnSchemaType(Field xmlField, Object value, ConversionManager conversionManager, AbstractUnmarshalRecord record) {
483
        if (xmlField.getSchemaType() != null) {
484
            if (Constants.QNAME_QNAME.equals(xmlField.getSchemaType())) {
485
                String stringValue = (String) value;
486
                int indexOpen = stringValue.indexOf('{');
487
                int indexClose = stringValue.indexOf('}');
488
                String uri = null;
489
                String localName = null;
490
                if (indexOpen > -1 && indexClose > -1) {
491
                    uri = stringValue.substring(indexOpen + 1, indexClose);
492
                    localName = stringValue.substring(indexClose + 1);
493
                } else {
494
                    QName obj = (QName) xmlField.convertValueBasedOnSchemaType(stringValue, conversionManager, record);
495
                    localName = obj.getLocalPart();
496
                    uri = obj.getNamespaceURI();
497
                }
498
                if (uri != null) {
499
                    return new QName(uri, localName);
500
                } else {
501
                    return new QName(localName);
502
                }
503
            } else {
504
                Class fieldType = xmlField.getType();
505
                if (fieldType == null) {
506
                    fieldType = xmlField.getJavaClass(xmlField.getSchemaType());
507
                }
508
                return conversionManager.convertObject(value, fieldType, xmlField.getSchemaType());
509
            }
510
        }
511
        return value;
512
    }
513
514
    /**
515
     * INTERNAL: The MediaType associated with this reader
516
     * 
517
     * @return
518
     */
519
    @Override
520
    public MediaType getMediaType() {
521
        return Constants.APPLICATION_JSON;
522
    }
523
524
    private static class JsonAttributes extends IndexedAttributeList {
410
    private static class JsonAttributes extends IndexedAttributeList {
525
411
526
        private JsonValue value;
412
        private JsonValue value;
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/XMLMarshaller.java (-2 / +22 lines)
Lines 12-17 Link Here
12
 ******************************************************************************/
12
 ******************************************************************************/
13
package org.eclipse.persistence.oxm;
13
package org.eclipse.persistence.oxm;
14
14
15
import java.util.Collection;
15
import java.util.Properties;
16
import java.util.Properties;
16
17
17
import javax.xml.transform.Result;
18
import javax.xml.transform.Result;
Lines 23-28 import org.eclipse.persistence.internal.oxm.Root; Link Here
23
import org.eclipse.persistence.internal.oxm.TreeObjectBuilder;
24
import org.eclipse.persistence.internal.oxm.TreeObjectBuilder;
24
import org.eclipse.persistence.internal.oxm.XMLObjectBuilder;
25
import org.eclipse.persistence.internal.oxm.XMLObjectBuilder;
25
import org.eclipse.persistence.internal.oxm.XPathEngine;
26
import org.eclipse.persistence.internal.oxm.XPathEngine;
27
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
26
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
28
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
27
import org.eclipse.persistence.internal.sessions.AbstractSession;
29
import org.eclipse.persistence.internal.sessions.AbstractSession;
28
import org.eclipse.persistence.oxm.documentpreservation.DocumentPreservationPolicy;
30
import org.eclipse.persistence.oxm.documentpreservation.DocumentPreservationPolicy;
Lines 139-146 public class XMLMarshaller extends org.eclipse.persistence.internal.oxm.XMLMarsh Link Here
139
            }
141
            }
140
        }else{
142
        }else{
141
            Class objectClass = object.getClass();
143
            Class objectClass = object.getClass();
142
            session = context.getSession(objectClass);
144
            if(result instanceof ExtendedResult){
143
            xmlDescriptor = getDescriptor(objectClass, session);
145
                MarshalRecord writerRecord = ((ExtendedResult)result).createRecord();
146
                if(object instanceof Collection){
147
                    writerRecord.startCollection();
148
                    for(Object o : (Collection) object) {                        
149
                        marshal(o, writerRecord);
150
                    }
151
                    writerRecord.endCollection();
152
                    return;
153
                }else{
154
                    marshal(object, writerRecord);
155
                    return;
156
                }
157
            }
158
            if(session == null || xmlDescriptor == null){
159
                session = context.getSession(objectClass);
160
                xmlDescriptor = getDescriptor(objectClass, session);
161
            }
162
            
163
            
144
        }
164
        }
145
165
146
        //if this is a simple xml root, the session and descriptor will be null
166
        //if this is a simple xml root, the session and descriptor will be null
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/json/JsonArrayBuilderResult.java (+42 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
3
 * This program and the accompanying materials are made available under the
4
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
5
 * which accompanies this distribution.
6
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
7
 * and the Eclipse Distribution License is available at
8
 * http://www.eclipse.org/org/documents/edl-v10.php.
9
 *
10
 * Contributors:
11
 *     Denise Smith - 2.6 - initial implementation
12
 ******************************************************************************/
13
package org.eclipse.persistence.oxm.json;
14
15
import javax.json.Json;
16
import javax.json.JsonArrayBuilder;
17
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
18
import org.eclipse.persistence.oxm.record.JsonObjectBuilderWriterRecord;
19
20
21
public class JsonArrayBuilderResult extends ExtendedResult{
22
23
    private JsonArrayBuilder jsonArrayBuilder;
24
        
25
    public JsonArrayBuilderResult(){
26
        this.jsonArrayBuilder = Json.createArrayBuilder();
27
    }
28
    
29
    public JsonArrayBuilderResult(JsonArrayBuilder jsonArrayBuilder){
30
        this.jsonArrayBuilder = jsonArrayBuilder;
31
    }
32
33
    @Override
34
    public org.eclipse.persistence.oxm.record.MarshalRecord createRecord() {       
35
         return new JsonObjectBuilderWriterRecord(jsonArrayBuilder);
36
    }
37
38
    public JsonArrayBuilder getJsonArrayBuilder() {
39
        return jsonArrayBuilder;
40
    }
41
42
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/json/JsonObjectBuilderResult.java (+42 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
3
 * This program and the accompanying materials are made available under the
4
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
5
 * which accompanies this distribution.
6
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
7
 * and the Eclipse Distribution License is available at
8
 * http://www.eclipse.org/org/documents/edl-v10.php.
9
 *
10
 * Contributors:
11
 *     Denise Smith - 2.6 - initial implementation
12
 ******************************************************************************/
13
package org.eclipse.persistence.oxm.json;
14
15
import javax.json.Json;
16
import javax.json.JsonObjectBuilder;
17
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
18
import org.eclipse.persistence.oxm.record.JsonObjectBuilderWriterRecord;
19
20
21
public class JsonObjectBuilderResult extends ExtendedResult{
22
23
    private JsonObjectBuilder jsonObjectBuilder;
24
    
25
    public JsonObjectBuilderResult(){        
26
        this.jsonObjectBuilder = Json.createObjectBuilder();
27
    }
28
    
29
    public JsonObjectBuilderResult(JsonObjectBuilder jsonObjectBuilder){
30
        this.jsonObjectBuilder = jsonObjectBuilder;
31
    }
32
33
    @Override
34
    public org.eclipse.persistence.oxm.record.MarshalRecord createRecord() {       
35
         return new JsonObjectBuilderWriterRecord(jsonObjectBuilder);
36
    }
37
38
    public JsonObjectBuilder getJsonObjectBuilder() {
39
        return jsonObjectBuilder;
40
    }
41
42
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JSONFormattedWriterRecord.java (-5 / +1 lines)
Lines 16-22 import java.io.IOException; Link Here
16
import java.io.OutputStream;
16
import java.io.OutputStream;
17
import java.io.Writer;
17
import java.io.Writer;
18
18
19
import org.eclipse.persistence.exceptions.JAXBException;
20
import org.eclipse.persistence.exceptions.XMLMarshalException;
19
import org.eclipse.persistence.exceptions.XMLMarshalException;
21
import org.eclipse.persistence.internal.oxm.Constants;
20
import org.eclipse.persistence.internal.oxm.Constants;
22
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
21
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
Lines 131-140 public class JSONFormattedWriterRecord extends JSONWriterRecord { Link Here
131
                }
130
                }
132
            }
131
            }
133
            if(xPathFragment.nameIsText()){
132
            if(xPathFragment.nameIsText()){
134
               if(position != null && position.isCollection() && position.isEmptyCollection()) {
133
               if(position != null && position.isCollection() && position.isEmptyCollection()) {            	    
135
            	    if(!charactersAllowed){
136
              		     throw JAXBException.jsonValuePropertyRequired("[");   
137
              	    }
138
                    writer.write('[');
134
                    writer.write('[');
139
                    writer.write(' ');
135
                    writer.write(' ');
140
                    position.setEmptyCollection(false);
136
                    position.setEmptyCollection(false);
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JSONWriterRecord.java (-4 / +7 lines)
Lines 247-256 public class JSONWriterRecord extends MarshalRecord<XMLMarshaller> { Link Here
247
                }
247
                }
248
            }
248
            }
249
            if(xPathFragment.nameIsText()){
249
            if(xPathFragment.nameIsText()){
250
                if(position != null && position.isCollection() && position.isEmptyCollection()) {
250
                if(position != null && position.isCollection() && position.isEmptyCollection()) {                	
251
                	if(!charactersAllowed){
252
                		 throw JAXBException.jsonValuePropertyRequired("[");   
253
                	}
254
                    writer.write('[');                    
251
                    writer.write('[');                    
255
                    position.setEmptyCollection(false);
252
                    position.setEmptyCollection(false);
256
                    position.setNeedToOpenComplex(false);
253
                    position.setNeedToOpenComplex(false);
Lines 377-382 public class JSONWriterRecord extends MarshalRecord<XMLMarshaller> { Link Here
377
        } else {
374
        } else {
378
            level.setCollection(true);
375
            level.setCollection(true);
379
            level.setEmptyCollection(true);
376
            level.setEmptyCollection(true);
377
            charactersAllowed = false;
378
            isStartElementOpen = false;
380
        }
379
        }
381
    }
380
    }
382
    
381
    
Lines 421-426 public class JSONWriterRecord extends MarshalRecord<XMLMarshaller> { Link Here
421
    	  boolean textWrapperOpened = false;
420
    	  boolean textWrapperOpened = false;
422
          if(!charactersAllowed){    
421
          if(!charactersAllowed){    
423
        	   if(textWrapperFragment != null){
422
        	   if(textWrapperFragment != null){
423
        	       if(!isStartElementOpen && level.isFirst()){
424
        	           level.needToOpenComplex = true;
425
        	           level.needToOpenComplex = true;
426
        	       }
424
        		   openStartElement(textWrapperFragment, namespaceResolver);
427
        		   openStartElement(textWrapperFragment, namespaceResolver);
425
        		   textWrapperOpened = true;
428
        		   textWrapperOpened = true;
426
        	   }
429
        	   }
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonObjectBuilderWriterRecord.java (+799 lines)
Added Link Here
1
package org.eclipse.persistence.oxm.record;
2
3
import java.io.IOException;
4
import java.io.StringWriter;
5
import java.math.BigDecimal;
6
import java.math.BigInteger;
7
import java.util.List;
8
9
import javax.json.Json;
10
import javax.json.JsonArrayBuilder;
11
import javax.json.JsonObjectBuilder;
12
import javax.xml.namespace.QName;
13
14
import org.eclipse.persistence.exceptions.XMLMarshalException;
15
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
16
import org.eclipse.persistence.internal.core.helper.CoreConversionManager;
17
import org.eclipse.persistence.internal.oxm.CharacterEscapeHandler;
18
import org.eclipse.persistence.internal.oxm.Constants;
19
import org.eclipse.persistence.internal.oxm.ConversionManager;
20
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
21
import org.eclipse.persistence.internal.oxm.ObjectBuilder;
22
import org.eclipse.persistence.internal.oxm.Root;
23
import org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper;
24
import org.eclipse.persistence.internal.oxm.XMLMarshaller;
25
import org.eclipse.persistence.internal.oxm.XPathFragment;
26
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
27
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
28
import org.eclipse.persistence.internal.oxm.record.ExtendedContentHandler;
29
import org.eclipse.persistence.internal.oxm.record.XMLFragmentReader;
30
import org.w3c.dom.Attr;
31
import org.w3c.dom.Node;
32
import org.xml.sax.Attributes;
33
import org.xml.sax.Locator;
34
import org.xml.sax.SAXException;
35
import org.xml.sax.ext.LexicalHandler;
36
37
38
//TODO replace NULL string with addNUll
39
//TODO element method
40
public class JsonObjectBuilderWriterRecord extends MarshalRecord <XMLMarshaller> {
41
42
    private Level position;
43
    private JsonObjectBuilder rootJsonObjectBuilder;
44
    private JsonArrayBuilder rootJsonArrayBuilder;
45
    private CharacterEscapeHandler characterEscapeHandler;
46
47
    private String attributePrefix;
48
    private boolean isRootArray;
49
    private static final String NULL="null";
50
    private boolean isLastEventStart;
51
        
52
    public JsonObjectBuilderWriterRecord(){
53
        super();
54
        isLastEventStart = false;
55
    }
56
    
57
    public JsonObjectBuilderWriterRecord(JsonObjectBuilder jsonObjectBuilder){
58
        this();
59
        rootJsonObjectBuilder = jsonObjectBuilder;
60
    }
61
    
62
    public JsonObjectBuilderWriterRecord(JsonArrayBuilder jsonArrayBuilder){
63
        this();
64
        rootJsonArrayBuilder = jsonArrayBuilder;
65
    }
66
    
67
    /**
68
     * INTERNAL:
69
     */
70
    public void setMarshaller(XMLMarshaller marshaller) {
71
        super.setMarshaller(marshaller);
72
        attributePrefix = marshaller.getAttributePrefix();
73
        if (marshaller.getValueWrapper() != null) {
74
            textWrapperFragment = new XPathFragment();
75
            textWrapperFragment.setLocalName(marshaller.getValueWrapper());
76
        }
77
        characterEscapeHandler = marshaller.getCharacterEscapeHandler();
78
    }
79
    
80
    @Override
81
    public void startDocument(String encoding, String version) {      
82
        if(isRootArray){
83
            position.setEmptyCollection(false);
84
            
85
            Level newLevel = new Level(false, position);
86
            position = newLevel;
87
            
88
            isLastEventStart = true;
89
        }else{
90
            Level rootLevel = new Level(false, null);
91
            position = rootLevel;
92
            if(rootJsonObjectBuilder == null){
93
                rootJsonObjectBuilder = Json.createObjectBuilder();
94
            }  
95
            
96
            rootLevel.setJsonObjectBuilder(rootJsonObjectBuilder);
97
        }
98
    }
99
100
    @Override
101
    public void endDocument() {
102
        if(position != null){
103
            if(position.parentLevel != null && position.parentLevel.isCollection){
104
                popAndSetInParentBuilder();
105
            }else{
106
                //this is the root level list case
107
                position = position.parentLevel;
108
            }            
109
        }
110
    }
111
    
112
    private void popAndSetInParentBuilder(){
113
        Level removedLevel = position;
114
        Level parentLevel = position.parentLevel;
115
        position = position.parentLevel;
116
        if(removedLevel.isCollection && removedLevel.isEmptyCollection() && removedLevel.keyName == null){
117
            return;
118
        }
119
      
120
        if(parentLevel != null){                  
121
            if(parentLevel.isCollection){
122
                if(removedLevel.isCollection){
123
                    parentLevel.getJsonArrayBuilder().add(removedLevel.getJsonArrayBuilder());
124
                }else{                   
125
                    parentLevel.getJsonArrayBuilder().add(removedLevel.getJsonObjectBuilder());
126
                }
127
            }else{
128
                if(removedLevel.isCollection){                    
129
                    parentLevel.getJsonObjectBuilder().add(removedLevel.getKeyName(), removedLevel.getJsonArrayBuilder());
130
                }else{
131
                    parentLevel.getJsonObjectBuilder().add(removedLevel.getKeyName(), removedLevel.getJsonObjectBuilder());
132
                }
133
            }
134
        }
135
        
136
    }    
137
    
138
    public void startCollection() {
139
        if(position == null){
140
             isRootArray = true;              
141
             Level rootLevel = new Level(true, null);
142
             if(rootJsonArrayBuilder == null){
143
                  rootJsonArrayBuilder = Json.createArrayBuilder();
144
             }
145
             rootLevel.setJsonArrayBuilder(rootJsonArrayBuilder);
146
             position = rootLevel;
147
        } else {            
148
            if(isLastEventStart){
149
                position.setComplex(true);           
150
            }            
151
            Level level = new Level(true, position);            
152
            position = level;
153
        }      
154
        isLastEventStart = false;
155
    }
156
    
157
    @Override
158
    public void endCollection() {
159
         popAndSetInParentBuilder();    
160
    }
161
    
162
    @Override    
163
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
164
        super.openStartElement(xPathFragment, namespaceResolver);
165
        if(position != null){
166
            Level newLevel = new Level(false, position);            
167
            
168
            if(isLastEventStart){ 
169
                //this means 2 startevents in a row so the last this is a complex object
170
                position.setComplex(true);                                
171
            }
172
                      
173
            String keyName = getKeyName(xPathFragment);
174
           
175
            if(position.isCollection && position.isEmptyCollection() ){
176
                position.setKeyName(keyName);
177
            }else{
178
                newLevel.setKeyName(keyName);    
179
            }
180
            position = newLevel;   
181
            isLastEventStart = true;
182
        }
183
    }
184
    
185
    protected String getKeyName(XPathFragment xPathFragment){
186
        String keyName = xPathFragment.getLocalName(); 
187
       
188
        if(isNamespaceAware()){
189
            if(xPathFragment.getNamespaceURI() != null){
190
                String prefix = null;
191
                if(getNamespaceResolver() !=null){
192
                    prefix = getNamespaceResolver().resolveNamespaceURI(xPathFragment.getNamespaceURI());
193
                } else if(namespaceResolver != null){
194
                    prefix = namespaceResolver.resolveNamespaceURI(xPathFragment.getNamespaceURI());
195
                }
196
                if(prefix != null && !prefix.equals(Constants.EMPTY_STRING)){
197
                    keyName = prefix + getNamespaceSeparator() +  keyName;                           
198
                }
199
            }
200
        } 
201
        if(xPathFragment.isAttribute() && attributePrefix != null){
202
            keyName = attributePrefix + keyName;
203
        }
204
205
        return keyName;
206
    }
207
208
    public void attribute(XPathFragment xPathFragment, NamespaceResolver namespaceResolver,  Object value, QName schemaType){
209
        if(xPathFragment.getNamespaceURI() != null && xPathFragment.getNamespaceURI() == javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI){
210
            return;
211
        }
212
        xPathFragment.setAttribute(true);
213
        openStartElement(xPathFragment, namespaceResolver);
214
        characters(schemaType, value, null, false, true);
215
        endElement(xPathFragment, namespaceResolver);
216
    }
217
    
218
    /**
219
     * INTERNAL:
220
     */
221
    @Override
222
    public void marshalWithoutRootElement(ObjectBuilder treeObjectBuilder, Object object, Descriptor descriptor, Root root, boolean isXMLRoot){
223
        if(treeObjectBuilder != null){
224
            addXsiTypeAndClassIndicatorIfRequired(descriptor, null, descriptor.getDefaultRootElementField(), root, object, isXMLRoot, true);
225
            treeObjectBuilder.marshalAttributes(this, object, session);
226
        }         
227
     }
228
    
229
    /**
230
     * INTERNAL:
231
     * The character used to separate the prefix and uri portions when namespaces are present 
232
     * @since 2.4
233
     */
234
    public char getNamespaceSeparator(){        
235
        return marshaller.getNamespaceSeparator();
236
    }
237
    
238
    /**
239
     * INTERNAL:
240
     * The optional fragment used to wrap the text() mappings
241
     * @since 2.4
242
     */
243
    public XPathFragment getTextWrapperFragment() {
244
        return textWrapperFragment;
245
    }
246
    
247
    @Override
248
    public boolean isWrapperAsCollectionName() {
249
        return marshaller.isWrapperAsCollectionName();
250
    }
251
    
252
    @Override
253
    public void element(XPathFragment frag) {
254
        isLastEventStart = false;
255
    }
256
    
257
    /**
258
     * Handle marshal of an empty collection.  
259
     * @param xPathFragment
260
     * @param namespaceResolver
261
     * @param openGrouping if grouping elements should be marshalled for empty collections
262
     * @return
263
     */    
264
    public boolean emptyCollection(XPathFragment xPathFragment, NamespaceResolver namespaceResolver, boolean openGrouping) {
265
266
         if(marshaller.isMarshalEmptyCollections()){
267
             super.emptyCollection(xPathFragment, namespaceResolver, true);
268
             
269
             if (null != xPathFragment) {
270
                 
271
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
272
                     String keyName = position.getKeyName();
273
                     position.setComplex(false);
274
                     position.parentLevel.getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());                     
275
                 }else{ 
276
                     if(isLastEventStart){
277
                         position.setComplex(true);                  
278
                     }                 
279
                     String keyName =  getKeyName(xPathFragment);
280
                     if(keyName != null){
281
                        position.getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());
282
                     }
283
                 }
284
                 isLastEventStart = false;   
285
             }
286
                  
287
             return true;
288
         }else{
289
             return super.emptyCollection(xPathFragment, namespaceResolver, openGrouping);
290
         }
291
    }
292
293
    @Override
294
    public void attribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver, String value) {
295
        attribute(xPathFragment, namespaceResolver, value, null);
296
    }
297
298
    @Override
299
    public void attribute(String namespaceURI, String localName, String qName, String value) {
300
        XPathFragment xPathFragment = new XPathFragment();
301
        xPathFragment.setNamespaceURI(namespaceURI);
302
        xPathFragment.setAttribute(true);
303
        xPathFragment.setLocalName(localName);
304
305
        openStartElement(xPathFragment, namespaceResolver);
306
        characters(null, value, null, false, true);
307
308
        endElement(xPathFragment, namespaceResolver);
309
        
310
    }
311
312
    @Override
313
    public void closeStartElement() {}
314
315
    @Override
316
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
317
        if(position != null){
318
            if(isLastEventStart){
319
                position.setComplex(true);
320
            }
321
            if(position.isComplex){
322
                popAndSetInParentBuilder();
323
            }else{
324
                position = position.parentLevel;
325
            }            
326
            isLastEventStart = false;          
327
        }
328
    }
329
330
    @Override
331
    public void characters(String value) {
332
        writeValue(value, null, false);
333
    }
334
335
    @Override
336
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA){          
337
        characters(schemaType, value, mimeType, isCDATA, false);
338
     }
339
    
340
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA, boolean isAttribute){
341
        if(mimeType != null) {
342
            if(value instanceof List){
343
               value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesListForBinaryValues((List)value, marshaller, mimeType);
344
           }else{
345
346
            value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesForBinaryValue(value, marshaller, mimeType).getData();
347
           }
348
        }         
349
        if(schemaType != null && Constants.QNAME_QNAME.equals(schemaType)){
350
            String convertedValue = getStringForQName((QName)value);
351
            writeValue(convertedValue, null, isAttribute);
352
        } 
353
        else if(value.getClass() == String.class){          
354
            //if schemaType is set and it's a numeric or boolean type don't treat as a string
355
            if(schemaType != null && isNumericOrBooleanType(schemaType)){
356
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);
357
                Object convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, theClass, schemaType);
358
                writeValue(convertedValue, schemaType, isAttribute);
359
            }else if(isCDATA){
360
                cdata((String)value);
361
            }else{
362
                writeValue((String)value, null, isAttribute);                
363
            }
364
       }else{
365
           Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
366
367
           if(schemaType == null || theClass == null){
368
               if(value.getClass() == CoreClassConstants.BOOLEAN || CoreClassConstants.NUMBER.isAssignableFrom(value.getClass())){
369
                   writeValue(value, schemaType, isAttribute);
370
               }else{
371
                   String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
372
                   writeValue(convertedValue, schemaType, isAttribute);
373
               }
374
           }else if(schemaType != null && !isNumericOrBooleanType(schemaType)){
375
               //if schemaType exists and is not boolean or number do write quotes (convert to string)
376
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
377
               writeValue(convertedValue, schemaType, isAttribute);
378
           } else if(isCDATA){
379
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
380
               cdata(convertedValue);
381
           }else{
382
               writeValue(value, schemaType, isAttribute);           
383
           }
384
       }        
385
    }
386
    
387
    
388
    private boolean isNumericOrBooleanType(QName schemaType){
389
        if(schemaType == null){
390
            return false;
391
        }else if(schemaType.equals(Constants.BOOLEAN_QNAME)
392
                || schemaType.equals(Constants.INTEGER_QNAME)
393
                || schemaType.equals(Constants.INT_QNAME)
394
                || schemaType.equals(Constants.BYTE_QNAME)
395
                || schemaType.equals(Constants.DECIMAL_QNAME)
396
                || schemaType.equals(Constants.FLOAT_QNAME)
397
                || schemaType.equals(Constants.DOUBLE_QNAME)
398
                || schemaType.equals(Constants.SHORT_QNAME)
399
                || schemaType.equals(Constants.LONG_QNAME)
400
                || schemaType.equals(Constants.NEGATIVE_INTEGER_QNAME)
401
                || schemaType.equals(Constants.NON_NEGATIVE_INTEGER_QNAME)
402
                || schemaType.equals(Constants.NON_POSITIVE_INTEGER_QNAME)
403
                || schemaType.equals(Constants.POSITIVE_INTEGER_QNAME)
404
                || schemaType.equals(Constants.UNSIGNED_BYTE_QNAME)
405
                || schemaType.equals(Constants.UNSIGNED_INT_QNAME)
406
                || schemaType.equals(Constants.UNSIGNED_LONG_QNAME)
407
                || schemaType.equals(Constants.UNSIGNED_SHORT_QNAME)
408
        ){
409
            return true;
410
        }
411
        return false;
412
    }
413
    
414
    public void writeValue(Object value, QName schemaType, boolean isAttribute) {
415
        
416
        if (characterEscapeHandler != null && value instanceof String) {
417
            try {
418
                StringWriter stringWriter = new StringWriter();
419
                characterEscapeHandler.escape(((String)value).toCharArray(), 0, ((String)value).length(), isAttribute, stringWriter);
420
                value = stringWriter.toString();
421
            } catch (IOException e) {
422
                throw XMLMarshalException.marshalException(e);
423
            }
424
        }
425
        
426
        boolean textWrapperOpened = false;                       
427
        if(!isLastEventStart){
428
             openStartElement(textWrapperFragment, namespaceResolver);
429
             textWrapperOpened = true;
430
        }
431
      
432
        Level currentLevel = position;
433
        String keyName = position.getKeyName();
434
        if(!position.isComplex){           
435
            currentLevel = position.parentLevel;
436
            currentLevel.setComplex(true);          
437
        }
438
        if(currentLevel.isCollection()){
439
            currentLevel.setEmptyCollection(false);
440
            addValueToArrayBuilder(currentLevel.getJsonArrayBuilder(), value, schemaType);            
441
        } else {
442
            JsonObjectBuilder builder = currentLevel.getJsonObjectBuilder();                   
443
            addValueToObjectBuilder(builder, keyName, value, schemaType);          
444
        }
445
        isLastEventStart = false;
446
        if(textWrapperOpened){    
447
             endElement(textWrapperFragment, namespaceResolver);
448
        }    
449
    }
450
    
451
    private void addValueToObjectBuilder(JsonObjectBuilder jsonObjectBuilder, String keyName, Object value, QName schemaType){
452
        if(value == NULL){
453
            jsonObjectBuilder.addNull(keyName);
454
        }else if(value instanceof Integer){
455
            jsonObjectBuilder.add(keyName, (Integer)value);  
456
        }else if(value instanceof BigDecimal){
457
            jsonObjectBuilder.add(keyName, (BigDecimal)value);   
458
        }else if(value instanceof BigInteger){
459
            jsonObjectBuilder.add(keyName, (BigInteger)value);               
460
        }else if(value instanceof Boolean){
461
            jsonObjectBuilder.add(keyName, (Boolean)value);
462
        }else if(value instanceof Character){
463
            jsonObjectBuilder.add(keyName, (Character)value);  
464
        }else if(value instanceof Double){
465
            jsonObjectBuilder.add(keyName, (Double)value);
466
        }else if(value instanceof Float){
467
            jsonObjectBuilder.add(keyName, (Float)value);
468
        }else if(value instanceof Long){
469
            jsonObjectBuilder.add(keyName, (Long)value);
470
        }else if(value instanceof String){
471
            jsonObjectBuilder.add(keyName, (String)value);                
472
        }else{
473
            String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
474
            Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
475
            if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
476
                //if it's still a number and falls through the cracks we dont want "" around the value
477
                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
478
                    jsonObjectBuilder.add(keyName, (BigDecimal)convertedNumberValue);
479
            }else{
480
                jsonObjectBuilder.add(keyName, convertedValue);
481
            }
482
                
483
        }
484
    }
485
    
486
    private void addValueToArrayBuilder(JsonArrayBuilder jsonArrayBuilder, Object value, QName schemaType){
487
        if(value == NULL){
488
            jsonArrayBuilder.addNull();
489
        }else if(value instanceof Integer){
490
            jsonArrayBuilder.add((Integer)value);  
491
        }else if(value instanceof BigDecimal){
492
            jsonArrayBuilder.add((BigDecimal)value);   
493
        }else if(value instanceof BigInteger){
494
            jsonArrayBuilder.add((BigInteger)value);               
495
        }else if(value instanceof Boolean){                
496
            jsonArrayBuilder.add((Boolean)value);
497
        }else if(value instanceof Character){
498
            jsonArrayBuilder.add((Character)value);  
499
        }else if(value instanceof Double){
500
            jsonArrayBuilder.add((Double)value);
501
        }else if(value instanceof Float){
502
            jsonArrayBuilder.add((Float)value);
503
        }else if(value instanceof Long){
504
            jsonArrayBuilder.add((Long)value);
505
        }else if(value instanceof String){
506
            jsonArrayBuilder.add((String)value);
507
        }else{
508
            String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
509
            Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
510
            if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
511
                //if it's still a number and falls through the cracks we dont want "" around the value
512
                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
513
                    jsonArrayBuilder.add((BigDecimal)convertedNumberValue);
514
            }else{
515
                jsonArrayBuilder.add(convertedValue);
516
            }
517
        }
518
    }
519
    
520
    @Override
521
    public void cdata(String value) {
522
        characters(value);        
523
    }
524
525
    @Override
526
    public void node(Node node, NamespaceResolver resolver, String uri, String name) {
527
       
528
        if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
529
            Attr attr = (Attr) node;
530
            String resolverPfx = null;
531
            if (getNamespaceResolver() != null) {
532
                resolverPfx = this.getNamespaceResolver().resolveNamespaceURI(attr.getNamespaceURI());
533
            }
534
            String namespaceURI = attr.getNamespaceURI();
535
            // If the namespace resolver contains a prefix for the attribute's URI,
536
            // use it instead of what is set on the attribute
537
            if (resolverPfx != null) {
538
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, resolverPfx+Constants.COLON+attr.getLocalName(), attr.getNodeValue());
539
            } else {
540
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, attr.getName(), attr.getNodeValue());
541
                // May need to declare the URI locally
542
                if (attr.getNamespaceURI() != null) {
543
                    attribute(javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI, Constants.EMPTY_STRING, javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON + attr.getPrefix(), attr.getNamespaceURI());
544
                    this.getNamespaceResolver().put(attr.getPrefix(), attr.getNamespaceURI());
545
                }
546
            }
547
        } else if (node.getNodeType() == Node.TEXT_NODE) {
548
            writeValue(node.getNodeValue(), null, false);
549
        } else {
550
            try {
551
                JsonObjectBuilderRecordContentHandler wrcHandler = new JsonObjectBuilderRecordContentHandler();
552
                
553
                XMLFragmentReader xfragReader = new XMLFragmentReader(namespaceResolver);
554
                xfragReader.setContentHandler(wrcHandler);
555
                xfragReader.setProperty("http://xml.org/sax/properties/lexical-handler", wrcHandler);
556
                xfragReader.parse(node, uri, name);
557
            } catch (SAXException sex) {
558
                throw XMLMarshalException.marshalException(sex);
559
            }
560
        }
561
        
562
    }        
563
    
564
    protected String getStringForQName(QName qName){
565
        if(null == qName) {
566
            return null;
567
        }
568
        CoreConversionManager xmlConversionManager = getSession().getDatasourcePlatform().getConversionManager();
569
570
        return (String) xmlConversionManager.convertObject(qName, String.class);       
571
    }
572
573
    /**
574
     * INTERNAL:
575
     */
576
     public void namespaceDeclarations(NamespaceResolver namespaceResolver) {
577
     }
578
579
     public void namespaceDeclaration(String prefix, String namespaceURI){
580
     }
581
     
582
     public void defaultNamespaceDeclaration(String defaultNamespace){
583
     }
584
     
585
    /**
586
     * INTERNAL:
587
     */
588
     public void nilComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
589
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
590
         closeStartGroupingElements(groupingFragment);
591
         openStartElement(xPathFragment, namespaceResolver);
592
         characters(NULL);
593
         endElement(xPathFragment, namespaceResolver);
594
     }
595
596
    /**
597
     * INTERNAL:
598
     */
599
     public void nilSimple(NamespaceResolver namespaceResolver){
600
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);         
601
         characters(NULL);        
602
         closeStartGroupingElements(groupingFragment);
603
     }
604
605
     /**
606
      * Used when an empty simple value should be written
607
      * @since EclipseLink 2.4
608
      */
609
     public void emptySimple(NamespaceResolver namespaceResolver){
610
         nilSimple(namespaceResolver);
611
     }
612
     
613
     public void emptyAttribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver){
614
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
615
         openStartElement(xPathFragment, namespaceResolver);
616
         characters(NULL);
617
         endElement(xPathFragment, namespaceResolver);
618
         closeStartGroupingElements(groupingFragment);
619
     }
620
621
     /**
622
      * Used when an empty complex item should be written
623
      * @since EclipseLink 2.4
624
      */
625
     public void emptyComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
626
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
627
         closeStartGroupingElements(groupingFragment);
628
         openStartElement(xPathFragment, namespaceResolver);
629
         endElement(xPathFragment, namespaceResolver);
630
     }
631
    
632
    
633
     
634
     /**
635
      * This class will typically be used in conjunction with an XMLFragmentReader.
636
      * The XMLFragmentReader will walk a given XMLFragment node and report events
637
      * to this class - the event's data is then written to the enclosing class'
638
      * writer.
639
      *
640
      * @see org.eclipse.persistence.internal.oxm.record.XMLFragmentReader
641
      */
642
     protected class JsonObjectBuilderRecordContentHandler implements ExtendedContentHandler, LexicalHandler {
643
644
         JsonObjectBuilderRecordContentHandler() {
645
         }
646
647
         // --------------------- CONTENTHANDLER METHODS --------------------- //
648
         public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
649
                 XPathFragment xPathFragment = new XPathFragment(localName);
650
                 xPathFragment.setNamespaceURI(namespaceURI);
651
                 openStartElement(xPathFragment, namespaceResolver);
652
                 handleAttributes(atts);
653
         }
654
655
         public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
656
             XPathFragment xPathFragment = new XPathFragment(localName);
657
             xPathFragment.setNamespaceURI(namespaceURI);
658
             
659
             JsonObjectBuilderWriterRecord.this.endElement(xPathFragment, namespaceResolver);        
660
         }
661
662
         public void startPrefixMapping(String prefix, String uri) throws SAXException {
663
         }
664
665
         public void characters(char[] ch, int start, int length) throws SAXException {
666
             String characters = new String (ch, start, length);
667
             characters(characters);
668
         }
669
670
         public void characters(CharSequence characters) throws SAXException {           
671
             JsonObjectBuilderWriterRecord.this.characters(characters.toString());      
672
         }
673
674
         // --------------------- LEXICALHANDLER METHODS --------------------- //
675
         public void comment(char[] ch, int start, int length) throws SAXException {
676
         }
677
678
         public void startCDATA() throws SAXException {
679
         }
680
681
         public void endCDATA() throws SAXException {
682
         }
683
684
         // --------------------- CONVENIENCE METHODS --------------------- //
685
            protected void handleAttributes(Attributes atts) {
686
             for (int i=0, attsLength = atts.getLength(); i<attsLength; i++) {
687
                 String qName = atts.getQName(i);
688
                 if((qName != null && (qName.startsWith(javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON) || qName.equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)))) {
689
                     continue;
690
                 }
691
                 attribute(atts.getURI(i), atts.getLocalName(i), qName, atts.getValue(i));
692
             }
693
         }
694
695
         protected void writeComment(char[] chars, int start, int length) {        
696
         }
697
        
698
         protected void writeCharacters(char[] chars, int start, int length) {
699
             try {
700
                 characters(chars, start, length);
701
             } catch (SAXException e) {
702
                 throw XMLMarshalException.marshalException(e);
703
             }           
704
         }
705
         // --------------- SATISFY CONTENTHANDLER INTERFACE --------------- //
706
         public void endPrefixMapping(String prefix) throws SAXException {}
707
         public void processingInstruction(String target, String data) throws SAXException {}
708
         public void setDocumentLocator(Locator locator) {}
709
         public void startDocument() throws SAXException {}
710
         public void endDocument() throws SAXException {}
711
         public void skippedEntity(String name) throws SAXException {}
712
         public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {}
713
714
         // --------------- SATISFY LEXICALHANDLER INTERFACE --------------- //
715
         public void startEntity(String name) throws SAXException {}
716
         public void endEntity(String name) throws SAXException {}
717
         public void startDTD(String name, String publicId, String systemId) throws SAXException {}
718
         public void endDTD() throws SAXException {}
719
         @Override
720
         public void setNil(boolean isNil) {}
721
722
     }
723
724
     
725
     /**
726
     * Instances of this class are used to maintain state about the current
727
     * level of the JSON message being marshalled.
728
     */
729
    protected static class Level {
730
        
731
        private boolean isCollection;
732
        private boolean emptyCollection;
733
        private String keyName;        
734
        private JsonObjectBuilder jsonObjectBuilder;
735
        private JsonArrayBuilder jsonArrayBuilder;
736
        private boolean isComplex;
737
        private Level parentLevel;
738
        
739
        public Level(boolean isCollection, Level parentLevel) {
740
            setCollection(isCollection);
741
            emptyCollection = true;
742
            this.parentLevel = parentLevel;
743
        }
744
745
        public boolean isCollection() {
746
            return isCollection;
747
        }
748
749
        public void setCollection(boolean isCollection) {
750
            this.isCollection = isCollection;
751
            if(isCollection && jsonArrayBuilder == null){
752
                jsonArrayBuilder = Json.createArrayBuilder();
753
            }
754
        }
755
756
        public String getKeyName() {
757
            return keyName;
758
        }
759
760
        public void setKeyName(String keyName) {
761
            this.keyName = keyName;
762
        }
763
764
        public JsonObjectBuilder getJsonObjectBuilder() {
765
            return jsonObjectBuilder;
766
        }
767
768
        public void setJsonObjectBuilder(JsonObjectBuilder jsonObjectBuilder) {
769
            this.jsonObjectBuilder = jsonObjectBuilder;
770
        }
771
772
        public JsonArrayBuilder getJsonArrayBuilder() {
773
            return jsonArrayBuilder;
774
        }
775
776
        public void setJsonArrayBuilder(JsonArrayBuilder jsonArrayBuilder) {
777
            this.jsonArrayBuilder = jsonArrayBuilder;
778
        }
779
780
        public boolean isEmptyCollection() {
781
            return emptyCollection;
782
        }
783
784
        public void setEmptyCollection(boolean emptyCollection) {
785
            this.emptyCollection = emptyCollection;
786
        }
787
        public boolean isComplex() {
788
            return isComplex;
789
        }
790
791
        public void setComplex(boolean isComplex) {
792
            this.isComplex = isComplex;
793
            if(isComplex && jsonObjectBuilder == null){
794
                jsonObjectBuilder = Json.createObjectBuilder();
795
            }
796
        }        
797
    }
798
799
}
(-)a/moxy/eclipselink.moxy.test/resource/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anycollection/employee.json (-2 / +4 lines)
Lines 1-7 Link Here
1
{"employee":{
1
{"employee":{
2
  "things":{
2
  "things":{
3
     "junk":{
3
     "junk":{
4
       "stuff":"Some Stuff"
4
       "stuff":{
5
          "value":["Some Stuff"]
6
	}
5
    }
7
    }
6
  }
8
  }
7
}}
9
}}
(-)a/moxy/eclipselink.moxy.test/resource/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anycollection/write-only-employee.json (-1 / +3 lines)
Lines 1-7 Link Here
1
{"employee":{
1
{"employee":{
2
  "things":{
2
  "things":{
3
    "write-only":{
3
    "write-only":{
4
      "stuff":"Some Stuff"
4
      "stuff":{
5
         "value":["Some Stuff"]
6
	 }
5
    }
7
    }
6
  }
8
  }
7
}}
9
}}
(-)a/moxy/eclipselink.moxy.test/resource/org/eclipse/persistence/testing/jaxb/javadoc/xmlidref/xmlidrefcontainment.json (-1 / +1 lines)
Lines 1-6 Link Here
1
{"customer-data":{
1
{"customer-data":{
2
	"customer":{
2
	"customer":{
3
	        "customerID":"Alice",
3
	        "@customerID":"Alice",
4
		"name":"Alice Jane",
4
		"name":"Alice Jane",
5
		"customerID":"Alice"
5
		"customerID":"Alice"
6
		},
6
		},
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/JAXBWithJSONTestCases.java (-1 / +27 lines)
Lines 23-30 import java.util.ArrayList; Link Here
23
import java.util.List;
23
import java.util.List;
24
24
25
import javax.json.Json;
25
import javax.json.Json;
26
import javax.json.JsonObject;
27
import javax.json.JsonObjectBuilder;
26
import javax.json.JsonReader;
28
import javax.json.JsonReader;
27
import javax.json.JsonStructure;
29
import javax.json.JsonStructure;
30
import javax.json.JsonWriter;
31
import javax.json.stream.JsonParser;
28
import javax.xml.bind.JAXBElement;
32
import javax.xml.bind.JAXBElement;
29
import javax.xml.bind.Marshaller;
33
import javax.xml.bind.Marshaller;
30
import javax.xml.bind.Unmarshaller;
34
import javax.xml.bind.Unmarshaller;
Lines 37-42 import org.eclipse.persistence.jaxb.JAXBContext; Link Here
37
import org.eclipse.persistence.jaxb.MarshallerProperties;
41
import org.eclipse.persistence.jaxb.MarshallerProperties;
38
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
42
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
39
import org.eclipse.persistence.oxm.MediaType;
43
import org.eclipse.persistence.oxm.MediaType;
44
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
40
import org.eclipse.persistence.oxm.json.JsonStructureSource;
45
import org.eclipse.persistence.oxm.json.JsonStructureSource;
41
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
46
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
42
import org.xml.sax.InputSource;
47
import org.xml.sax.InputSource;
Lines 235-241 public abstract class JAXBWithJSONTestCases extends JAXBTestCases { Link Here
235
            jsonToObjectTest(testObject);
240
            jsonToObjectTest(testObject);
236
        }
241
        }
237
    }
242
    }
238
       
243
    
239
    public void testJSONUnmarshalFromURL() throws Exception {
244
    public void testJSONUnmarshalFromURL() throws Exception {
240
    	if(isUnmarshalTest()){
245
    	if(isUnmarshalTest()){
241
    		getJSONUnmarshaller().setProperty(UnmarshallerProperties.MEDIA_TYPE, getJSONUnmarshalMediaType());
246
    		getJSONUnmarshaller().setProperty(UnmarshallerProperties.MEDIA_TYPE, getJSONUnmarshalMediaType());
Lines 309-314 public abstract class JAXBWithJSONTestCases extends JAXBTestCases { Link Here
309
        log(sw.toString());
314
        log(sw.toString());
310
        compareStringToControlFile("testJSONMarshalToStringWriter_FORMATTED", sw.toString(), getWriteControlJSONFormatted(),shouldRemoveWhitespaceFromControlDocJSON());
315
        compareStringToControlFile("testJSONMarshalToStringWriter_FORMATTED", sw.toString(), getWriteControlJSONFormatted(),shouldRemoveWhitespaceFromControlDocJSON());
311
    }
316
    }
317
    public void testJSONMarshalToBuilderResult() throws Exception{
318
        getJSONMarshaller().setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
319
320
        JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder();
321
        JsonObjectBuilderResult result = new JsonObjectBuilderResult(jsonObjectBuilder);
322
        try{
323
            getJSONMarshaller().marshal(getWriteControlObject(), result);
324
        } catch(Exception e) {
325
            assertMarshalException(e);
326
            return;
327
        }
328
        JsonObject jsonObject = jsonObjectBuilder.build();
329
        
330
        StringWriter sw = new StringWriter();
331
        JsonWriter writer= Json.createWriter(sw);
332
        writer.writeObject(jsonObject);
333
        writer.close();
334
        
335
        log(sw.toString());
336
        compareStringToControlFile("**testJSONMarshalToStringWriter**", sw.toString());
337
    }
312
338
313
    protected void compareStringToControlFile(String test, String testString) {
339
    protected void compareStringToControlFile(String test, String testString) {
314
    	compareStringToControlFile(test, testString, getWriteControlJSON());
340
    	compareStringToControlFile(test, testString, getWriteControlJSON());
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/javadoc/xmlidref/XmlIdRefContainmentTest.java (+3 lines)
Lines 14-19 package org.eclipse.persistence.testing.jaxb.javadoc.xmlidref; Link Here
14
14
15
//Example 2
15
//Example 2
16
16
17
import org.eclipse.persistence.jaxb.MarshallerProperties;
17
import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
18
import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
18
19
19
public class XmlIdRefContainmentTest extends JAXBWithJSONTestCases{
20
public class XmlIdRefContainmentTest extends JAXBWithJSONTestCases{
Lines 31-36 public class XmlIdRefContainmentTest extends JAXBWithJSONTestCases{ Link Here
31
		classes[2] = Shipping.class;
32
		classes[2] = Shipping.class;
32
		classes[3] = CustomerData.class;
33
		classes[3] = CustomerData.class;
33
		setClasses(classes);
34
		setClasses(classes);
35
		jaxbMarshaller.setProperty(MarshallerProperties.JSON_ATTRIBUTE_PREFIX, "@");
36
		jaxbUnmarshaller.setProperty(MarshallerProperties.JSON_ATTRIBUTE_PREFIX, "@");
34
	}
37
	}
35
38
36
	protected Object getControlObject() {
39
	protected Object getControlObject() {
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/JSONMarshalUnmarshalTestCases.java (+21 lines)
Lines 20-29 import java.net.URL; Link Here
20
import java.util.ArrayList;
20
import java.util.ArrayList;
21
import java.util.List;
21
import java.util.List;
22
22
23
import javax.json.Json;
24
import javax.json.JsonReader;
25
import javax.json.JsonStructure;
23
import javax.xml.bind.JAXBElement;
26
import javax.xml.bind.JAXBElement;
24
import javax.xml.transform.stream.StreamSource;
27
import javax.xml.transform.stream.StreamSource;
25
28
26
import org.eclipse.persistence.jaxb.JAXBContext;
29
import org.eclipse.persistence.jaxb.JAXBContext;
30
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
31
import org.eclipse.persistence.oxm.json.JsonStructureSource;
27
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
32
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
28
import org.xml.sax.InputSource;
33
import org.xml.sax.InputSource;
29
34
Lines 53-58 public abstract class JSONMarshalUnmarshalTestCases extends JSONTestCases{ Link Here
53
		inputStream.close();
58
		inputStream.close();
54
		jsonToObjectTest(testObject);
59
		jsonToObjectTest(testObject);
55
	}
60
	}
61
	
62
	public void testJSONUnmarshalFromJsonStructureSource() throws Exception {
63
       
64
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(controlJSONLocation);    
65
        JsonReader reader = Json.createReader(inputStream);
66
        JsonStructure jsonStructure = reader.read();     
67
        JsonStructureSource source = new JsonStructureSource(jsonStructure);
68
            
69
        Object testObject = null;
70
        if(getUnmarshalClass() != null){               
71
            testObject = jsonUnmarshaller.unmarshal(source, getUnmarshalClass());
72
        }else{
73
            testObject = jsonUnmarshaller.unmarshal(source);
74
        }
75
        jsonToObjectTest(testObject);        
76
    }
56
77
57
	public void testJSONUnmarshalFromInputSource() throws Exception {	
78
	public void testJSONUnmarshalFromInputSource() throws Exception {	
58
         InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(controlJSONLocation);
79
         InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(controlJSONLocation);
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/JSONTestCases.java (+53 lines)
Lines 13-23 Link Here
13
package org.eclipse.persistence.testing.jaxb.json;
13
package org.eclipse.persistence.testing.jaxb.json;
14
14
15
import java.io.ByteArrayOutputStream;
15
import java.io.ByteArrayOutputStream;
16
import java.io.OutputStream;
17
import java.io.OutputStreamWriter;
16
import java.io.StringWriter;
18
import java.io.StringWriter;
19
import java.nio.charset.Charset;
17
import java.util.Collection;
20
import java.util.Collection;
18
import java.util.Iterator;
21
import java.util.Iterator;
19
import java.util.Map;
22
import java.util.Map;
20
23
24
import javax.json.Json;
25
import javax.json.JsonArray;
26
import javax.json.JsonArrayBuilder;
27
import javax.json.JsonObject;
28
import javax.json.JsonObjectBuilder;
29
import javax.json.JsonWriter;
30
import javax.json.JsonWriterFactory;
21
import javax.xml.bind.JAXBContext;
31
import javax.xml.bind.JAXBContext;
22
import javax.xml.bind.JAXBElement;
32
import javax.xml.bind.JAXBElement;
23
import javax.xml.bind.Marshaller;
33
import javax.xml.bind.Marshaller;
Lines 27-32 import org.eclipse.persistence.jaxb.JAXBContextFactory; Link Here
27
import org.eclipse.persistence.jaxb.MarshallerProperties;
37
import org.eclipse.persistence.jaxb.MarshallerProperties;
28
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
38
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
29
import org.eclipse.persistence.oxm.XMLContext;
39
import org.eclipse.persistence.oxm.XMLContext;
40
import org.eclipse.persistence.oxm.json.JsonArrayBuilderResult;
41
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
30
import org.eclipse.persistence.testing.oxm.OXTestCase;
42
import org.eclipse.persistence.testing.oxm.OXTestCase;
31
43
32
public abstract class JSONTestCases extends OXTestCase{
44
public abstract class JSONTestCases extends OXTestCase{
Lines 172-178 public abstract class JSONTestCases extends OXTestCase{ Link Here
172
	        compareStringToControlFile("testJSONMarshalToOutputStream", new String(os.toByteArray()));
184
	        compareStringToControlFile("testJSONMarshalToOutputStream", new String(os.toByteArray()));
173
	        os.close();
185
	        os.close();
174
	    }
186
	    }
187
	 
188
     public void testJSONMarshalToBuilderResult() throws Exception{
189
           Object writeControlObject = getWriteControlObject();
190
           if(writeControlObject instanceof Collection || writeControlObject.getClass().isArray()){
191
               marshalToArrayBuilderResult();
192
           }else{
193
               marshalToObjectBuilderResult();
194
           }
195
     }  
196
	 
197
	   public void marshalToObjectBuilderResult() throws Exception{
198
	       
199
	        JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder();
200
	        JsonObjectBuilderResult result = new JsonObjectBuilderResult(jsonObjectBuilder);
201
	        jsonMarshaller.marshal(getWriteControlObject(), result);
175
202
203
	        JsonObject jsonObject = jsonObjectBuilder.build();	        
204
	        StringWriter sw = new StringWriter();
205
	        
206
	        JsonWriter writer= Json.createWriter(sw);
207
	        writer.writeObject(jsonObject);
208
	        writer.close();
209
	        log(sw.toString());
210
	        compareStringToControlFile("**testJSONMarshalToBuilderResult**", sw.toString());
211
	    }
212
213
    public void marshalToArrayBuilderResult() throws Exception{
214
           
215
           JsonArrayBuilder jsonArrayBuilder = Json.createArrayBuilder();
216
           JsonArrayBuilderResult result = new JsonArrayBuilderResult(jsonArrayBuilder);
217
           jsonMarshaller.marshal(getWriteControlObject(), result);
218
219
           JsonArray jsonArray = jsonArrayBuilder.build();          
220
           StringWriter sw = new StringWriter();
221
           JsonWriter writer= Json.createWriter(sw);
222
           writer.writeArray(jsonArray);
223
           writer.close();
224
           
225
           log(sw.toString());
226
           compareStringToControlFile("**testJSONMarshalToBuilderResult**", sw.toString());
227
       }
228
	   
176
	 public void testJSONMarshalToOutputStream_FORMATTED() throws Exception{
229
	 public void testJSONMarshalToOutputStream_FORMATTED() throws Exception{
177
	    jsonMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
230
	    jsonMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
178
	    ByteArrayOutputStream os = new ByteArrayOutputStream();
231
	    ByteArrayOutputStream os = new ByteArrayOutputStream();
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/characters/EscapeCharactersTestCases.java (+16 lines)
Lines 59-62 public class EscapeCharactersTestCases extends JSONMarshalUnmarshalTestCases { Link Here
59
		return holder;
59
		return holder;
60
	}
60
	}
61
61
62
	protected void compareStrings(String test, String testString, String expectedString, boolean removeWhitespace) {
63
        log(test);
64
        log("Expected (With All Whitespace Removed):");
65
        if(removeWhitespace){
66
           expectedString = expectedString.replaceAll("[ \b\t\n\r ]", "");
67
        }
68
        log(expectedString);
69
           
70
        log("\nActual (With All Whitespace Removed):");
71
        if(removeWhitespace){
72
            testString = testString.replaceAll("[ \b\t\n\r]", "");
73
        }       
74
        log(testString);
75
        assertEquals(expectedString.toLowerCase(), testString.toLowerCase());
76
    }
77
	
62
}
78
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/characters/UsAsciiTestCases.java (+29 lines)
Lines 12-21 Link Here
12
 ******************************************************************************/
12
 ******************************************************************************/
13
package org.eclipse.persistence.testing.jaxb.json.characters;
13
package org.eclipse.persistence.testing.jaxb.json.characters;
14
14
15
import java.io.ByteArrayOutputStream;
16
import java.io.OutputStreamWriter;
17
import java.nio.charset.Charset;
15
import java.util.Map;
18
import java.util.Map;
16
19
20
import javax.json.Json;
21
import javax.json.JsonObject;
22
import javax.json.JsonObjectBuilder;
23
import javax.json.JsonWriter;
17
import javax.xml.bind.Marshaller;
24
import javax.xml.bind.Marshaller;
18
25
26
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
19
import org.eclipse.persistence.testing.jaxb.json.JSONMarshalUnmarshalTestCases;
27
import org.eclipse.persistence.testing.jaxb.json.JSONMarshalUnmarshalTestCases;
20
28
21
public class UsAsciiTestCases  extends JSONMarshalUnmarshalTestCases {
29
public class UsAsciiTestCases  extends JSONMarshalUnmarshalTestCases {
Lines 43-47 public class UsAsciiTestCases extends JSONMarshalUnmarshalTestCases { Link Here
43
        control.characters.add('b');
51
        control.characters.add('b');
44
        return control;
52
        return control;
45
    }
53
    }
54
    
55
    public void marshalToObjectBuilderResult() throws Exception{
56
        
57
        JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder();
58
        JsonObjectBuilderResult result = new JsonObjectBuilderResult(jsonObjectBuilder);
59
        jsonMarshaller.marshal(getWriteControlObject(), result);
60
61
        JsonObject jsonObject = jsonObjectBuilder.build();                
62
        ByteArrayOutputStream out = new ByteArrayOutputStream();
63
        Charset charset = Charset.forName("US-ASCII");
64
65
        JsonWriter writer = Json.createWriterFactory(null).createWriter(out, charset);
66
        
67
        writer.writeObject(jsonObject);
68
        writer.close();
69
       
70
        String s = out.toString();
71
       
72
        log(s);
73
        compareStringToControlFile("**testJSONMarshalToBuilderResult**", s);
74
    }
46
75
47
}
76
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JAXBElementJSONPaddingTestCases.java (+4 lines)
Lines 45-48 public class JAXBElementJSONPaddingTestCases extends JAXBWithJSONTestCases{ Link Here
45
	public boolean isUnmarshalTest (){
45
	public boolean isUnmarshalTest (){
46
		return false;
46
		return false;
47
	}
47
	}
48
	
49
	public void testJSONMarshalToBuilderResult() throws Exception{     
50
    }
51
    
48
}
52
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JAXBElementListJSONPaddingTestCases.java (+3 lines)
Lines 57-60 public class JAXBElementListJSONPaddingTestCases extends JSONTestCases{ Link Here
57
	public boolean isUnmarshalTest (){
57
	public boolean isUnmarshalTest (){
58
		return false;
58
		return false;
59
	}
59
	}
60
	
61
	public void testJSONMarshalToBuilderResult() throws Exception{     
62
    }
60
}
63
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithNullNameTestCases.java (+4 lines)
Lines 42-45 public class JSONWithNullNameTestCases extends JAXBWithJSONTestCases{ Link Here
42
	public boolean isUnmarshalTest (){
42
	public boolean isUnmarshalTest (){
43
		return false;
43
		return false;
44
	}
44
	}
45
	
46
	public void testJSONMarshalToBuilderResult() throws Exception{     
47
    }
48
    
45
}
49
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithNullObjectTestCases.java (+3 lines)
Lines 46-51 public class JSONWithNullObjectTestCases extends JAXBWithJSONTestCases{ Link Here
46
		return false;
46
		return false;
47
	}
47
	}
48
48
49
	public void testJSONMarshalToBuilderResult() throws Exception{     
50
    }
51
	
49
    @Override
52
    @Override
50
    public void assertMarshalException(Exception exception) throws Exception {
53
    public void assertMarshalException(Exception exception) throws Exception {
51
        Exception nestedException = (Exception) exception.getCause();
54
        Exception nestedException = (Exception) exception.getCause();
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithPaddingSimpleListTestCases.java (+3 lines)
Lines 55-60 public class JSONWithPaddingSimpleListTestCases extends JSONTestCases{ Link Here
55
		return false;
55
		return false;
56
	}
56
	}
57
	
57
	
58
	public void testJSONMarshalToBuilderResult() throws Exception{     
59
    }
60
	
58
//	public boolean shouldRemoveWhitespaceFromControlDocJSON(){
61
//	public boolean shouldRemoveWhitespaceFromControlDocJSON(){
59
	//	return false;
62
	//	return false;
60
	//}
63
	//}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithPaddingSimpleTestCases.java (+4 lines)
Lines 48-51 public class JSONWithPaddingSimpleTestCases extends JAXBWithJSONTestCases{ Link Here
48
	public boolean isUnmarshalTest (){		
48
	public boolean isUnmarshalTest (){		
49
		return false;
49
		return false;
50
	}
50
	}
51
	
52
	public void testJSONMarshalToBuilderResult() throws Exception{     
53
    }
54
    
51
}
55
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithUnsetNameTestCases.java (+4 lines)
Lines 42-45 public class JSONWithUnsetNameTestCases extends JAXBWithJSONTestCases{ Link Here
42
	public boolean isUnmarshalTest (){
42
	public boolean isUnmarshalTest (){
43
		return false;
43
		return false;
44
	}
44
	}
45
	
46
	public void testJSONMarshalToBuilderResult() throws Exception{     
47
    }
48
    
45
}
49
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/xmlvariablenode/XmlVariableNodeNullValueTestCases.java (+11 lines)
Lines 86-91 public class XmlVariableNodeNullValueTestCases extends JAXBWithJSONTestCases{ Link Here
86
		fail("An XMLMarshalException should have occurred");
86
		fail("An XMLMarshalException should have occurred");
87
    }
87
    }
88
    
88
    
89
    public void testJSONMarshalToBuilderResult() throws Exception{
90
        try{
91
            super.testJSONMarshalToBuilderResult();
92
        }catch(JAXBException e){
93
            if(verifyException(e)){
94
                return;
95
            }
96
        }
97
        fail("An XMLMarshalException should have occurred");
98
    }
99
    
89
    public void testJSONMarshalToStringWriter_FORMATTED() throws Exception{
100
    public void testJSONMarshalToStringWriter_FORMATTED() throws Exception{
90
    	try{
101
    	try{
91
     		super.testJSONMarshalToStringWriter_FORMATTED();
102
     		super.testJSONMarshalToStringWriter_FORMATTED();

Return to bug 411377