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 42-47 import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession; Link Here
42
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
42
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
43
import org.eclipse.persistence.internal.oxm.mappings.Field;
43
import org.eclipse.persistence.internal.oxm.mappings.Field;
44
import org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecord;
44
import org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecord;
45
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
45
import org.eclipse.persistence.internal.oxm.record.namespaces.PrefixMapperNamespaceResolver;
46
import org.eclipse.persistence.internal.oxm.record.namespaces.PrefixMapperNamespaceResolver;
46
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
47
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
47
import org.eclipse.persistence.oxm.JSONWithPadding;
48
import org.eclipse.persistence.oxm.JSONWithPadding;
Lines 1014-1020 public abstract class XMLMarshaller< Link Here
1014
        } else if (result instanceof SAXResult) {
1015
        } else if (result instanceof SAXResult) {
1015
            SAXResult saxResult = (SAXResult) result;
1016
            SAXResult saxResult = (SAXResult) result;
1016
            marshal(object, saxResult.getHandler());
1017
            marshal(object, saxResult.getHandler());
1017
        } else {
1018
        } else if (result instanceof ExtendedResult){           
1019
            marshal(object, ((ExtendedResult)result).createRecord(), session, xmlDescriptor, isXMLRoot);
1020
        }else {
1018
            if (result.getClass().equals(staxResultClass)) {
1021
            if (result.getClass().equals(staxResultClass)) {
1019
                try {
1022
                try {
1020
                    Object xmlStreamWriter = PrivilegedAccessHelper.invokeMethod(staxResultGetStreamWriterMethod, result);
1023
                    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 (+43 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.internal.oxm.record.MarshalRecord;
19
import org.eclipse.persistence.oxm.record.JsonObjectBuilderWriterRecord;
20
21
22
public class JsonObjectBuilderResult extends ExtendedResult{
23
24
    private JsonObjectBuilder jsonObjectBuilder;
25
    
26
    public JsonObjectBuilderResult(){        
27
        this.jsonObjectBuilder = Json.createObjectBuilder();
28
    }
29
    
30
    public JsonObjectBuilderResult(JsonObjectBuilder jsonObjectBuilder){
31
        this.jsonObjectBuilder = jsonObjectBuilder;
32
    }
33
34
    @Override
35
    public org.eclipse.persistence.oxm.record.MarshalRecord createRecord() {       
36
         return new JsonObjectBuilderWriterRecord(jsonObjectBuilder);
37
    }
38
39
    public JsonObjectBuilder getJsonObjectBuilder() {
40
        return jsonObjectBuilder;
41
    }
42
43
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JSONFormattedWriterRecord.java (-5 / +1 lines)
Lines 15-21 package org.eclipse.persistence.oxm.record; Link Here
15
import java.io.IOException;
15
import java.io.IOException;
16
import java.io.Writer;
16
import java.io.Writer;
17
17
18
import org.eclipse.persistence.exceptions.JAXBException;
19
import org.eclipse.persistence.exceptions.XMLMarshalException;
18
import org.eclipse.persistence.exceptions.XMLMarshalException;
20
import org.eclipse.persistence.internal.oxm.Constants;
19
import org.eclipse.persistence.internal.oxm.Constants;
21
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
20
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
Lines 122-131 public class JSONFormattedWriterRecord extends JSONWriterRecord { Link Here
122
                }
121
                }
123
            }
122
            }
124
            if(xPathFragment.nameIsText()){
123
            if(xPathFragment.nameIsText()){
125
               if(position != null && position.isCollection() && position.isEmptyCollection()) {
124
               if(position != null && position.isCollection() && position.isEmptyCollection()) {            	    
126
            	    if(!charactersAllowed){
127
              		     throw JAXBException.jsonValuePropertyRequired("[");   
128
              	    }
129
                    writer.write('[');
125
                    writer.write('[');
130
                    writer.write(' ');
126
                    writer.write(' ');
131
                    position.setEmptyCollection(false);
127
                    position.setEmptyCollection(false);
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JSONWriterRecord.java (-6 / +9 lines)
Lines 21-27 import java.util.Stack; Link Here
21
21
22
import javax.xml.namespace.QName;
22
import javax.xml.namespace.QName;
23
23
24
import org.eclipse.persistence.exceptions.JAXBException;
25
import org.eclipse.persistence.exceptions.XMLMarshalException;
24
import org.eclipse.persistence.exceptions.XMLMarshalException;
26
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
25
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
27
import org.eclipse.persistence.internal.core.helper.CoreConversionManager;
26
import org.eclipse.persistence.internal.core.helper.CoreConversionManager;
Lines 237-246 public class JSONWriterRecord extends MarshalRecord<XMLMarshaller> { Link Here
237
                }
236
                }
238
            }
237
            }
239
            if(xPathFragment.nameIsText()){
238
            if(xPathFragment.nameIsText()){
240
                if(position != null && position.isCollection() && position.isEmptyCollection()) {
239
                if(position != null && position.isCollection() && position.isEmptyCollection()) {                	
241
                	if(!charactersAllowed){
242
                		 throw JAXBException.jsonValuePropertyRequired("[");   
243
                	}
244
                    writer.write('[');                    
240
                    writer.write('[');                    
245
                    position.setEmptyCollection(false);
241
                    position.setEmptyCollection(false);
246
                    position.setNeedToOpenComplex(false);
242
                    position.setNeedToOpenComplex(false);
Lines 367-372 public class JSONWriterRecord extends MarshalRecord<XMLMarshaller> { Link Here
367
        } else {
363
        } else {
368
            levels.peek().setCollection(true);
364
            levels.peek().setCollection(true);
369
            levels.peek().setEmptyCollection(true);
365
            levels.peek().setEmptyCollection(true);
366
            charactersAllowed = false;
367
            isStartElementOpen = false;
370
        }
368
        }
371
    }
369
    }
372
    
370
    
Lines 410-423 public class JSONWriterRecord extends MarshalRecord<XMLMarshaller> { Link Here
410
     */
408
     */
411
     public void characters(String value, boolean isString, boolean isAttribute) {
409
     public void characters(String value, boolean isString, boolean isAttribute) {
412
    	  boolean textWrapperOpened = false;
410
    	  boolean textWrapperOpened = false;
411
    	  Level position = levels.peek();
413
          if(!charactersAllowed){    
412
          if(!charactersAllowed){    
414
        	   if(textWrapperFragment != null){
413
        	   if(textWrapperFragment != null){
414
        	       if(!isStartElementOpen && position.isFirst()){
415
        	           position.needToOpenComplex = true;
416
        	           position.needToOpenComplex = true;
417
        	       }
415
        		   openStartElement(textWrapperFragment, namespaceResolver);
418
        		   openStartElement(textWrapperFragment, namespaceResolver);
416
        		   textWrapperOpened = true;
419
        		   textWrapperOpened = true;
417
        	   }
420
        	   }
418
    	   }
421
    	   }
419
    	 
422
    	 
420
           Level position = levels.peek();
423
           position = levels.peek();
421
           position.setNeedToOpenComplex(false);
424
           position.setNeedToOpenComplex(false);
422
           try {
425
           try {
423
        	   if(isString){
426
        	   if(isString){
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonObjectBuilderWriterRecord.java (+814 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
            newLevel.setItemInCollection(true);
87
            position = newLevel;
88
            
89
            isLastEventStart = true;
90
        }else{
91
            Level rootLevel = new Level(false, null);
92
            position = rootLevel;
93
            if(rootJsonObjectBuilder == null){
94
                rootJsonObjectBuilder = Json.createObjectBuilder();
95
            }  
96
            
97
            rootLevel.setJsonObjectBuilder(rootJsonObjectBuilder);
98
        }
99
    }
100
101
    @Override
102
    public void endDocument() {
103
        if(position != null){
104
            if(position.isItemInCollection() && position.parentLevel != null){
105
                popAndSetInParentBuilder();
106
            }else{
107
                //this is the root level list case
108
                position = position.parentLevel;
109
            }            
110
        }
111
    }
112
    
113
    private void popAndSetInParentBuilder(){
114
        Level removedLevel = position;
115
        Level parentLevel = position.parentLevel;
116
        position = position.parentLevel;
117
        if(removedLevel.isCollection && removedLevel.isEmptyCollection() && removedLevel.keyName == null){
118
            return;
119
        }
120
      
121
        if(parentLevel != null){                  
122
            if(parentLevel.isCollection){
123
                if(removedLevel.isCollection){
124
                    parentLevel.getJsonArrayBuilder().add(removedLevel.getJsonArrayBuilder());
125
                }else{                   
126
                    parentLevel.getJsonArrayBuilder().add(removedLevel.getJsonObjectBuilder());
127
                }
128
            }else{
129
                if(removedLevel.isCollection){                    
130
                    parentLevel.getJsonObjectBuilder().add(removedLevel.getKeyName(), removedLevel.getJsonArrayBuilder());
131
                }else{
132
                    parentLevel.getJsonObjectBuilder().add(removedLevel.getKeyName(), removedLevel.getJsonObjectBuilder());
133
                }
134
            }
135
        }
136
        
137
    }    
138
    
139
    public void startCollection() {
140
        if(position == null){
141
             isRootArray = true;              
142
             Level rootLevel = new Level(true, null);
143
             if(rootJsonArrayBuilder == null){
144
                  rootJsonArrayBuilder = Json.createArrayBuilder();
145
             }
146
             rootLevel.setJsonArrayBuilder(rootJsonArrayBuilder);
147
             position = rootLevel;
148
        } else {            
149
            if(isLastEventStart){
150
                position.setComplex(true);           
151
            }            
152
            Level level = new Level(true, position);            
153
            position = level;
154
        }      
155
        isLastEventStart = false;
156
    }
157
    
158
    @Override
159
    public void endCollection() {
160
         popAndSetInParentBuilder();    
161
    }
162
    
163
    @Override    
164
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
165
        super.openStartElement(xPathFragment, namespaceResolver);
166
        if(position != null){
167
            Level newLevel = new Level(false, position);
168
            
169
            if(position.isCollection){
170
                newLevel.itemInCollection = true;            
171
            }            
172
          
173
            if(isLastEventStart){ 
174
                //this means 2 startevents in a row so the last this is a complex object
175
                position.setComplex(true);                                
176
            }
177
                      
178
            String keyName = getKeyName(xPathFragment);
179
           
180
            if(position.isCollection && position.isEmptyCollection() ){
181
                position.setKeyName(keyName);
182
            }else{
183
                newLevel.setKeyName(keyName);    
184
            }
185
            position = newLevel;   
186
            isLastEventStart = true;
187
        }
188
    }
189
    
190
    protected String getKeyName(XPathFragment xPathFragment){
191
        String keyName = xPathFragment.getLocalName(); 
192
       
193
        if(isNamespaceAware()){
194
            if(xPathFragment.getNamespaceURI() != null){
195
                String prefix = null;
196
                if(getNamespaceResolver() !=null){
197
                    prefix = getNamespaceResolver().resolveNamespaceURI(xPathFragment.getNamespaceURI());
198
                } else if(namespaceResolver != null){
199
                    prefix = namespaceResolver.resolveNamespaceURI(xPathFragment.getNamespaceURI());
200
                }
201
                if(prefix != null && !prefix.equals(Constants.EMPTY_STRING)){
202
                    keyName = prefix + getNamespaceSeparator() +  keyName;                           
203
                }
204
            }
205
        } 
206
        if(xPathFragment.isAttribute() && attributePrefix != null){
207
            keyName = attributePrefix + keyName;
208
        }
209
210
        return keyName;
211
    }
212
213
    public void attribute(XPathFragment xPathFragment, NamespaceResolver namespaceResolver,  Object value, QName schemaType){
214
        if(xPathFragment.getNamespaceURI() != null && xPathFragment.getNamespaceURI() == javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI){
215
            return;
216
        }
217
        xPathFragment.setAttribute(true);
218
        openStartElement(xPathFragment, namespaceResolver);
219
        characters(schemaType, value, null, false, true);
220
        endElement(xPathFragment, namespaceResolver);
221
    }
222
    
223
    /**
224
     * INTERNAL:
225
     */
226
    @Override
227
    public void marshalWithoutRootElement(ObjectBuilder treeObjectBuilder, Object object, Descriptor descriptor, Root root, boolean isXMLRoot){
228
        if(treeObjectBuilder != null){
229
            addXsiTypeAndClassIndicatorIfRequired(descriptor, null, descriptor.getDefaultRootElementField(), root, object, isXMLRoot, true);
230
            treeObjectBuilder.marshalAttributes(this, object, session);
231
        }         
232
     }
233
    
234
    /**
235
     * INTERNAL:
236
     * The character used to separate the prefix and uri portions when namespaces are present 
237
     * @since 2.4
238
     */
239
    public char getNamespaceSeparator(){        
240
        return marshaller.getNamespaceSeparator();
241
    }
242
    
243
    /**
244
     * INTERNAL:
245
     * The optional fragment used to wrap the text() mappings
246
     * @since 2.4
247
     */
248
    public XPathFragment getTextWrapperFragment() {
249
        return textWrapperFragment;
250
    }
251
    
252
    @Override
253
    public boolean isWrapperAsCollectionName() {
254
        return marshaller.isWrapperAsCollectionName();
255
    }
256
    
257
    @Override
258
    public void element(XPathFragment frag) {
259
        isLastEventStart = false;
260
    }
261
    
262
    /**
263
     * Handle marshal of an empty collection.  
264
     * @param xPathFragment
265
     * @param namespaceResolver
266
     * @param openGrouping if grouping elements should be marshalled for empty collections
267
     * @return
268
     */    
269
    public boolean emptyCollection(XPathFragment xPathFragment, NamespaceResolver namespaceResolver, boolean openGrouping) {
270
271
         if(marshaller.isMarshalEmptyCollections()){
272
             super.emptyCollection(xPathFragment, namespaceResolver, true);
273
             
274
             if (null != xPathFragment) {
275
                 
276
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
277
                     String keyName = position.getKeyName();
278
                     position.setComplex(false);
279
                     position.parentLevel.getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());                     
280
                 }else{ 
281
                     if(isLastEventStart){
282
                         position.setComplex(true);                  
283
                     }                 
284
                     String keyName =  getKeyName(xPathFragment);
285
                     if(keyName != null){
286
                        position.getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());
287
                     }
288
                 }
289
                 isLastEventStart = false;   
290
             }
291
                  
292
             return true;
293
         }else{
294
             return super.emptyCollection(xPathFragment, namespaceResolver, openGrouping);
295
         }
296
    }
297
298
    @Override
299
    public void attribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver, String value) {
300
        attribute(xPathFragment, namespaceResolver, value, null);
301
    }
302
303
    @Override
304
    public void attribute(String namespaceURI, String localName, String qName, String value) {
305
        XPathFragment xPathFragment = new XPathFragment();
306
        xPathFragment.setNamespaceURI(namespaceURI);
307
        xPathFragment.setAttribute(true);
308
        xPathFragment.setLocalName(localName);
309
310
        openStartElement(xPathFragment, namespaceResolver);
311
        characters(null, value, null, false, true);
312
313
        endElement(xPathFragment, namespaceResolver);
314
        
315
    }
316
317
    @Override
318
    public void closeStartElement() {}
319
320
    @Override
321
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
322
        if(position != null){
323
            if(isLastEventStart){
324
                position.setComplex(true);
325
            }
326
            if(position.isComplex){
327
                popAndSetInParentBuilder();
328
            }else{
329
                position = position.parentLevel;
330
            }            
331
            isLastEventStart = false;          
332
        }
333
    }
334
335
    @Override
336
    public void characters(String value) {
337
        writeValue(value, null, false);
338
    }
339
340
    @Override
341
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA){          
342
        characters(schemaType, value, mimeType, isCDATA, false);
343
     }
344
    
345
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA, boolean isAttribute){
346
        if(mimeType != null) {
347
            if(value instanceof List){
348
               value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesListForBinaryValues((List)value, marshaller, mimeType);
349
           }else{
350
351
            value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesForBinaryValue(value, marshaller, mimeType).getData();
352
           }
353
        }         
354
        if(schemaType != null && Constants.QNAME_QNAME.equals(schemaType)){
355
            String convertedValue = getStringForQName((QName)value);
356
            writeValue(convertedValue, null, isAttribute);
357
        } 
358
        else if(value.getClass() == String.class){          
359
            //if schemaType is set and it's a numeric or boolean type don't treat as a string
360
            if(schemaType != null && isNumericOrBooleanType(schemaType)){
361
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);
362
                Object convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, theClass, schemaType);
363
                writeValue(convertedValue, schemaType, isAttribute);
364
            }else if(isCDATA){
365
                cdata((String)value);
366
            }else{
367
                writeValue((String)value, null, isAttribute);                
368
            }
369
       }else{
370
           Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
371
372
           if(schemaType == null || theClass == null){
373
               if(value.getClass() == CoreClassConstants.BOOLEAN || CoreClassConstants.NUMBER.isAssignableFrom(value.getClass())){
374
                   writeValue(value, schemaType, isAttribute);
375
               }else{
376
                   String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
377
                   writeValue(convertedValue, schemaType, isAttribute);
378
               }
379
           }else if(schemaType != null && !isNumericOrBooleanType(schemaType)){
380
               //if schemaType exists and is not boolean or number do write quotes (convert to string)
381
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
382
               writeValue(convertedValue, schemaType, isAttribute);
383
           } else if(isCDATA){
384
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
385
               cdata(convertedValue);
386
           }else{
387
               writeValue(value, schemaType, isAttribute);           
388
           }
389
       }        
390
    }
391
    
392
    
393
    private boolean isNumericOrBooleanType(QName schemaType){
394
        if(schemaType == null){
395
            return false;
396
        }else if(schemaType.equals(Constants.BOOLEAN_QNAME)
397
                || schemaType.equals(Constants.INTEGER_QNAME)
398
                || schemaType.equals(Constants.INT_QNAME)
399
                || schemaType.equals(Constants.BYTE_QNAME)
400
                || schemaType.equals(Constants.DECIMAL_QNAME)
401
                || schemaType.equals(Constants.FLOAT_QNAME)
402
                || schemaType.equals(Constants.DOUBLE_QNAME)
403
                || schemaType.equals(Constants.SHORT_QNAME)
404
                || schemaType.equals(Constants.LONG_QNAME)
405
                || schemaType.equals(Constants.NEGATIVE_INTEGER_QNAME)
406
                || schemaType.equals(Constants.NON_NEGATIVE_INTEGER_QNAME)
407
                || schemaType.equals(Constants.NON_POSITIVE_INTEGER_QNAME)
408
                || schemaType.equals(Constants.POSITIVE_INTEGER_QNAME)
409
                || schemaType.equals(Constants.UNSIGNED_BYTE_QNAME)
410
                || schemaType.equals(Constants.UNSIGNED_INT_QNAME)
411
                || schemaType.equals(Constants.UNSIGNED_LONG_QNAME)
412
                || schemaType.equals(Constants.UNSIGNED_SHORT_QNAME)
413
        ){
414
            return true;
415
        }
416
        return false;
417
    }
418
    
419
    public void writeValue(Object value, QName schemaType, boolean isAttribute) {
420
        
421
        if (characterEscapeHandler != null && value instanceof String) {
422
            try {
423
                StringWriter stringWriter = new StringWriter();
424
                characterEscapeHandler.escape(((String)value).toCharArray(), 0, ((String)value).length(), isAttribute, stringWriter);
425
                value = stringWriter.toString();
426
            } catch (IOException e) {
427
                throw XMLMarshalException.marshalException(e);
428
            }
429
        }
430
        
431
        boolean textWrapperOpened = false;                       
432
        if(!isLastEventStart){
433
             openStartElement(textWrapperFragment, namespaceResolver);
434
             textWrapperOpened = true;
435
        }
436
      
437
        Level currentLevel = position;
438
        String keyName = position.getKeyName();
439
        if(!position.isComplex){           
440
            currentLevel = position.parentLevel;
441
            currentLevel.setComplex(true);          
442
        }
443
        if(currentLevel.isCollection()){
444
            currentLevel.setEmptyCollection(false);
445
            addValueToArrayBuilder(currentLevel.getJsonArrayBuilder(), value, schemaType);            
446
        } else {
447
            JsonObjectBuilder builder = currentLevel.getJsonObjectBuilder();                   
448
            addValueToObjectBuilder(builder, keyName, value, schemaType);          
449
        }
450
        isLastEventStart = false;
451
        if(textWrapperOpened){    
452
             endElement(textWrapperFragment, namespaceResolver);
453
        }    
454
    }
455
    
456
    private void addValueToObjectBuilder(JsonObjectBuilder jsonObjectBuilder, String keyName, Object value, QName schemaType){
457
        if(value == NULL){
458
            jsonObjectBuilder.addNull(keyName);
459
        }else if(value instanceof Integer){
460
            jsonObjectBuilder.add(keyName, (Integer)value);  
461
        }else if(value instanceof BigDecimal){
462
            jsonObjectBuilder.add(keyName, (BigDecimal)value);   
463
        }else if(value instanceof BigInteger){
464
            jsonObjectBuilder.add(keyName, (BigInteger)value);               
465
        }else if(value instanceof Boolean){
466
            jsonObjectBuilder.add(keyName, (Boolean)value);
467
        }else if(value instanceof Character){
468
            jsonObjectBuilder.add(keyName, (Character)value);  
469
        }else if(value instanceof Double){
470
            jsonObjectBuilder.add(keyName, (Double)value);
471
        }else if(value instanceof Float){
472
            jsonObjectBuilder.add(keyName, (Float)value);
473
        }else if(value instanceof Long){
474
            jsonObjectBuilder.add(keyName, (Long)value);
475
        }else if(value instanceof String){
476
            jsonObjectBuilder.add(keyName, (String)value);                
477
        }else{
478
            String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
479
            Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
480
            if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
481
                //if it's still a number and falls through the cracks we dont want "" around the value
482
                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
483
                    jsonObjectBuilder.add(keyName, (BigDecimal)convertedNumberValue);
484
            }else{
485
                jsonObjectBuilder.add(keyName, convertedValue);
486
            }
487
                
488
        }
489
    }
490
    
491
    private void addValueToArrayBuilder(JsonArrayBuilder jsonArrayBuilder, Object value, QName schemaType){
492
        if(value == NULL){
493
            jsonArrayBuilder.addNull();
494
        }else if(value instanceof Integer){
495
            jsonArrayBuilder.add((Integer)value);  
496
        }else if(value instanceof BigDecimal){
497
            jsonArrayBuilder.add((BigDecimal)value);   
498
        }else if(value instanceof BigInteger){
499
            jsonArrayBuilder.add((BigInteger)value);               
500
        }else if(value instanceof Boolean){                
501
            jsonArrayBuilder.add((Boolean)value);
502
        }else if(value instanceof Character){
503
            jsonArrayBuilder.add((Character)value);  
504
        }else if(value instanceof Double){
505
            jsonArrayBuilder.add((Double)value);
506
        }else if(value instanceof Float){
507
            jsonArrayBuilder.add((Float)value);
508
        }else if(value instanceof Long){
509
            jsonArrayBuilder.add((Long)value);
510
        }else if(value instanceof String){
511
            jsonArrayBuilder.add((String)value);
512
        }else{
513
            String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
514
            Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
515
            if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
516
                //if it's still a number and falls through the cracks we dont want "" around the value
517
                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
518
                    jsonArrayBuilder.add((BigDecimal)convertedNumberValue);
519
            }else{
520
                jsonArrayBuilder.add(convertedValue);
521
            }
522
        }
523
    }
