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 411382 | Differences between
and this patch

Collapse All | Expand All

(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/Version.java (-6 / +6 lines)
Lines 29-45 public class Version { Link Here
29
    // This will be used by all product components and included in exceptions.
29
    // This will be used by all product components and included in exceptions.
30
    private static String product = "Eclipse Persistence Services";
30
    private static String product = "Eclipse Persistence Services";
31
    // A three part version number (major.minor.service)
31
    // A three part version number (major.minor.service)
32
    private static final String version = "@VERSION@";
32
    private static final String version = "2.6.0";
33
    // A string that describes this build i.e.( vYYYYMMDD-HHMM, etc.)
33
    // A string that describes this build i.e.( vYYYYMMDD-HHMM, etc.)
34
    private static final String qualifier = "@QUALIFIER@";
34
    private static final String qualifier = "qualifier";
35
    // Should be in the format YYYYMMDD
35
    // Should be in the format YYYYMMDD
36
    private static final String buildDate = "@BUILD_DATE@";
36
    private static final String buildDate = "20130724";
37
    // Should be in the format HHMM
37
    // Should be in the format HHMM
38
    private static final String buildTime = "@BUILD_TIME@";
38
    private static final String buildTime = "1507";
39
    // revision of source from the repository
39
    // revision of source from the repository
40
    private static final String buildRevision = "@BUILD_REVISION@";
40
    private static final String buildRevision = "NA";
41
    // Typically SNAPSHOT, Milestone name (M1,M2,etc), or RELEASE
41
    // Typically SNAPSHOT, Milestone name (M1,M2,etc), or RELEASE
42
    private static final String buildType = "@BUILD_TYPE@";
42
    private static final String buildType = "SNAPSHOT";
43
 
43
 
44
    /** Keep track of JDK version in order to make some decisions about data structures. **/
44
    /** Keep track of JDK version in order to make some decisions about data structures. **/
45
    public static final int JDK_VERSION_NOT_SET = 0;
45
    public static final int JDK_VERSION_NOT_SET = 0;
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/json/JsonGeneratorResult.java (+34 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.stream.JsonGenerator;
16
17
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
18
import org.eclipse.persistence.oxm.record.JsonGeneratorRecord;
19
20
public class JsonGeneratorResult extends ExtendedResult{
21
22
    private JsonGenerator generator;
23
    
24
    public JsonGeneratorResult(JsonGenerator generator){
25
        this.generator = generator;
26
    }
27
28
    @Override
29
    public org.eclipse.persistence.oxm.record.MarshalRecord createRecord() {
30
        JsonGeneratorRecord record = new JsonGeneratorRecord(generator);
31
        return record;
32
    }    
33
34
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonBuilderRecord.java (-485 / +45 lines)
Lines 16-22 import java.io.IOException; Link Here
16
import java.io.StringWriter;
16
import java.io.StringWriter;
17
import java.math.BigDecimal;
17
import java.math.BigDecimal;
18
import java.math.BigInteger;
18
import java.math.BigInteger;
19
import java.util.List;
20
19
21
import javax.json.Json;
20
import javax.json.Json;
22
import javax.json.JsonArrayBuilder;
21
import javax.json.JsonArrayBuilder;
Lines 25-63 import javax.xml.namespace.QName; Link Here
25
24
26
import org.eclipse.persistence.exceptions.XMLMarshalException;
25
import org.eclipse.persistence.exceptions.XMLMarshalException;
27
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
26
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
28
import org.eclipse.persistence.internal.core.helper.CoreConversionManager;
29
import org.eclipse.persistence.internal.oxm.CharacterEscapeHandler;
30
import org.eclipse.persistence.internal.oxm.Constants;
31
import org.eclipse.persistence.internal.oxm.ConversionManager;
27
import org.eclipse.persistence.internal.oxm.ConversionManager;
32
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
28
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
33
import org.eclipse.persistence.internal.oxm.ObjectBuilder;
34
import org.eclipse.persistence.internal.oxm.Root;
35
import org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper;
36
import org.eclipse.persistence.internal.oxm.XMLMarshaller;
37
import org.eclipse.persistence.internal.oxm.XPathFragment;
29
import org.eclipse.persistence.internal.oxm.XPathFragment;
38
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
30
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
39
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
31
import org.eclipse.persistence.oxm.record.JsonRecord.Level;
40
import org.eclipse.persistence.internal.oxm.record.ExtendedContentHandler;
41
import org.eclipse.persistence.internal.oxm.record.XMLFragmentReader;
42
import org.w3c.dom.Attr;
43
import org.w3c.dom.Node;
44
import org.xml.sax.Attributes;
45
import org.xml.sax.Locator;
46
import org.xml.sax.SAXException;
47
import org.xml.sax.ext.LexicalHandler;
48
32
49
public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> {
33
public class JsonBuilderRecord extends JsonRecord {
50
34
51
    private Level position;
35
    private Level position;
52
    private JsonObjectBuilder rootJsonObjectBuilder;
36
    private JsonObjectBuilder rootJsonObjectBuilder;
53
    private JsonArrayBuilder rootJsonArrayBuilder;
37
    private JsonArrayBuilder rootJsonArrayBuilder;
54
    private CharacterEscapeHandler characterEscapeHandler;
38
 
55
39
    
56
    private String attributePrefix;
57
    private boolean isRootArray;
58
    private static final String NULL="null";
59
    private boolean isLastEventStart;
60
        
61
    public JsonBuilderRecord(){
40
    public JsonBuilderRecord(){
62
        super();
41
        super();
63
        isLastEventStart = false;
42
        isLastEventStart = false;
Lines 73-92 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
73
        rootJsonArrayBuilder = jsonArrayBuilder;
52
        rootJsonArrayBuilder = jsonArrayBuilder;
74
        isRootArray = true;
53
        isRootArray = true;
75
    }
54
    }
76
    
55
      
77
    /**
78
     * INTERNAL:
79
     */
80
    public void setMarshaller(XMLMarshaller marshaller) {
81
        super.setMarshaller(marshaller);
82
        attributePrefix = marshaller.getAttributePrefix();
83
        if (marshaller.getValueWrapper() != null) {
84
            textWrapperFragment = new XPathFragment();
85
            textWrapperFragment.setLocalName(marshaller.getValueWrapper());
86
        }
87
        characterEscapeHandler = marshaller.getCharacterEscapeHandler();
88
    }
89
    
90
    @Override
56
    @Override
91
    public void startDocument(String encoding, String version) {      
57
    public void startDocument(String encoding, String version) {      
92
        if(isRootArray){
58
        if(isRootArray){
Lines 117-131 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
117
                popAndSetInParentBuilder();
83
                popAndSetInParentBuilder();
118
            }else{
84
            }else{
119
                //this is the root level list case
85
                //this is the root level list case
120
                position = position.parentLevel;
86
                position = (Level) position.parentLevel;
121
            }
87
            }
122
        }
88
        }
123
    }
89
    }
124
    
90
    
125
    private void popAndSetInParentBuilder(){
91
    private void popAndSetInParentBuilder(){
126
        Level removedLevel = position;
92
        Level removedLevel = position;
127
        Level parentLevel = position.parentLevel;
93
        Level parentLevel = (Level) position.parentLevel;
128
        position = position.parentLevel;
94
        position = (Level) position.parentLevel;
129
        if(removedLevel.isCollection && removedLevel.isEmptyCollection() && removedLevel.keyName == null){
95
        if(removedLevel.isCollection && removedLevel.isEmptyCollection() && removedLevel.keyName == null){
130
            return;
96
            return;
131
        }
97
        }
Lines 159-165 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
159
             position = rootLevel;
125
             position = rootLevel;
160
        } else {            
126
        } else {            
161
            if(isLastEventStart){
127
            if(isLastEventStart){
162
                position.setComplex(true);           
128
                setComplex(position, true);           
163
            }            
129
            }            
164
            Level level = new Level(true, position);            
130
            Level level = new Level(true, position);            
165
            position = level;
131
            position = level;
Lines 172-177 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
172
         popAndSetInParentBuilder();    
138
         popAndSetInParentBuilder();    
173
    }
139
    }
174
    
140
    
141
    private void setComplex(Level level, boolean complex){
142
        boolean isAlreadyComplex = level.isComplex;
143
        level.setComplex(complex);
144
        if(complex && !isAlreadyComplex){
145
            if(complex && level.jsonObjectBuilder == null){
146
                level.jsonObjectBuilder = Json.createObjectBuilder();
147
            }
148
        }
149
    }
150
    
175
    @Override    
151
    @Override    
176
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
152
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
177
        super.openStartElement(xPathFragment, namespaceResolver);
153
        super.openStartElement(xPathFragment, namespaceResolver);
Lines 180-186 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
180
            
156
            
181
            if(isLastEventStart){ 
157
            if(isLastEventStart){ 
182
                //this means 2 startevents in a row so the last this is a complex object
158
                //this means 2 startevents in a row so the last this is a complex object
183
                position.setComplex(true);                                
159
                setComplex(position, true);                                
184
            }
160
            }
185
                      
161
                      
186
            String keyName = getKeyName(xPathFragment);
162
            String keyName = getKeyName(xPathFragment);
Lines 194-272 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
194
            isLastEventStart = true;
170
            isLastEventStart = true;
195
        }
171
        }
196
    }
172
    }
197
    
198
    protected String getKeyName(XPathFragment xPathFragment){
199
        String keyName = xPathFragment.getLocalName(); 
200
       
173
       
201
        if(isNamespaceAware()){
202
            if(xPathFragment.getNamespaceURI() != null){
203
                String prefix = null;
204
                if(getNamespaceResolver() !=null){
205
                    prefix = getNamespaceResolver().resolveNamespaceURI(xPathFragment.getNamespaceURI());
206
                } else if(namespaceResolver != null){
207
                    prefix = namespaceResolver.resolveNamespaceURI(xPathFragment.getNamespaceURI());
208
                }
209
                if(prefix != null && !prefix.equals(Constants.EMPTY_STRING)){
210
                    keyName = prefix + getNamespaceSeparator() +  keyName;                           
211
                }
212
            }
213
        } 
214
        if(xPathFragment.isAttribute() && attributePrefix != null){
215
            keyName = attributePrefix + keyName;
216
        }
217
218
        return keyName;
219
    }
220
221
    public void attribute(XPathFragment xPathFragment, NamespaceResolver namespaceResolver,  Object value, QName schemaType){
222
        if(xPathFragment.getNamespaceURI() != null && xPathFragment.getNamespaceURI() == javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI){
223
            return;
224
        }
225
        xPathFragment.setAttribute(true);
226
        openStartElement(xPathFragment, namespaceResolver);
227
        characters(schemaType, value, null, false, true);
228
        endElement(xPathFragment, namespaceResolver);
229
    }
230
    
231
    /**
232
     * INTERNAL:
233
     */
234
    @Override
235
    public void marshalWithoutRootElement(ObjectBuilder treeObjectBuilder, Object object, Descriptor descriptor, Root root, boolean isXMLRoot){
236
        if(treeObjectBuilder != null){
237
            addXsiTypeAndClassIndicatorIfRequired(descriptor, null, descriptor.getDefaultRootElementField(), root, object, isXMLRoot, true);
238
            treeObjectBuilder.marshalAttributes(this, object, session);
239
        }         
240
     }
241
    
242
    /**
243
     * INTERNAL:
244
     * The character used to separate the prefix and uri portions when namespaces are present 
245
     * @since 2.4
246
     */
247
    public char getNamespaceSeparator(){        
248
        return marshaller.getNamespaceSeparator();
249
    }
250
    
251
    /**
252
     * INTERNAL:
253
     * The optional fragment used to wrap the text() mappings
254
     * @since 2.4
255
     */
256
    public XPathFragment getTextWrapperFragment() {
257
        return textWrapperFragment;
258
    }
259
    
260
    @Override
261
    public boolean isWrapperAsCollectionName() {
262
        return marshaller.isWrapperAsCollectionName();
263
    }
264
    
265
    @Override
266
    public void element(XPathFragment frag) {
267
        isLastEventStart = false;
268
    }
269
    
270
    /**
174
    /**
271
     * Handle marshal of an empty collection.  
175
     * Handle marshal of an empty collection.  
272
     * @param xPathFragment
176
     * @param xPathFragment
Lines 283-293 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
283
                 
187
                 
284
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
188
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
285
                     String keyName = position.getKeyName();
189
                     String keyName = position.getKeyName();
286
                     position.setComplex(false);
190
                     setComplex(position, false);
287
                     position.parentLevel.getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());                     
191
                     ((Level)position.parentLevel).getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());                     
288
                 }else{ 
192
                 }else{ 
289
                     if(isLastEventStart){
193
                     if(isLastEventStart){                         
290
                         position.setComplex(true);                  
194
                         setComplex(position, true);
291
                     }                 
195
                     }                 
292
                     String keyName =  getKeyName(xPathFragment);
196
                     String keyName =  getKeyName(xPathFragment);
293
                     if(keyName != null){
197
                     if(keyName != null){
Lines 304-428 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
304
    }
208
    }
305
209
306
    @Override
210
    @Override
307
    public void attribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver, String value) {
308
        attribute(xPathFragment, namespaceResolver, value, null);
309
    }
310
311
    @Override
312
    public void attribute(String namespaceURI, String localName, String qName, String value) {
313
        XPathFragment xPathFragment = new XPathFragment();
314
        xPathFragment.setNamespaceURI(namespaceURI);
315
        xPathFragment.setAttribute(true);
316
        xPathFragment.setLocalName(localName);
317
318
        openStartElement(xPathFragment, namespaceResolver);
319
        characters(null, value, null, false, true);
320
321
        endElement(xPathFragment, namespaceResolver);
322
        
323
    }
324
325
    @Override
326
    public void closeStartElement() {}
327
328
    @Override
329
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
211
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
330
        if(position != null){
212
        if(position != null){
331
            if(isLastEventStart){
213
            if(isLastEventStart){
332
                position.setComplex(true);
214
                setComplex(position, true);
333
            }
215
            }
334
            if(position.isComplex){
216
            if(position.isComplex){
335
                popAndSetInParentBuilder();
217
                popAndSetInParentBuilder();
336
            }else{
218
            }else{
337
                position = position.parentLevel;
219
                position = (Level) position.parentLevel;
338
            }            
220
            }            
339
            isLastEventStart = false;          
221
            isLastEventStart = false;          
340
        }
222
        }
341
    }
223
    }
342
343
    @Override
344
    public void characters(String value) {
345
        writeValue(value, null, false);
346
    }
347
348
    @Override
349
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA){          
350
        characters(schemaType, value, mimeType, isCDATA, false);
351
     }
352
    
353
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA, boolean isAttribute){
354
        if(mimeType != null) {
355
            if(value instanceof List){
356
               value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesListForBinaryValues((List)value, marshaller, mimeType);
357
           }else{
358
359
            value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesForBinaryValue(value, marshaller, mimeType).getData();
360
           }
361
        }         
362
        if(schemaType != null && Constants.QNAME_QNAME.equals(schemaType)){
363
            String convertedValue = getStringForQName((QName)value);
364
            writeValue(convertedValue, null, isAttribute);
365
        } 
366
        else if(value.getClass() == String.class){          
367
            //if schemaType is set and it's a numeric or boolean type don't treat as a string
368
            if(schemaType != null && isNumericOrBooleanType(schemaType)){
369
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);
370
                Object convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, theClass, schemaType);
371
                writeValue(convertedValue, schemaType, isAttribute);
372
            }else if(isCDATA){
373
                cdata((String)value);
374
            }else{
375
                writeValue((String)value, null, isAttribute);                
376
            }
377
       }else{
378
           Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
379
380
           if(schemaType == null || theClass == null){
381
               if(value.getClass() == CoreClassConstants.BOOLEAN || CoreClassConstants.NUMBER.isAssignableFrom(value.getClass())){
382
                   writeValue(value, schemaType, isAttribute);
383
               }else{
384
                   String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
385
                   writeValue(convertedValue, schemaType, isAttribute);
386
               }
387
           }else if(schemaType != null && !isNumericOrBooleanType(schemaType)){
388
               //if schemaType exists and is not boolean or number do write quotes (convert to string)
389
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
390
               writeValue(convertedValue, schemaType, isAttribute);
391
           } else if(isCDATA){
392
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
393
               cdata(convertedValue);
394
           }else{
395
               writeValue(value, schemaType, isAttribute);           
396
           }
397
       }        
398
    }
399
    
400
    
401
    private boolean isNumericOrBooleanType(QName schemaType){
402
        if(schemaType == null){
403
            return false;
404
        }else if(schemaType.equals(Constants.BOOLEAN_QNAME)
405
                || schemaType.equals(Constants.INTEGER_QNAME)
406
                || schemaType.equals(Constants.INT_QNAME)
407
                || schemaType.equals(Constants.BYTE_QNAME)
408
                || schemaType.equals(Constants.DECIMAL_QNAME)
409
                || schemaType.equals(Constants.FLOAT_QNAME)
410
                || schemaType.equals(Constants.DOUBLE_QNAME)
411
                || schemaType.equals(Constants.SHORT_QNAME)
412
                || schemaType.equals(Constants.LONG_QNAME)
413
                || schemaType.equals(Constants.NEGATIVE_INTEGER_QNAME)
414
                || schemaType.equals(Constants.NON_NEGATIVE_INTEGER_QNAME)
415
                || schemaType.equals(Constants.NON_POSITIVE_INTEGER_QNAME)
416
                || schemaType.equals(Constants.POSITIVE_INTEGER_QNAME)
417
                || schemaType.equals(Constants.UNSIGNED_BYTE_QNAME)
418
                || schemaType.equals(Constants.UNSIGNED_INT_QNAME)
419
                || schemaType.equals(Constants.UNSIGNED_LONG_QNAME)
420
                || schemaType.equals(Constants.UNSIGNED_SHORT_QNAME)
421
        ){
422
            return true;
423
        }
424
        return false;
425
    }
426
    
224
    
427
    public void writeValue(Object value, QName schemaType, boolean isAttribute) {
225
    public void writeValue(Object value, QName schemaType, boolean isAttribute) {
428
        
226
        
Lines 445-466 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
445
        Level currentLevel = position;
243
        Level currentLevel = position;
446
        String keyName = position.getKeyName();
244
        String keyName = position.getKeyName();
447
        if(!position.isComplex){           
245
        if(!position.isComplex){           
448
            currentLevel = position.parentLevel;
246
            currentLevel = (Level) position.parentLevel;         
449
            currentLevel.setComplex(true);          
247
        }       
450
        }
248
        addValue(currentLevel, keyName, value, schemaType);
451
        if(currentLevel.isCollection()){
452
            currentLevel.setEmptyCollection(false);
453
            addValueToArrayBuilder(currentLevel.getJsonArrayBuilder(), value, schemaType);            
454
        } else {
455
            JsonObjectBuilder builder = currentLevel.getJsonObjectBuilder();                   
456
            addValueToObjectBuilder(builder, keyName, value, schemaType);          
457
        }
458
        isLastEventStart = false;
249
        isLastEventStart = false;
459
        if(textWrapperOpened){    
250
        if(textWrapperOpened){    
460
             endElement(textWrapperFragment, namespaceResolver);
251
             endElement(textWrapperFragment, namespaceResolver);
461
        }    
252
        }    
462
    }
253
    }
463
    
254
    
255
    private void addValue(Level currentLevel, String keyName, Object value, QName schemaType){        
256
        if(currentLevel.isCollection()){
257
            currentLevel.setEmptyCollection(false);            
258
            addValueToArrayBuilder(currentLevel.getJsonArrayBuilder(), value, schemaType);
259
        } else {
260
            JsonObjectBuilder builder = currentLevel.getJsonObjectBuilder();
261
            addValueToObjectBuilder(builder, keyName, value, schemaType);            
262
        }
263
    }
264
    
464
    private void addValueToObjectBuilder(JsonObjectBuilder jsonObjectBuilder, String keyName, Object value, QName schemaType){
265
    private void addValueToObjectBuilder(JsonObjectBuilder jsonObjectBuilder, String keyName, Object value, QName schemaType){
465
        if(value == NULL){
266
        if(value == NULL){
466
            jsonObjectBuilder.addNull(keyName);
267
            jsonObjectBuilder.addNull(keyName);
Lines 530-779 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
530
        }
331
        }
531
    }
332
    }
532
    
333
    
533
    @Override
334
          
534
    public void cdata(String value) {
535
        characters(value);        
536
    }
537
538
    @Override
539
    public void node(Node node, NamespaceResolver resolver, String uri, String name) {
540
       
541
        if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
542
            Attr attr = (Attr) node;
543
            String resolverPfx = null;
544
            if (getNamespaceResolver() != null) {
545
                resolverPfx = this.getNamespaceResolver().resolveNamespaceURI(attr.getNamespaceURI());
546
            }
547
            String namespaceURI = attr.getNamespaceURI();
548
            // If the namespace resolver contains a prefix for the attribute's URI,
549
            // use it instead of what is set on the attribute
550
            if (resolverPfx != null) {
551
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, resolverPfx+Constants.COLON+attr.getLocalName(), attr.getNodeValue());
552
            } else {
553
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, attr.getName(), attr.getNodeValue());
554
                // May need to declare the URI locally
555
                if (attr.getNamespaceURI() != null) {
556
                    attribute(javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI, Constants.EMPTY_STRING, javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON + attr.getPrefix(), attr.getNamespaceURI());
557
                    this.getNamespaceResolver().put(attr.getPrefix(), attr.getNamespaceURI());
558
                }
559
            }
560
        } else if (node.getNodeType() == Node.TEXT_NODE) {
561
            writeValue(node.getNodeValue(), null, false);
562
        } else {
563
            try {
564
                JsonBuilderRecordContentHandler wrcHandler = new JsonBuilderRecordContentHandler();
565
                
566
                XMLFragmentReader xfragReader = new XMLFragmentReader(namespaceResolver);
567
                xfragReader.setContentHandler(wrcHandler);
568
                xfragReader.setProperty("http://xml.org/sax/properties/lexical-handler", wrcHandler);
569
                xfragReader.parse(node, uri, name);
570
            } catch (SAXException sex) {
571
                throw XMLMarshalException.marshalException(sex);
572
            }
573
        }
574
        
575
    }        
576
    
577
    protected String getStringForQName(QName qName){
578
        if(null == qName) {
579
            return null;
580
        }
581
        CoreConversionManager xmlConversionManager = getSession().getDatasourcePlatform().getConversionManager();
582
583
        return (String) xmlConversionManager.convertObject(qName, String.class);       
584
    }
585
586
    /**
587
     * INTERNAL:
588
     */