524
    
525
    @Override
526
    public void cdata(String value) {
527
        characters(value);        
528
    }
529
530
    @Override
531
    public void node(Node node, NamespaceResolver resolver, String uri, String name) {
532
       
533
        if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
534
            Attr attr = (Attr) node;
535
            String resolverPfx = null;
536
            if (getNamespaceResolver() != null) {
537
                resolverPfx = this.getNamespaceResolver().resolveNamespaceURI(attr.getNamespaceURI());
538
            }
539
            String namespaceURI = attr.getNamespaceURI();
540
            // If the namespace resolver contains a prefix for the attribute's URI,
541
            // use it instead of what is set on the attribute
542
            if (resolverPfx != null) {
543
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, resolverPfx+Constants.COLON+attr.getLocalName(), attr.getNodeValue());
544
            } else {
545
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, attr.getName(), attr.getNodeValue());
546
                // May need to declare the URI locally
547
                if (attr.getNamespaceURI() != null) {
548
                    attribute(javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI, Constants.EMPTY_STRING, javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON + attr.getPrefix(), attr.getNamespaceURI());
549
                    this.getNamespaceResolver().put(attr.getPrefix(), attr.getNamespaceURI());
550
                }
551
            }
552
        } else if (node.getNodeType() == Node.TEXT_NODE) {
553
            writeValue(node.getNodeValue(), null, false);
554
        } else {
555
            try {
556
                JsonObjectBuilderRecordContentHandler wrcHandler = new JsonObjectBuilderRecordContentHandler();
557
                
558
                XMLFragmentReader xfragReader = new XMLFragmentReader(namespaceResolver);
559
                xfragReader.setContentHandler(wrcHandler);
560
                xfragReader.setProperty("http://xml.org/sax/properties/lexical-handler", wrcHandler);
561
                xfragReader.parse(node, uri, name);
562
            } catch (SAXException sex) {
563
                throw XMLMarshalException.marshalException(sex);
564
            }
565
        }