589
     public void namespaceDeclarations(NamespaceResolver namespaceResolver) {
590
     }
591
592
     public void namespaceDeclaration(String prefix, String namespaceURI){
593
     }
594
     
595
     public void defaultNamespaceDeclaration(String defaultNamespace){
596
     }
597
     
598
    /**
599
     * INTERNAL:
600
     */
601
     public void nilComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
602
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
603
         closeStartGroupingElements(groupingFragment);
604
         openStartElement(xPathFragment, namespaceResolver);
605
         characters(NULL);
606
         endElement(xPathFragment, namespaceResolver);
607
     }
608
609
    /**
610
     * INTERNAL:
611
     */
612
     public void nilSimple(NamespaceResolver namespaceResolver){
613
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);         
614
         characters(NULL);        
615
         closeStartGroupingElements(groupingFragment);
616
     }
617
618
     /**
619
      * Used when an empty simple value should be written
620
      * @since EclipseLink 2.4
621
      */
622
     public void emptySimple(NamespaceResolver namespaceResolver){
623
         nilSimple(namespaceResolver);
624
     }
625
     
626
     public void emptyAttribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver){
627
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
628
         openStartElement(xPathFragment, namespaceResolver);
629
         characters(NULL);
630
         endElement(xPathFragment, namespaceResolver);
631
         closeStartGroupingElements(groupingFragment);
632
     }
633
634
     /**
635
      * Used when an empty complex item should be written
636
      * @since EclipseLink 2.4
637
      */
638
     public void emptyComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
639
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
640
         closeStartGroupingElements(groupingFragment);
641
         openStartElement(xPathFragment, namespaceResolver);
642
         endElement(xPathFragment, namespaceResolver);
643
     }
644
    
645
    
646
     
647
     /**
648
      * This class will typically be used in conjunction with an XMLFragmentReader.
649
      * The XMLFragmentReader will walk a given XMLFragment node and report events
650
      * to this class - the event's data is then written to the enclosing class'
651
      * writer.
652
      *
653
      * @see org.eclipse.persistence.internal.oxm.record.XMLFragmentReader
654
      */
655
     protected class JsonBuilderRecordContentHandler implements ExtendedContentHandler, LexicalHandler {
656
657
         JsonBuilderRecordContentHandler() {
658
         }
659
660
         // --------------------- CONTENTHANDLER METHODS --------------------- //
661
         public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
662
                 XPathFragment xPathFragment = new XPathFragment(localName);
663
                 xPathFragment.setNamespaceURI(namespaceURI);
664
                 openStartElement(xPathFragment, namespaceResolver);
665
                 handleAttributes(atts);
666
         }
667
668
         public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
669
             XPathFragment xPathFragment = new XPathFragment(localName);
670
             xPathFragment.setNamespaceURI(namespaceURI);
671
             
672
             JsonBuilderRecord.this.endElement(xPathFragment, namespaceResolver);        
673
         }
674
675
         public void startPrefixMapping(String prefix, String uri) throws SAXException {
676
         }
677
678
         public void characters(char[] ch, int start, int length) throws SAXException {
679
             String characters = new String (ch, start, length);
680
             characters(characters);
681
         }
682
683
         public void characters(CharSequence characters) throws SAXException {           
684
             JsonBuilderRecord.this.characters(characters.toString());      
685
         }
686
687
         // --------------------- LEXICALHANDLER METHODS --------------------- //
688
         public void comment(char[] ch, int start, int length) throws SAXException {
689
         }
690
691
         public void startCDATA() throws SAXException {
692
         }
693
694
         public void endCDATA() throws SAXException {
695
         }
696
697
         // --------------------- CONVENIENCE METHODS --------------------- //
698
            protected void handleAttributes(Attributes atts) {
699
             for (int i=0, attsLength = atts.getLength(); i<attsLength; i++) {
700
                 String qName = atts.getQName(i);
701
                 if((qName != null && (qName.startsWith(javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON) || qName.equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)))) {
702
                     continue;
703
                 }
704
                 attribute(atts.getURI(i), atts.getLocalName(i), qName, atts.getValue(i));
705
             }
706
         }
707
708
         protected void writeComment(char[] chars, int start, int length) {        
709
         }
710
        
711
         protected void writeCharacters(char[] chars, int start, int length) {
712
             try {
713
                 characters(chars, start, length);
714
             } catch (SAXException e) {
715
                 throw XMLMarshalException.marshalException(e);
716
             }           
717
         }
718
         // --------------- SATISFY CONTENTHANDLER INTERFACE --------------- //
719
         public void endPrefixMapping(String prefix) throws SAXException {}
720
         public void processingInstruction(String target, String data) throws SAXException {}
721
         public void setDocumentLocator(Locator locator) {}
722
         public void startDocument() throws SAXException {}
723
         public void endDocument() throws SAXException {}
724
         public void skippedEntity(String name) throws SAXException {}
725
         public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {}
726
727
         // --------------- SATISFY LEXICALHANDLER INTERFACE --------------- //
728
         public void startEntity(String name) throws SAXException {}
729
         public void endEntity(String name) throws SAXException {}
730
         public void startDTD(String name, String publicId, String systemId) throws SAXException {}
731
         public void endDTD() throws SAXException {}
732
         @Override
733
         public void setNil(boolean isNil) {}
734
735
     }
736
737
     
738
     /**
335
     /**
739
     * Instances of this class are used to maintain state about the current
336
     * Instances of this class are used to maintain state about the current
740
     * level of the JSON message being marshalled.
337
     * level of the JSON message being marshalled.
741
     */
338
     */
742
    protected static class Level {
339
    protected static class Level extends JsonRecord.Level{
743
        
340
        
744
        private boolean isCollection;
745
        private boolean emptyCollection;
746
        private String keyName;        
747
        private JsonObjectBuilder jsonObjectBuilder;
341
        private JsonObjectBuilder jsonObjectBuilder;
748
        private JsonArrayBuilder jsonArrayBuilder;
342
        private JsonArrayBuilder jsonArrayBuilder;
749
        private boolean isComplex;
750
        private Level parentLevel;
751
        
343
        
752
        public Level(boolean isCollection, Level parentLevel) {
344
        public Level(boolean isCollection, Level parentLevel) {
753
            setCollection(isCollection);
345
            super(isCollection, parentLevel);
754
            emptyCollection = true;
755
            this.parentLevel = parentLevel;
756
        }
757
758
        public boolean isCollection() {
759
            return isCollection;
760
        }
346
        }
761
347
     
762
        public void setCollection(boolean isCollection) {
348
        public void setCollection(boolean isCollection) {
763
            this.isCollection = isCollection;
349
            super.setCollection(isCollection);
764
            if(isCollection && jsonArrayBuilder == null){
350
            if(isCollection && jsonArrayBuilder == null){
765
                jsonArrayBuilder = Json.createArrayBuilder();
351
                jsonArrayBuilder = Json.createArrayBuilder();
766
            }
352
            }
767
        }
353
        }
768
354
769
        public String getKeyName() {
770
            return keyName;
771
        }
772
773
        public void setKeyName(String keyName) {
774
            this.keyName = keyName;
775
        }
776
777
        public JsonObjectBuilder getJsonObjectBuilder() {
355
        public JsonObjectBuilder getJsonObjectBuilder() {
778
            return jsonObjectBuilder;
356
            return jsonObjectBuilder;
779
        }
357
        }
Lines 788-812 public class JsonBuilderRecord extends MarshalRecord <XMLMarshaller> { Link Here
788
366
789
        public void setJsonArrayBuilder(JsonArrayBuilder jsonArrayBuilder) {
367
        public void setJsonArrayBuilder(JsonArrayBuilder jsonArrayBuilder) {
790
            this.jsonArrayBuilder = jsonArrayBuilder;
368
            this.jsonArrayBuilder = jsonArrayBuilder;
791
        }
369
        }       
792
793
        public boolean isEmptyCollection() {
794
            return emptyCollection;
795
        }
796
797
        public void setEmptyCollection(boolean emptyCollection) {
798
            this.emptyCollection = emptyCollection;
799
        }
800
        public boolean isComplex() {
801
            return isComplex;
802
        }
803
804
        public void setComplex(boolean isComplex) {
805
            this.isComplex = isComplex;
806
            if(isComplex && jsonObjectBuilder == null){
807
                jsonObjectBuilder = Json.createObjectBuilder();
808
            }
809
        }
810
370
811
    }
371
    }
812
372
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonGeneratorRecord.java (+292 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.record;
14
15
import java.io.IOException;
16
import java.io.StringWriter;
17
import java.math.BigDecimal;
18
import java.math.BigInteger;
19
20
import javax.json.stream.JsonGenerator;
21
import javax.xml.namespace.QName;
22
23
import org.eclipse.persistence.exceptions.XMLMarshalException;
24
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
25
import org.eclipse.persistence.internal.oxm.ConversionManager;
26
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
27
import org.eclipse.persistence.internal.oxm.XPathFragment;
28
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
29
30
public class JsonGeneratorRecord extends JsonRecord {
31
32
    private Level position;    
33
    private JsonGenerator jsonGenerator;
34
          
35
    public JsonGeneratorRecord(JsonGenerator generator){
36
        super();       
37
        this.jsonGenerator = generator;
38
    }
39
      
40
    @Override
41
    public void startDocument(String encoding, String version) {      
42
        if(isRootArray){  
43
            if(position == null){
44
                startCollection();
45
            }                            
46
            position.setEmptyCollection(false); 
47
            Level newLevel = new Level(false, position);
48
            position = newLevel;
49
            isLastEventStart = true;
50
        }else{
51
            Level rootLevel = new Level(false, null);
52
            position = rootLevel;
53
            setComplex(position, true);
54
        }
55
    }
56
57
    @Override
58
    public void endDocument() {        
59
        if(position != null){
60
            jsonGenerator.writeEnd(); 
61
            position = position.parentLevel;
62
        }
63
    }
64
    
65
    private void popAndSetInParentBuilder(){
66
        if(!(position.isCollection && position.isEmptyCollection() && position.getKeyName() == null)){
67
            jsonGenerator.writeEnd(); 
68
        }
69
        position = position.parentLevel;      
70
    }    
71
    
72
    public void startCollection() {
73
        if(position == null){
74
             isRootArray = true;              
75
             Level rootLevel = new Level(true, null); 
76
             position = rootLevel;
77
             jsonGenerator.writeStartArray();
78
        } else {            
79
            if(isLastEventStart){
80
                setComplex(position, true);         
81
            }            
82
            Level level = new Level(true, position);            
83
            position = level;
84
        }      
85
        isLastEventStart = false;
86
    }
87
    
88
    @Override
89
    public void endCollection() {        
90
         popAndSetInParentBuilder();    
91
    }
92
93
    private void setComplex(Level level, boolean complex){
94
        boolean isAlreadyComplex = level.isComplex;
95
        level.setComplex(complex);
96
        if(complex && !isAlreadyComplex){
97
            Level parentLevel = level.parentLevel;
98
            if((parentLevel != null && parentLevel.isCollection && !parentLevel.isEmptyCollection()) || level.keyName == null){
99
                jsonGenerator.writeStartObject();                    
100
            }else{
101
                jsonGenerator.writeStartObject(level.keyName);
102
            }
103
        }
104
    }
105
    
106
    @Override    
107
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
108
        super.openStartElement(xPathFragment, namespaceResolver);
109
        if(position != null){
110
            Level newLevel = new Level(false, position);            
111
            
112
            if(isLastEventStart){                              
113
                //this means 2 startevents in a row so the last this is a complex object
114
                setComplex(position, true);
115
            }
116
                      
117
            String keyName = getKeyName(xPathFragment);
118
           
119
            if(position.isCollection && position.isEmptyCollection() ){
120
                position.setKeyName(keyName);
121
                jsonGenerator.writeStartArray(keyName);
122
                position.setEmptyCollection(false);
123
            }else{
124
                newLevel.setKeyName(keyName);    
125
            }
126
            position = newLevel;   
127
            isLastEventStart = true;
128
        }
129
    }    
130
    
131
    /**
132
     * Handle marshal of an empty collection.  
133
     * @param xPathFragment
134
     * @param namespaceResolver
135
     * @param openGrouping if grouping elements should be marshalled for empty collections
136
     * @return
137
     */    
138
    public boolean emptyCollection(XPathFragment xPathFragment, NamespaceResolver namespaceResolver, boolean openGrouping) {
139
140
         if(marshaller.isMarshalEmptyCollections()){
141
             super.emptyCollection(xPathFragment, namespaceResolver, true);
142
             
143
             if (null != xPathFragment) {
144
                 
145
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
146
                     String keyName = position.getKeyName();
147
                     setComplex(position, false);
148
                     jsonGenerator.writeStartArray(keyName);
149
                     jsonGenerator.writeEnd();
150
                 }else{ 
151
                     if(isLastEventStart){
152
                         setComplex(position, true);
153
                     }                 
154
                     String keyName =  getKeyName(xPathFragment);
155
                     if(keyName != null){
156
                         jsonGenerator.writeStartArray(keyName);
157
                         jsonGenerator.writeEnd();
158
                     }
159
                 }
160
                 isLastEventStart = false;   
161
             }
162
                  
163
             return true;
164
         }else{
165
             return super.emptyCollection(xPathFragment, namespaceResolver, openGrouping);
166
         }
167
    } 
168
    @Override
169
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
170
        if(position != null){
171
            if(isLastEventStart){
172
                setComplex(position, true);
173
            }
174
            if(position.isComplex){
175
                popAndSetInParentBuilder();
176
            }else{
177
                position = position.parentLevel;
178
            }            
179
            isLastEventStart = false;          
180
        }
181
    }
182
    
183
    public void writeValue(Object value, QName schemaType, boolean isAttribute) {
184
        
185
        if (characterEscapeHandler != null && value instanceof String) {
186
            try {
187
                StringWriter stringWriter = new StringWriter();
188
                characterEscapeHandler.escape(((String)value).toCharArray(), 0, ((String)value).length(), isAttribute, stringWriter);
189
                value = stringWriter.toString();
190
            } catch (IOException e) {
191
                throw XMLMarshalException.marshalException(e);
192
            }
193
        }
194
        
195
        boolean textWrapperOpened = false;                       
196
        if(!isLastEventStart){
197
             openStartElement(textWrapperFragment, namespaceResolver);
198
             textWrapperOpened = true;
199
        }
200
      
201
        Level currentLevel = position;
202
        String keyName = position.getKeyName();
203
        if(!position.isComplex){           
204
            currentLevel = position.parentLevel;         
205
        }
206
        addValue(currentLevel, keyName, value, schemaType);
207
        isLastEventStart = false;
208
        if(textWrapperOpened){    
209
             endElement(textWrapperFragment, namespaceResolver);
210
        }    
211
    }
212
    private void addValue(Level currentLevel, String keyName, Object value, QName schemaType){        
213
        if(currentLevel.isCollection()){
214
            currentLevel.setEmptyCollection(false);
215
            addValueToArray(value, schemaType);            
216
        } else {
217
            addValueToObject(keyName, value, schemaType);
218
            
219
        }
220
    }
221
    
222
    private void addValueToObject(String keyName, Object value, QName schemaType){
223
        
224
        if(value == NULL){
225
            jsonGenerator.writeNull(keyName);            
226
        }else if(value instanceof Integer){
227
            jsonGenerator.write(keyName, (Integer)value);             
228
        }else if(value instanceof BigDecimal){            
229
            jsonGenerator.write(keyName, (BigDecimal)value);
230
        }else if(value instanceof BigInteger){
231
            jsonGenerator.write(keyName, (BigInteger)value);
232
        }else if(value instanceof Boolean){
233
            jsonGenerator.write(keyName, (Boolean)value);
234
        }else if(value instanceof Character){
235
            jsonGenerator.write(keyName, (Character)value);;  
236
        }else if(value instanceof Double){
237
            jsonGenerator.write(keyName, (Double)value);
238
        }else if(value instanceof Float){
239
            jsonGenerator.write(keyName, (Float)value);
240
        }else if(value instanceof Long){
241
            jsonGenerator.write(keyName, (Long)value);
242
        }else if(value instanceof String){
243
            jsonGenerator.write(keyName, (String)value);
244
        }else{
245
            String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
246
            Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
247
            if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
248
                //if it's still a number and falls through the cracks we dont want "" around the value
249
                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
250
                    jsonGenerator.write(keyName, (BigDecimal)convertedNumberValue);
251
            }else{
252
                jsonGenerator.write(keyName, convertedValue);                
253
            }
254
                
255
        }
256
    }
257
    