566
        
567
    }        
568
    
569
    protected String getStringForQName(QName qName){
570
        if(null == qName) {
571
            return null;
572
        }
573
        CoreConversionManager xmlConversionManager = getSession().getDatasourcePlatform().getConversionManager();
574
575
        return (String) xmlConversionManager.convertObject(qName, String.class);       
576
    }
577
578
    /**
579
     * INTERNAL:
580
     */
581
     public void namespaceDeclarations(NamespaceResolver namespaceResolver) {
582
     }
583
584
     public void namespaceDeclaration(String prefix, String namespaceURI){
585
     }
586
     
587
     public void defaultNamespaceDeclaration(String defaultNamespace){
588
     }
589
     
590
    /**
591
     * INTERNAL:
592
     */
593
     public void nilComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
594
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
595
         closeStartGroupingElements(groupingFragment);
596
         openStartElement(xPathFragment, namespaceResolver);
597
         characters(NULL);
598
         endElement(xPathFragment, namespaceResolver);
599
     }
600
601
    /**
602
     * INTERNAL:
603
     */
604
     public void nilSimple(NamespaceResolver namespaceResolver){
605
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);         
606
         characters(NULL);        
607
         closeStartGroupingElements(groupingFragment);
608
     }
609
610
     /**
611
      * Used when an empty simple value should be written
612
      * @since EclipseLink 2.4
613
      */
614
     public void emptySimple(NamespaceResolver namespaceResolver){
615
         nilSimple(namespaceResolver);
616
     }
617
     
618
     public void emptyAttribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver){
619
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
620
         openStartElement(xPathFragment, namespaceResolver);
621
         characters(NULL);
622
         endElement(xPathFragment, namespaceResolver);
623
         closeStartGroupingElements(groupingFragment);
624
     }
625
626
     /**
627
      * Used when an empty complex item should be written
628
      * @since EclipseLink 2.4
629
      */
630
     public void emptyComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
631
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
632
         closeStartGroupingElements(groupingFragment);
633
         openStartElement(xPathFragment, namespaceResolver);
634
         endElement(xPathFragment, namespaceResolver);
635
     }
636
    
637
    
638
     
639
     /**
640
      * This class will typically be used in conjunction with an XMLFragmentReader.
641
      * The XMLFragmentReader will walk a given XMLFragment node and report events
642
      * to this class - the event's data is then written to the enclosing class'
643
      * writer.
644
      *
645
      * @see org.eclipse.persistence.internal.oxm.record.XMLFragmentReader
646
      */
647
     protected class JsonObjectBuilderRecordContentHandler implements ExtendedContentHandler, LexicalHandler {
648
649
         JsonObjectBuilderRecordContentHandler() {
650
         }
651
652
         // --------------------- CONTENTHANDLER METHODS --------------------- //
653
         public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
654
                 XPathFragment xPathFragment = new XPathFragment(localName);
655
                 xPathFragment.setNamespaceURI(namespaceURI);
656
                 openStartElement(xPathFragment, namespaceResolver);
657
                 handleAttributes(atts);
658
         }