258
    private void addValueToArray(Object value, QName schemaType){
259
        if(value == NULL){            
260
            jsonGenerator.writeNull();
261
        }else if(value instanceof Integer){
262
            jsonGenerator.write((Integer)value);             
263
        }else if(value instanceof BigDecimal){
264
            jsonGenerator.write((BigDecimal)value);
265
        }else if(value instanceof BigInteger){
266
            jsonGenerator.write((BigInteger)value);
267
        }else if(value instanceof Boolean){                            
268
            jsonGenerator.write((Boolean)value);
269
        }else if(value instanceof Character){
270
            jsonGenerator.write((Character)value);
271
        }else if(value instanceof Double){
272
            jsonGenerator.write((Double)value);
273
        }else if(value instanceof Float){
274
            jsonGenerator.write((Float)value);
275
        }else if(value instanceof Long){
276
            jsonGenerator.write((Long)value);
277
        }else if(value instanceof String){
278
            jsonGenerator.write((String)value);            
279
        }else{
280
            String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
281
            Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
282
            if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
283
                //if it's still a number and falls through the cracks we dont want "" around the value
284
                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
285
                    jsonGenerator.write((BigDecimal)convertedNumberValue);            
286
287
            }else{
288
                jsonGenerator.write(convertedValue);                
289
            }
290
        }
291
    }            
292
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonRecord.java (+500 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.record;
14
15
import java.util.List;
16
17
import javax.xml.namespace.QName;
18
19
import org.eclipse.persistence.exceptions.XMLMarshalException;
20
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
21
import org.eclipse.persistence.internal.core.helper.CoreConversionManager;
22
import org.eclipse.persistence.internal.oxm.CharacterEscapeHandler;
23
import org.eclipse.persistence.internal.oxm.Constants;
24
import org.eclipse.persistence.internal.oxm.ConversionManager;
25
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
26
import org.eclipse.persistence.internal.oxm.ObjectBuilder;
27
import org.eclipse.persistence.internal.oxm.Root;
28
import org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper;
29
import org.eclipse.persistence.internal.oxm.XMLMarshaller;
30
import org.eclipse.persistence.internal.oxm.XPathFragment;
31
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
32
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
33
import org.eclipse.persistence.internal.oxm.record.ExtendedContentHandler;
34
import org.eclipse.persistence.internal.oxm.record.XMLFragmentReader;
35
import org.w3c.dom.Attr;
36
import org.w3c.dom.Node;
37
import org.xml.sax.Attributes;
38
import org.xml.sax.Locator;
39
import org.xml.sax.SAXException;
40
import org.xml.sax.ext.LexicalHandler;
41
42
public abstract class JsonRecord extends MarshalRecord <XMLMarshaller> {
43
44
    protected CharacterEscapeHandler characterEscapeHandler;
45
    protected String attributePrefix;
46
    protected boolean isRootArray;
47
    protected static final String NULL="null";
48
    protected boolean isLastEventStart;
49
    
50
    /**
51
     * INTERNAL:
52
     */
53
    public void setMarshaller(XMLMarshaller marshaller) {
54
        super.setMarshaller(marshaller);
55
        attributePrefix = marshaller.getAttributePrefix();
56
        if (marshaller.getValueWrapper() != null) {
57
            textWrapperFragment = new XPathFragment();
58
            textWrapperFragment.setLocalName(marshaller.getValueWrapper());
59
        }
60
        characterEscapeHandler = marshaller.getCharacterEscapeHandler();
61
    }
62
       
63
    protected String getKeyName(XPathFragment xPathFragment){
64
        String keyName = xPathFragment.getLocalName(); 
65
       
66
        if(isNamespaceAware()){
67
            if(xPathFragment.getNamespaceURI() != null){
68
                String prefix = null;
69
                if(getNamespaceResolver() !=null){
70
                    prefix = getNamespaceResolver().resolveNamespaceURI(xPathFragment.getNamespaceURI());
71
                } else if(namespaceResolver != null){
72
                    prefix = namespaceResolver.resolveNamespaceURI(xPathFragment.getNamespaceURI());
73
                }
74
                if(prefix != null && !prefix.equals(Constants.EMPTY_STRING)){
75
                    keyName = prefix + getNamespaceSeparator() +  keyName;                           
76
                }
77
            }
78
        } 
79
        if(xPathFragment.isAttribute() && attributePrefix != null){
80
            keyName = attributePrefix + keyName;
81
        }
82
83
        return keyName;
84
    }
85
86
    public void attribute(XPathFragment xPathFragment, NamespaceResolver namespaceResolver,  Object value, QName schemaType){
87
        if(xPathFragment.getNamespaceURI() != null && xPathFragment.getNamespaceURI() == javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI){
88
            return;
89
        }
90
        xPathFragment.setAttribute(true);
91
        openStartElement(xPathFragment, namespaceResolver);
92
        characters(schemaType, value, null, false, true);
93
        endElement(xPathFragment, namespaceResolver);
94
    }
95
    
96
    /**
97
     * INTERNAL:
98
     */
99
    @Override
100
    public void marshalWithoutRootElement(ObjectBuilder treeObjectBuilder, Object object, Descriptor descriptor, Root root, boolean isXMLRoot){
101
        if(treeObjectBuilder != null){
102
            addXsiTypeAndClassIndicatorIfRequired(descriptor, null, descriptor.getDefaultRootElementField(), root, object, isXMLRoot, true);
103
            treeObjectBuilder.marshalAttributes(this, object, session);
104
        }         
105
     }
106
    
107
    /**
108
     * INTERNAL:
109
     * The character used to separate the prefix and uri portions when namespaces are present 
110
     * @since 2.4
111
     */
112
    public char getNamespaceSeparator(){        
113
        return marshaller.getNamespaceSeparator();
114
    }
115
    
116
    /**
117
     * INTERNAL:
118
     * The optional fragment used to wrap the text() mappings
119
     * @since 2.4
120
     */
121
    public XPathFragment getTextWrapperFragment() {
122
        return textWrapperFragment;
123
    }
124
    
125
    @Override
126
    public boolean isWrapperAsCollectionName() {
127
        return marshaller.isWrapperAsCollectionName();
128
    }
129
    
130
    @Override
131
    public void element(XPathFragment frag) {
132
        isLastEventStart = false;
133
    }
134
    
135
   
136
    @Override
137
    public void attribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver, String value) {
138
        attribute(xPathFragment, namespaceResolver, value, null);
139
    }
140
141
    @Override
142
    public void attribute(String namespaceURI, String localName, String qName, String value) {
143
        XPathFragment xPathFragment = new XPathFragment();
144
        xPathFragment.setNamespaceURI(namespaceURI);
145
        xPathFragment.setAttribute(true);
146
        xPathFragment.setLocalName(localName);
147
148
        openStartElement(xPathFragment, namespaceResolver);
149
        characters(null, value, null, false, true);
150
151
        endElement(xPathFragment, namespaceResolver);
152
        
153
    }
154
155
    @Override
156
    public void closeStartElement() {}   
157
    
158
    @Override
159
    public void characters(String value) {
160
        writeValue(value, null, false);
161
    }
162
163
    @Override
164
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA){          
165
        characters(schemaType, value, mimeType, isCDATA, false);
166
     }
167
    
168
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA, boolean isAttribute){
169
        if(mimeType != null) {
170
            if(value instanceof List){
171
               value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesListForBinaryValues((List)value, marshaller, mimeType);
172
           }else{
173
174
            value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesForBinaryValue(value, marshaller, mimeType).getData();
175
           }
176
        }         
177
        if(schemaType != null && Constants.QNAME_QNAME.equals(schemaType)){
178
            String convertedValue = getStringForQName((QName)value);
179
            writeValue(convertedValue, null, isAttribute);
180
        } 
181
        else if(value.getClass() == String.class){          
182
            //if schemaType is set and it's a numeric or boolean type don't treat as a string
183
            if(schemaType != null && isNumericOrBooleanType(schemaType)){
184
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);
185
                Object convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, theClass, schemaType);
186
                writeValue(convertedValue, schemaType, isAttribute);
187
            }else if(isCDATA){
188
                cdata((String)value);
189
            }else{
190
                writeValue((String)value, null, isAttribute);                
191
            }
192
       }else{
193
           Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
194
195
           if(schemaType == null || theClass == null){
196
               if(value.getClass() == CoreClassConstants.BOOLEAN || CoreClassConstants.NUMBER.isAssignableFrom(value.getClass())){
197
                   writeValue(value, schemaType, isAttribute);
198
               }else{
199
                   String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
200
                   writeValue(convertedValue, schemaType, isAttribute);
201
               }
202
           }else if(schemaType != null && !isNumericOrBooleanType(schemaType)){
203
               //if schemaType exists and is not boolean or number do write quotes (convert to string)
204
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
205
               writeValue(convertedValue, schemaType, isAttribute);
206
           } else if(isCDATA){
207
               String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
208
               cdata(convertedValue);
209
           }else{
210
               writeValue(value, schemaType, isAttribute);           
211
           }
212
       }        
213
    }
214
    
215
    
216
    private boolean isNumericOrBooleanType(QName schemaType){
217
        if(schemaType == null){
218
            return false;
219
        }else if(schemaType.equals(Constants.BOOLEAN_QNAME)
220
                || schemaType.equals(Constants.INTEGER_QNAME)
221
                || schemaType.equals(Constants.INT_QNAME)
222
                || schemaType.equals(Constants.BYTE_QNAME)
223
                || schemaType.equals(Constants.DECIMAL_QNAME)
224
                || schemaType.equals(Constants.FLOAT_QNAME)
225
                || schemaType.equals(Constants.DOUBLE_QNAME)
226
                || schemaType.equals(Constants.SHORT_QNAME)
227
                || schemaType.equals(Constants.LONG_QNAME)
228
                || schemaType.equals(Constants.NEGATIVE_INTEGER_QNAME)
229
                || schemaType.equals(Constants.NON_NEGATIVE_INTEGER_QNAME)
230
                || schemaType.equals(Constants.NON_POSITIVE_INTEGER_QNAME)
231
                || schemaType.equals(Constants.POSITIVE_INTEGER_QNAME)
232
                || schemaType.equals(Constants.UNSIGNED_BYTE_QNAME)
233
                || schemaType.equals(Constants.UNSIGNED_INT_QNAME)
234
                || schemaType.equals(Constants.UNSIGNED_LONG_QNAME)
235
                || schemaType.equals(Constants.UNSIGNED_SHORT_QNAME)
236
        ){
237
            return true;
238
        }
239
        return false;
240
    }        
241
    
242
    public abstract void writeValue(Object value, QName schemaType, boolean isAttribute);
243
244
    @Override
245
    public void cdata(String value) {
246
        characters(value);        
247
    }
248
249
    @Override
250
    public void node(Node node, NamespaceResolver resolver, String uri, String name) {
251
       
252
        if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
253
            Attr attr = (Attr) node;
254
            String resolverPfx = null;
255
            if (getNamespaceResolver() != null) {
256
                resolverPfx = this.getNamespaceResolver().resolveNamespaceURI(attr.getNamespaceURI());
257
            }
258
            String namespaceURI = attr.getNamespaceURI();
259
            // If the namespace resolver contains a prefix for the attribute's URI,
260
            // use it instead of what is set on the attribute
261
            if (resolverPfx != null) {
262
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, resolverPfx+Constants.COLON+attr.getLocalName(), attr.getNodeValue());
263
            } else {
264
                attribute(attr.getNamespaceURI(), Constants.EMPTY_STRING, attr.getName(), attr.getNodeValue());
265
                // May need to declare the URI locally
266
                if (attr.getNamespaceURI() != null) {
267
                    attribute(javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI, Constants.EMPTY_STRING, javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON + attr.getPrefix(), attr.getNamespaceURI());
268
                    this.getNamespaceResolver().put(attr.getPrefix(), attr.getNamespaceURI());
269
                }
270
            }
271
        } else if (node.getNodeType() == Node.TEXT_NODE) {
272
            writeValue(node.getNodeValue(), null, false);
273
        } else {
274
            try {
275
                JsonRecordContentHandler wrcHandler = new JsonRecordContentHandler();
276
                
277
                XMLFragmentReader xfragReader = new XMLFragmentReader(namespaceResolver);
278
                xfragReader.setContentHandler(wrcHandler);
279
                xfragReader.setProperty("http://xml.org/sax/properties/lexical-handler", wrcHandler);
280
                xfragReader.parse(node, uri, name);
281
            } catch (SAXException sex) {
282
                throw XMLMarshalException.marshalException(sex);
283
            }
284
        }
285
        
286
    }        
287
    
288
    protected String getStringForQName(QName qName){
289
        if(null == qName) {
290
            return null;
291
        }
292
        CoreConversionManager xmlConversionManager = getSession().getDatasourcePlatform().getConversionManager();
293
294
        return (String) xmlConversionManager.convertObject(qName, String.class);       
295
    }
296
297
    /**
298
     * INTERNAL:
299
     */
300
     public void namespaceDeclarations(NamespaceResolver namespaceResolver) {
301
     }
302
303
     public void namespaceDeclaration(String prefix, String namespaceURI){
304
     }
305
     
306
     public void defaultNamespaceDeclaration(String defaultNamespace){
307
     }
308
     
309
    /**
310
     * INTERNAL:
311
     */
312
     public void nilComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
313
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
314
         closeStartGroupingElements(groupingFragment);
315
         openStartElement(xPathFragment, namespaceResolver);
316
         characters(NULL);
317
         endElement(xPathFragment, namespaceResolver);
318
     }
319
320
    /**
321
     * INTERNAL:
322
     */
323
     public void nilSimple(NamespaceResolver namespaceResolver){
324
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);         
325
         characters(NULL);        
326
         closeStartGroupingElements(groupingFragment);
327
     }
328
329
     /**
330
      * Used when an empty simple value should be written
331
      * @since EclipseLink 2.4
332
      */
333
     public void emptySimple(NamespaceResolver namespaceResolver){
334
         nilSimple(namespaceResolver);
335
     }
336
     
337
     public void emptyAttribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver){
338
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
339
         openStartElement(xPathFragment, namespaceResolver);
340
         characters(NULL);
341
         endElement(xPathFragment, namespaceResolver);
342
         closeStartGroupingElements(groupingFragment);
343
     }
344
345
     /**
346
      * Used when an empty complex item should be written
347
      * @since EclipseLink 2.4
348
      */
349
     public void emptyComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
350
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
351
         closeStartGroupingElements(groupingFragment);
352
         openStartElement(xPathFragment, namespaceResolver);
353
         endElement(xPathFragment, namespaceResolver);
354
     }
355
    
356
    
357
     
358
     /**
359
      * This class will typically be used in conjunction with an XMLFragmentReader.
360
      * The XMLFragmentReader will walk a given XMLFragment node and report events
361
      * to this class - the event's data is then written to the enclosing class'
362
      * writer.
363
      *
364
      * @see org.eclipse.persistence.internal.oxm.record.XMLFragmentReader
365
      */
366
     protected class JsonRecordContentHandler implements ExtendedContentHandler, LexicalHandler {
367
368
         JsonRecordContentHandler() {
369
         }
370
371
         // --------------------- CONTENTHANDLER METHODS --------------------- //
372
         public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
373
                 XPathFragment xPathFragment = new XPathFragment(localName);
374
                 xPathFragment.setNamespaceURI(namespaceURI);
375
                 openStartElement(xPathFragment, namespaceResolver);
376
                 handleAttributes(atts);
377
         }
378
379
         public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
380
             XPathFragment xPathFragment = new XPathFragment(localName);
381
             xPathFragment.setNamespaceURI(namespaceURI);
382
             
383
             JsonRecord.this.endElement(xPathFragment, namespaceResolver);        
384
         }
385
386
         public void startPrefixMapping(String prefix, String uri) throws SAXException {
387
         }
388
389
         public void characters(char[] ch, int start, int length) throws SAXException {
390
             String characters = new String (ch, start, length);
391
             characters(characters);
392
         }
393
394
         public void characters(CharSequence characters) throws SAXException {           
395
             JsonRecord.this.characters(characters.toString());      
396
         }
397
398
         // --------------------- LEXICALHANDLER METHODS --------------------- //
399
         public void comment(char[] ch, int start, int length) throws SAXException {
400
         }
401
402
         public void startCDATA() throws SAXException {
403
         }
404
405
         public void endCDATA() throws SAXException {
406
         }
407
408
         // --------------------- CONVENIENCE METHODS --------------------- //
409
            protected void handleAttributes(Attributes atts) {
410
             for (int i=0, attsLength = atts.getLength(); i<attsLength; i++) {
411
                 String qName = atts.getQName(i);
412
                 if((qName != null && (qName.startsWith(javax.xml.XMLConstants.XMLNS_ATTRIBUTE + Constants.COLON) || qName.equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)))) {
413
                     continue;
414
                 }
415
                 attribute(atts.getURI(i), atts.getLocalName(i), qName, atts.getValue(i));
416
             }
417
         }
418
419
         protected void writeComment(char[] chars, int start, int length) {        
420
         }
421
        
422
         protected void writeCharacters(char[] chars, int start, int length) {
423
             try {
424
                 characters(chars, start, length);
425
             } catch (SAXException e) {
426
                 throw XMLMarshalException.marshalException(e);
427
             }           
428
         }
429
         // --------------- SATISFY CONTENTHANDLER INTERFACE --------------- //
430
         public void endPrefixMapping(String prefix) throws SAXException {}
431
         public void processingInstruction(String target, String data) throws SAXException {}
432
         public void setDocumentLocator(Locator locator) {}
433
         public void startDocument() throws SAXException {}
434
         public void endDocument() throws SAXException {}
435
         public void skippedEntity(String name) throws SAXException {}
436
         public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {}
437
438
         // --------------- SATISFY LEXICALHANDLER INTERFACE --------------- //
439
         public void startEntity(String name) throws SAXException {}
440
         public void endEntity(String name) throws SAXException {}
441
         public void startDTD(String name, String publicId, String systemId) throws SAXException {}
442
         public void endDTD() throws SAXException {}
443
         @Override
444
         public void setNil(boolean isNil) {}
445
446
     }
447
448
     
449
     /**
450
     * Instances of this class are used to maintain state about the current
451
     * level of the JSON message being marshalled.
452
     */
453
    protected static class Level {
454
        
455
        protected boolean isCollection;
456
        protected boolean emptyCollection;
457
        protected String keyName;        
458
        protected boolean isComplex;
459
        protected Level parentLevel;
460
        
461
        public Level(boolean isCollection, Level parentLevel) {
462
            setCollection(isCollection);
463
            emptyCollection = true;
464
            this.parentLevel = parentLevel;
465
        }
466
467
        public boolean isCollection() {
468
            return isCollection;
469
        }
470
471
        public void setCollection(boolean isCollection) {
472
            this.isCollection = isCollection;           
473
        }
474
475
        public String getKeyName() {
476
            return keyName;
477
        }
478
479
        public void setKeyName(String keyName) {
480
            this.keyName = keyName;
481
        }      
482
483
        public boolean isEmptyCollection() {
484
            return emptyCollection;
485
        }
486
487
        public void setEmptyCollection(boolean emptyCollection) {
488
            this.emptyCollection = emptyCollection;
489
        }
490
        public boolean isComplex() {
491
            return isComplex;
492
        }
493
494
        public void setComplex(boolean isComplex) {
495
            this.isComplex = isComplex;           
496
        }
497
498
    }
499
500
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/JAXBWithJSONTestCases.java (-1 / +22 lines)
Lines 28-33 import javax.json.JsonObjectBuilder; Link Here
28
import javax.json.JsonReader;
28
import javax.json.JsonReader;
29
import javax.json.JsonStructure;
29
import javax.json.JsonStructure;
30
import javax.json.JsonWriter;
30
import javax.json.JsonWriter;
31
import javax.json.stream.JsonGenerator;
31
import javax.json.stream.JsonParser;
32
import javax.json.stream.JsonParser;
32
import javax.xml.bind.JAXBElement;
33
import javax.xml.bind.JAXBElement;
33
import javax.xml.bind.Marshaller;
34
import javax.xml.bind.Marshaller;
Lines 41-46 import org.eclipse.persistence.jaxb.JAXBContext; Link Here
41
import org.eclipse.persistence.jaxb.MarshallerProperties;
42
import org.eclipse.persistence.jaxb.MarshallerProperties;
42
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
43
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
43
import org.eclipse.persistence.oxm.MediaType;
44
import org.eclipse.persistence.oxm.MediaType;
45
import org.eclipse.persistence.oxm.json.JsonGeneratorResult;
44
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
46
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
45
import org.eclipse.persistence.oxm.json.JsonStructureSource;
47
import org.eclipse.persistence.oxm.json.JsonStructureSource;
46
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
48
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
Lines 314-319 public abstract class JAXBWithJSONTestCases extends JAXBTestCases { Link Here
314
        log(sw.toString());
316
        log(sw.toString());
315
        compareStringToControlFile("testJSONMarshalToStringWriter_FORMATTED", sw.toString(), getWriteControlJSONFormatted(),shouldRemoveWhitespaceFromControlDocJSON());
317
        compareStringToControlFile("testJSONMarshalToStringWriter_FORMATTED", sw.toString(), getWriteControlJSONFormatted(),shouldRemoveWhitespaceFromControlDocJSON());
316
    }