659
660
         public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
661
             XPathFragment xPathFragment = new XPathFragment(localName);
662
             xPathFragment.setNamespaceURI(namespaceURI);
663
             
664
             JsonObjectBuilderWriterRecord.this.endElement(xPathFragment, namespaceResolver);        
665
         }
666
667
         public void startPrefixMapping(String prefix, String uri) throws SAXException {
668
         }
669
670
         public void characters(char[] ch, int start, int length) throws SAXException {
671
             String characters = new String (ch, start, length);
672
             characters(characters);
673
         }
674
675
         public void characters(CharSequence characters) throws SAXException {           
676
             JsonObjectBuilderWriterRecord.this.characters(characters.toString());      
677
         }
678
679
         // --------------------- LEXICALHANDLER METHODS --------------------- //
680
         public void comment(char[] ch, int start, int length) throws SAXException {
681
         }
682
683
         public void startCDATA() throws SAXException {
684
         }
685
686
         public void endCDATA() throws SAXException {
687
         }
688
689
         // --------------------- CONVENIENCE METHODS --------------------- //
690
            protected void handleAttributes(Attributes atts) {
691
             for (int i=0, attsLength = atts.getLength(); i<attsLength; i++) {
692
                 String qName = atts.getQName(i);
693
                 if((qName != null && (qName.startsWith(javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON) || qName.equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)))) {
694
                     continue;
695
                 }
696
                 attribute(atts.getURI(i), atts.getLocalName(i), qName, atts.getValue(i));
697
             }