318
    }
319
    
317
    public void testJSONMarshalToBuilderResult() throws Exception{
320
    public void testJSONMarshalToBuilderResult() throws Exception{
318
        getJSONMarshaller().setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
321
        getJSONMarshaller().setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
319
322
Lines 333-341 public abstract class JAXBWithJSONTestCases extends JAXBTestCases { Link Here
333
        writer.close();
336
        writer.close();
334
        
337
        
335
        log(sw.toString());
338
        log(sw.toString());
336
        compareStringToControlFile("**testJSONMarshalToStringWriter**", sw.toString());
339
        compareStringToControlFile("**testJSONMarshalToBuilderResult**", sw.toString());
337
    }
340
    }
338
341
342
    public void testJSONMarshalToGeneratorResult() throws Exception{
343
        getJSONMarshaller().setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
344
345
        StringWriter sw = new StringWriter();
346
        JsonGenerator generator= Json.createGenerator(sw);
347
        JsonGeneratorResult result = new JsonGeneratorResult(generator);
348
        try{
349
            getJSONMarshaller().marshal(getWriteControlObject(), result);
350
        } catch(Exception e) {
351
            assertMarshalException(e);
352
            return;
353
        }
354
        generator.flush();
355
        log(sw.toString());
356
        compareStringToControlFile("**testJSONMarshalToGeneratorResult**", sw.toString());
357
    }
358
359
    
339
    protected void compareStringToControlFile(String test, String testString) {
360
    protected void compareStringToControlFile(String test, String testString) {
340
    	compareStringToControlFile(test, testString, getWriteControlJSON());
361
    	compareStringToControlFile(test, testString, getWriteControlJSON());
341
    }
362
    }
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/choicecollection/ChoiceCollectionMappingTestCases.java (-1 / +3 lines)
Lines 148-152 public class ChoiceCollectionMappingTestCases extends JAXBWithJSONTestCases { Link Here
148
    public void testJSONMarshalToBuilderResult() throws Exception{
148
    public void testJSONMarshalToBuilderResult() throws Exception{
149
        //Currently not supported, 101.1 will get written as 101.0999984741211 
149
        //Currently not supported, 101.1 will get written as 101.0999984741211 
150
    }
150
    }
151
   
151
    public void testJSONMarshalToGeneratorResult() throws Exception{        
152
        //Currently not supported, 101.1 will get written as 101.0999984741211 
153
    }
152
}
154
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/JSONTestCases.java (+14 lines)
Lines 28-33 import javax.json.JsonObject; Link Here
28
import javax.json.JsonObjectBuilder;
28
import javax.json.JsonObjectBuilder;
29
import javax.json.JsonWriter;
29
import javax.json.JsonWriter;
30
import javax.json.JsonWriterFactory;
30
import javax.json.JsonWriterFactory;
31
import javax.json.stream.JsonGenerator;
31
import javax.xml.bind.JAXBContext;
32
import javax.xml.bind.JAXBContext;
32
import javax.xml.bind.JAXBElement;
33
import javax.xml.bind.JAXBElement;
33
import javax.xml.bind.Marshaller;
34
import javax.xml.bind.Marshaller;
Lines 38-43 import org.eclipse.persistence.jaxb.MarshallerProperties; Link Here
38
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
39
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
39
import org.eclipse.persistence.oxm.XMLContext;
40
import org.eclipse.persistence.oxm.XMLContext;
40
import org.eclipse.persistence.oxm.json.JsonArrayBuilderResult;
41
import org.eclipse.persistence.oxm.json.JsonArrayBuilderResult;
42
import org.eclipse.persistence.oxm.json.JsonGeneratorResult;
41
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
43
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
42
import org.eclipse.persistence.testing.oxm.OXTestCase;
44
import org.eclipse.persistence.testing.oxm.OXTestCase;
43
45
Lines 225-230 public abstract class JSONTestCases extends OXTestCase{ Link Here
225
           log(sw.toString());
227
           log(sw.toString());
226
           compareStringToControlFile("**testJSONMarshalToBuilderResult**", sw.toString());
228
           compareStringToControlFile("**testJSONMarshalToBuilderResult**", sw.toString());
227
       }
229
       }
230
    
231
    public void testJSONMarshalToGeneratorResult() throws Exception{
232
        
233
        StringWriter sw = new StringWriter();
234
        JsonGenerator jsonGenerator = Json.createGenerator(sw);
235
        JsonGeneratorResult result = new JsonGeneratorResult(jsonGenerator);
236
        jsonMarshaller.marshal(getWriteControlObject(), result);
237
        jsonGenerator.flush();
238
        
239
        log(sw.toString());
240
        compareStringToControlFile("**testJSONMarshalToBuilderResult**", sw.toString());
241
    }
228
	   
242
	   