698
         }
699
700
         protected void writeComment(char[] chars, int start, int length) {        
701
         }
702
        
703
         protected void writeCharacters(char[] chars, int start, int length) {
704
             try {
705
                 characters(chars, start, length);
706
             } catch (SAXException e) {
707
                 throw XMLMarshalException.marshalException(e);
708
             }           
709
         }
710
         // --------------- SATISFY CONTENTHANDLER INTERFACE --------------- //
711
         public void endPrefixMapping(String prefix) throws SAXException {}
712
         public void processingInstruction(String target, String data) throws SAXException {}
713
         public void setDocumentLocator(Locator locator) {}
714
         public void startDocument() throws SAXException {}
715
         public void endDocument() throws SAXException {}
716
         public void skippedEntity(String name) throws SAXException {}
717
         public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {}
718
719
         // --------------- SATISFY LEXICALHANDLER INTERFACE --------------- //
720
         public void startEntity(String name) throws SAXException {}
721
         public void endEntity(String name) throws SAXException {}
722
         public void startDTD(String name, String publicId, String systemId) throws SAXException {}
723
         public void endDTD() throws SAXException {}
724
         @Override
725
         public void setNil(boolean isNil) {}
726
727
     }
728
729
     
730
     /**
731
     * Instances of this class are used to maintain state about the current
732
     * level of the JSON message being marshalled.
733
     */