229
	 public void testJSONMarshalToOutputStream_FORMATTED() throws Exception{
243
	 public void testJSONMarshalToOutputStream_FORMATTED() throws Exception{
230
	    jsonMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
244
	    jsonMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/characters/UsAsciiTestCases.java (-1 / +5 lines)
Lines 52-59 public class UsAsciiTestCases extends JSONMarshalUnmarshalTestCases { Link Here
52
        return control;
52
        return control;
53
    }
53
    }
54
    
54
    
55
    public void marshalToObjectBuilderResult() throws Exception{
55
    public void testJSONMarshalToBuilderResult() throws Exception{
56
        //Currently not supported
56
        //Currently not supported
57
    }
57
    }
58
58
59
    public void testJSONMarshalToGeneratorResult() throws Exception{
60
        //Currently not supported
61
62
    }
59
}
63
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JAXBElementJSONPaddingTestCases.java (+2 lines)
Lines 49-52 public class JAXBElementJSONPaddingTestCases extends JAXBWithJSONTestCases{ Link Here
49
	public void testJSONMarshalToBuilderResult() throws Exception{     
49
	public void testJSONMarshalToBuilderResult() throws Exception{     
50
    }
50
    }
51
    
51
    
52
    public void testJSONMarshalToGeneratorResult() throws Exception{
53
    }
52
}
54
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JAXBElementListJSONPaddingTestCases.java (+3 lines)
Lines 60-63 public class JAXBElementListJSONPaddingTestCases extends JSONTestCases{ Link Here
60
	
60
	
61
	public void testJSONMarshalToBuilderResult() throws Exception{     
61
	public void testJSONMarshalToBuilderResult() throws Exception{     
62
    }
62
    }
63
	
64
	public void testJSONMarshalToGeneratorResult() throws Exception{     
65
    }
63
}
66
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithNullNameTestCases.java (+3 lines)
Lines 45-49 public class JSONWithNullNameTestCases extends JAXBWithJSONTestCases{ Link Here
45
	
45
	
46
	public void testJSONMarshalToBuilderResult() throws Exception{     
46
	public void testJSONMarshalToBuilderResult() throws Exception{     
47
    }
47
    }
48
	
49
	public void testJSONMarshalToGeneratorResult() throws Exception{     
50
    }
48
    
51
    
49
}
52
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithNullObjectTestCases.java (+3 lines)
Lines 49-54 public class JSONWithNullObjectTestCases extends JAXBWithJSONTestCases{ Link Here
49
	public void testJSONMarshalToBuilderResult() throws Exception{     
49
	public void testJSONMarshalToBuilderResult() throws Exception{     
50
    }
50
    }
51
	
51
	
52
	public void testJSONMarshalToGeneratorResult() throws Exception{     
53
    }
54
	
52
    @Override
55
    @Override
53
    public void assertMarshalException(Exception exception) throws Exception {
56
    public void assertMarshalException(Exception exception) throws Exception {
54
        Exception nestedException = (Exception) exception.getCause();
57
        Exception nestedException = (Exception) exception.getCause();
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithPaddingSimpleListTestCases.java (+3 lines)
Lines 58-63 public class JSONWithPaddingSimpleListTestCases extends JSONTestCases{ Link Here
58
	public void testJSONMarshalToBuilderResult() throws Exception{     
58
	public void testJSONMarshalToBuilderResult() throws Exception{     
59
    }
59
    }
60
	
60
	
61
	public void testJSONMarshalToGeneratorResult() throws Exception{     
62
    }
63
	
61
//	public boolean shouldRemoveWhitespaceFromControlDocJSON(){
64
//	public boolean shouldRemoveWhitespaceFromControlDocJSON(){
62
	//	return false;
65
	//	return false;
63
	//}
66
	//}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithPaddingSimpleTestCases.java (+3 lines)
Lines 51-55 public class JSONWithPaddingSimpleTestCases extends JAXBWithJSONTestCases{ Link Here
51
	
51
	
52
	public void testJSONMarshalToBuilderResult() throws Exception{     
52
	public void testJSONMarshalToBuilderResult() throws Exception{     
53
    }
53
    }
54
	
55
	public void testJSONMarshalToGeneratorResult() throws Exception{     
56
    }	
54
    
57
    
55
}
58
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/padding/JSONWithUnsetNameTestCases.java (+2 lines)
Lines 46-49 public class JSONWithUnsetNameTestCases extends JAXBWithJSONTestCases{ Link Here
46
	public void testJSONMarshalToBuilderResult() throws Exception{     
46
	public void testJSONMarshalToBuilderResult() throws Exception{     
47
    }
47
    }
48
    
48
    
49
	public void testJSONMarshalToGeneratorResult() throws Exception{     
50
    }
49
}
51
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/json/rootlevellist/JsonObjectInArrayBuilderTestCases.java (+31 lines)
Lines 13-23 Link Here
13
package org.eclipse.persistence.testing.jaxb.json.rootlevellist;
13
package org.eclipse.persistence.testing.jaxb.json.rootlevellist;
14
14
15
import java.io.StringWriter;
15
import java.io.StringWriter;
16
import java.util.ArrayList;
17
import java.util.List;
16
18
17
import javax.json.Json;
19
import javax.json.Json;
18
import javax.json.JsonArray;
20
import javax.json.JsonArray;
19
import javax.json.JsonArrayBuilder;
21
import javax.json.JsonArrayBuilder;
20
import javax.json.JsonWriter;
22
import javax.json.JsonWriter;
23
import javax.json.stream.JsonGenerator;
21
import javax.xml.bind.JAXBContext;
24
import javax.xml.bind.JAXBContext;
22
import javax.xml.bind.Marshaller;
25
import javax.xml.bind.Marshaller;
23
26
Lines 26-31 import org.eclipse.persistence.jaxb.JAXBMarshaller; Link Here
26
import org.eclipse.persistence.jaxb.MarshallerProperties;
29
import org.eclipse.persistence.jaxb.MarshallerProperties;
27
import org.eclipse.persistence.oxm.MediaType;
30
import org.eclipse.persistence.oxm.MediaType;
28
import org.eclipse.persistence.oxm.json.JsonArrayBuilderResult;
31
import org.eclipse.persistence.oxm.json.JsonArrayBuilderResult;
32
import org.eclipse.persistence.oxm.json.JsonGeneratorResult;
29
import org.eclipse.persistence.testing.oxm.OXTestCase;
33
import org.eclipse.persistence.testing.oxm.OXTestCase;
30
34
31
public class JsonObjectInArrayBuilderTestCases extends OXTestCase {
35
public class JsonObjectInArrayBuilderTestCases extends OXTestCase {
Lines 64-69 public class JsonObjectInArrayBuilderTestCases extends OXTestCase { Link Here
64
        String controlString = "[{\"name\":\"FOO\"},{\"name\":\"FOO2\"}]";
68
        String controlString = "[{\"name\":\"FOO\"},{\"name\":\"FOO2\"}]";
65
        assertEquals(controlString, sw.toString());        
69
        assertEquals(controlString, sw.toString());        
66
    }
70
    }
71
72
    public void testMarshalToGeneratorResult() throws Exception{
73
        JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{WithoutXmlRootElementRoot.class}, null);
74
        Marshaller jsonMarshaller = ctx.createMarshaller();
75
        jsonMarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
76
        jsonMarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
77
        
78
        StringWriter sw = new StringWriter();
79
        JsonGenerator jsonGenerator = Json.createGenerator(sw);
80
        JsonGeneratorResult result = new JsonGeneratorResult(jsonGenerator);    
81
        
82
        WithoutXmlRootElementRoot foo = new WithoutXmlRootElementRoot();
83
        foo.setName("FOO");
84
        
85
        WithoutXmlRootElementRoot foo2 = new WithoutXmlRootElementRoot();
86
        foo2.setName("FOO2");
87
        
88
        List<WithoutXmlRootElementRoot> things = new ArrayList<WithoutXmlRootElementRoot>();
89
        things.add(foo);
90
        things.add(foo2);
91
        jsonMarshaller.marshal(things, result);
92
        jsonGenerator.flush();
93
        
94
        log(sw.toString());
95
        String controlString = "[{\"name\":\"FOO\"},{\"name\":\"FOO2\"}]";
96
        assertEquals(controlString, sw.toString());        
97
    }
67
    
98
    
68
    public void testMarshalToArrayBuilderResultWithRoot() throws Exception{
99
    public void testMarshalToArrayBuilderResultWithRoot() throws Exception{
69
        JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{WithXmlRootElementRoot.class}, null);
100
        JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{WithXmlRootElementRoot.class}, null);
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/xmlvariablenode/XmlVariableNodeNullValueTestCases.java (-162 / +7 lines)
Lines 63-229 public class XmlVariableNodeNullValueTestCases extends JAXBWithJSONTestCases{ Link Here
63
		return r;
63
		return r;
64
	}
64
	}
65
65
66
	public void objectToXMLStringWriter(Object objectToWrite) throws Exception {
66
	public void assertMarshalException(Exception exception) throws Exception {
67
		try{
67
	    Throwable nested = exception.getCause();// getLinkedException();
68
     		super.objectToXMLStringWriter(objectToWrite);
68
        assertTrue(nested instanceof XMLMarshalException);
69
		}catch(JAXBException e){
69
        if(((XMLMarshalException)nested).getErrorCode() == XMLMarshalException.NULL_VALUE_NOT_ALLOWED_FOR_VARIABLE){
70
			Throwable nested = e.getLinkedException();
70
            return;
71
			assertTrue(nested instanceof XMLMarshalException);
71
        }    
72
			assertEquals(XMLMarshalException.NULL_VALUE_NOT_ALLOWED_FOR_VARIABLE,((XMLMarshalException)nested).getErrorCode());
72
        fail("Expected exception did not occur.");
73
			return;
74
		}
75
		fail("An XMLMarshalException should have occurred");
76
	}
77
	
78
    public void testJSONMarshalToOutputStream() throws Exception{
79
    	try{
80
     		super.testJSONMarshalToOutputStream();
81
		}catch(JAXBException e){
82
			if(verifyException(e)){
83
		    	return;
84
		    }
85
		}
86
		fail("An XMLMarshalException should have occurred");
87
    }
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
    
100
    public void testJSONMarshalToStringWriter_FORMATTED() throws Exception{
101
    	try{
102
     		super.testJSONMarshalToStringWriter_FORMATTED();
103
		}catch(JAXBException e){
104
			if(verifyException(e)){
105
		    	return;
106
		    }
107
		}
108
		fail("An XMLMarshalException should have occurred");
109
    }
110
    
111
    public void testJSONMarshalToOutputStream_FORMATTED() throws Exception{
112
    	try{
113
     		super.testJSONMarshalToOutputStream_FORMATTED();
114
		}catch(JAXBException e){
115
			if(verifyException(e)){
116
		    	return;
117
		    }
118
		}
119
		fail("An XMLMarshalException should have occurred");
120
    }
121
    
122
    public void testJSONMarshalToStringWriter() throws Exception{
123
    	try{
124
     		super.testJSONMarshalToStringWriter();
125
		}catch(JAXBException e){
126
			if(verifyException(e)){
127
		    	return;
128
		    }
129
		}
130
		fail("An XMLMarshalException should have occurred");
131
    }
132
    
133
    public void testObjectToOutputStream() throws Exception {
134
    	try{
135
     		super.testObjectToOutputStream();
136
		}catch(JAXBException e){
137
			if(verifyException(e)){
138
		    	return;
139
		    }
140
		}
141
		fail("An XMLMarshalException should have occurred");
142
    }
143
    
144
    private boolean verifyException(JAXBException e){
145
    	Throwable nested = e.getLinkedException();
146
		assertTrue(nested instanceof XMLMarshalException);
147
		if(((XMLMarshalException)nested).getErrorCode() == XMLMarshalException.NULL_VALUE_NOT_ALLOWED_FOR_VARIABLE){
148
			return true;
149
		}
150
		if(((XMLMarshalException)nested).getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION){
151
			Throwable internalException = ((XMLMarshalException)nested).getInternalException(); 
152
			assertTrue(internalException instanceof XMLMarshalException);
153
			if(((XMLMarshalException)internalException).getErrorCode() == XMLMarshalException.NULL_VALUE_NOT_ALLOWED_FOR_VARIABLE){
154
				return true;
155
			}
156
		}
157
		return false;
158
    }
159
    public void testObjectToOutputStreamASCIIEncoding() throws Exception {
160
    	try{
161
     		super.testObjectToOutputStreamASCIIEncoding();
162
		}catch(JAXBException e){			
163
		    if(verifyException(e)){
164
		    	return;
165
		    }
166
		}
167
		fail("An XMLMarshalException should have occurred");
168
   
169
    }
170
    
171
    public void testObjectToXMLDocument() throws Exception {
172
    	try{
173
     		super.testObjectToXMLDocument();
174
		}catch(JAXBException e){
175
			if(verifyException(e)){
176
		    	return;
177
		    }
178
		}
179
		fail("An XMLMarshalException should have occurred");
180
   
181
    }
182
183
    public void testObjectToXMLStreamWriter() throws Exception {
184
    	try{
185
     		super.testObjectToXMLStreamWriter();
186
		}catch(JAXBException e){
187
			if(verifyException(e)){
188
		    	return;
189
		    }
190
		}
191
		fail("An XMLMarshalException should have occurred");
192
   
193
    }
194
    
195
    public void testObjectToXMLStreamWriterRecord() throws Exception {
196
    	try{
197
     		super.testObjectToXMLStreamWriterRecord();
198
		}catch(JAXBException e){
199
			if(verifyException(e)){
200
		    	return;
201
		    }
202
		}
203
		fail("An XMLMarshalException should have occurred");
204
   
205
    }
206
    
207
    public void testObjectToXMLEventWriter() throws Exception {
208
    	try{
209
     		super.testObjectToXMLEventWriter();
210
		}catch(JAXBException e){
211
			if(verifyException(e)){
212
		    	return;
213
		    }
214
		}
215
		fail("An XMLMarshalException should have occurred");
216
   
217
    }
73
    }
218
    public void testObjectToContentHandler() throws Exception {
219
    	try{
220
     		super.testObjectToContentHandler();
221
		}catch(JAXBException e){
222
			if(verifyException(e)){
223
		    	return;
224
		    }
225
		}
226
		fail("An XMLMarshalException should have occurred");
227
   
228
    }    
229
}
74
}

Return to bug 411382