734
    protected static class Level {
735
        
736
        private boolean isCollection;
737
        private boolean emptyCollection;
738
        private String keyName;        
739
        private JsonObjectBuilder jsonObjectBuilder;
740
        private JsonArrayBuilder jsonArrayBuilder;
741
        private boolean isComplex;
742
        private boolean itemInCollection;
743
        private Level parentLevel;
744
        
745
        public Level(boolean isCollection, Level parentLevel) {
746
            setCollection(isCollection);
747
            emptyCollection = true;
748
            this.parentLevel = parentLevel;
749
        }
750
751
        public boolean isCollection() {
752
            return isCollection;
753
        }
754
755
        public void setCollection(boolean isCollection) {
756
            this.isCollection = isCollection;
757
            if(isCollection && jsonArrayBuilder == null){
758
                jsonArrayBuilder = Json.createArrayBuilder();
759
            }
760
        }
761
762
        public String getKeyName() {
763
            return keyName;
764
        }
765
766
        public void setKeyName(String keyName) {
767
            this.keyName = keyName;
768
        }
769
770
        public JsonObjectBuilder getJsonObjectBuilder() {
771
            return jsonObjectBuilder;
772
        }
773
774
        public void setJsonObjectBuilder(JsonObjectBuilder jsonObjectBuilder) {
775
            this.jsonObjectBuilder = jsonObjectBuilder;
776
        }
777
778
        public JsonArrayBuilder getJsonArrayBuilder() {
779
            return jsonArrayBuilder;
780
        }
781
782
        public void setJsonArrayBuilder(JsonArrayBuilder jsonArrayBuilder) {
783
            this.jsonArrayBuilder = jsonArrayBuilder;
784
        }
785
786
        public boolean isEmptyCollection() {
787
            return emptyCollection;
788
        }
789
790
        public void setEmptyCollection(boolean emptyCollection) {
791
            this.emptyCollection = emptyCollection;
792
        }
793
        public boolean isComplex() {
794
            return isComplex;
795
        }
796
797
        public void setComplex(boolean isComplex) {
798
            this.isComplex = isComplex;
799
            if(isComplex && jsonObjectBuilder == null){
800
                jsonObjectBuilder = Json.createObjectBuilder();
801
            }
802
        }
803
804
        public boolean isItemInCollection() {
805
            return itemInCollection;
806
        }
807
808
        public void setItemInCollection(boolean itemInCollection) {
809
            this.itemInCollection = itemInCollection;
810
        }
811
    }
812
813
814
}
(-)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 / +22 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
        getJSONMarshaller().marshal(getWriteControlObject(), result);
323
        JsonObject jsonObject = jsonObjectBuilder.build();
324
        
325
        StringWriter sw = new StringWriter();
326
        JsonWriter writer= Json.createWriter(sw);
327
        writer.writeObject(jsonObject);
328
        writer.close();
329
        
330
        log(sw.toString());
331
        compareStringToControlFile("**testJSONMarshalToStringWriter**", sw.toString());
332
    }
312
333
313
    protected void compareStringToControlFile(String test, String testString) {
334
    protected void compareStringToControlFile(String test, String testString) {
314
    	compareStringToControlFile(test, testString, getWriteControlJSON());
335
    	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/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/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