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

Collapse All | Expand All

(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/XMLMarshaller.java (-1 / +4 lines)
Lines 41-46 import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession; Link Here
41
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
41
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
42
import org.eclipse.persistence.internal.oxm.mappings.Field;
42
import org.eclipse.persistence.internal.oxm.mappings.Field;
43
import org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecord;
43
import org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecord;
44
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
44
import org.eclipse.persistence.internal.oxm.record.namespaces.PrefixMapperNamespaceResolver;
45
import org.eclipse.persistence.internal.oxm.record.namespaces.PrefixMapperNamespaceResolver;
45
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
46
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
46
import org.eclipse.persistence.oxm.JSONWithPadding;
47
import org.eclipse.persistence.oxm.JSONWithPadding;
Lines 1009-1015 public abstract class XMLMarshaller< Link Here
1009
        } else if (result instanceof SAXResult) {
1010
        } else if (result instanceof SAXResult) {
1010
            SAXResult saxResult = (SAXResult) result;
1011
            SAXResult saxResult = (SAXResult) result;
1011
            marshal(object, saxResult.getHandler());
1012
            marshal(object, saxResult.getHandler());
1012
        } else {
1013
        } else if (result instanceof ExtendedResult){           
1014
            marshal(object, ((ExtendedResult)result).createRecord(), session, xmlDescriptor, isXMLRoot);
1015
        }else {
1013
            if (result.getClass().equals(staxResultClass)) {
1016
            if (result.getClass().equals(staxResultClass)) {
1014
                try {
1017
                try {
1015
                    Object xmlStreamWriter = PrivilegedAccessHelper.invokeMethod(staxResultGetStreamWriterMethod, result);
1018
                    Object xmlStreamWriter = PrivilegedAccessHelper.invokeMethod(staxResultGetStreamWriterMethod, result);
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/record/ExtendedResult.java (+32 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
3
 * This program and the accompanying materials are made available under the
4
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
5
 * which accompanies this distribution.
6
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
7
 * and the Eclipse Distribution License is available at
8
 * http://www.eclipse.org/org/documents/edl-v10.php.
9
 *
10
 * Contributors:
11
 *     Denise Smith - 2.6 - initial implementation
12
 ******************************************************************************/
13
package org.eclipse.persistence.internal.oxm.record;
14
15
import javax.xml.transform.Result;
16
17
public abstract class ExtendedResult implements Result {
18
19
    private String systemId;
20
21
    public abstract org.eclipse.persistence.oxm.record.MarshalRecord createRecord();
22
    
23
    @Override
24
    public void setSystemId(String systemId) {
25
        this.systemId = systemId;        
26
    }
27
28
    @Override
29
    public String getSystemId() {
30
        return systemId;
31
    }
32
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/json/JsonArrayBuilderResult.java (+39 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.JsonArrayBuilder;
16
import javax.json.JsonObjectBuilder;
17
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
18
//import org.eclipse.persistence.internal.oxm.record.MarshalRecord;
19
import org.eclipse.persistence.oxm.record.JsonObjectBuilderWriterRecord;
20
21
22
public class JsonArrayBuilderResult extends ExtendedResult{
23
24
    private JsonArrayBuilder jsonArrayBuilder;
25
        
26
    public JsonArrayBuilderResult(JsonArrayBuilder jsonArrayBuilder){
27
        this.jsonArrayBuilder = jsonArrayBuilder;
28
    }
29
30
    @Override
31
    public org.eclipse.persistence.oxm.record.MarshalRecord createRecord() {       
32
         return new JsonObjectBuilderWriterRecord(jsonArrayBuilder);
33
    }
34
35
    public JsonArrayBuilder getJsonArrayBuilder() {
36
        return jsonArrayBuilder;
37
    }
38
39
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/json/JsonObjectBuilderResult.java (+38 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.JsonObjectBuilder;
16
import org.eclipse.persistence.internal.oxm.record.ExtendedResult;
17
//import org.eclipse.persistence.internal.oxm.record.MarshalRecord;
18
import org.eclipse.persistence.oxm.record.JsonObjectBuilderWriterRecord;
19
20
21
public class JsonObjectBuilderResult extends ExtendedResult{
22
23
    private JsonObjectBuilder jsonObjectBuilder;
24
        
25
    public JsonObjectBuilderResult(JsonObjectBuilder jsonObjectBuilder){
26
        this.jsonObjectBuilder = jsonObjectBuilder;
27
    }
28
29
    @Override
30
    public org.eclipse.persistence.oxm.record.MarshalRecord createRecord() {       
31
         return new JsonObjectBuilderWriterRecord(jsonObjectBuilder);
32
    }
33
34
    public JsonObjectBuilder getJsonObjectBuilder() {
35
        return jsonObjectBuilder;
36
    }
37
38
}
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonObjectBuilderWriterRecord.java (+743 lines)
Added Link Here
1
package org.eclipse.persistence.oxm.record;
2
3
import java.io.IOException;
4
import java.math.BigDecimal;
5
import java.math.BigInteger;
6
import java.nio.charset.Charset;
7
import java.util.List;
8
import java.util.Stack;
9
10
import javax.json.Json;
11
import javax.json.JsonArrayBuilder;
12
import javax.json.JsonObjectBuilder;
13
import javax.xml.namespace.QName;
14
15
import org.eclipse.persistence.internal.helper.ClassConstants;
16
import org.eclipse.persistence.internal.oxm.Constants;
17
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
18
import org.eclipse.persistence.internal.oxm.ObjectBuilder;
19
import org.eclipse.persistence.internal.oxm.Root;
20
import org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper;
21
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
22
import org.eclipse.persistence.internal.oxm.XMLMarshaller;
23
import org.eclipse.persistence.internal.oxm.XPathFragment;
24
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
25
import org.eclipse.persistence.oxm.record.JsonObjectBuilderWriterRecord2.Level;
26
import org.w3c.dom.Node;
27
28
29
//TODO characterescapehandler
30
//TODO encoder
31
//TODO is isRootArray needeD
32
//TODO replace NULL string with addNUll
33
34
public class JsonObjectBuilderWriterRecord extends MarshalRecord <XMLMarshaller> {
35
36
    protected Stack<Level> levels = new Stack<Level>();
37
    private JsonObjectBuilder rootJsonObjectBuilder;
38
    private JsonArrayBuilder rootJsonArrayBuilder;
39
    protected String attributePrefix;
40
    protected boolean charactersAllowed = false;
41
    private boolean isRootArray;
42
    protected static final String NULL="null";
43
    private boolean lastEventWasStart;
44
    
45
    public JsonObjectBuilderWriterRecord(){
46
        super();
47
    }
48
    
49
    public JsonObjectBuilderWriterRecord(JsonObjectBuilder jsonObjectBuilder){
50
        this();
51
        this.rootJsonObjectBuilder = jsonObjectBuilder;
52
    }
53
    
54
    public JsonObjectBuilderWriterRecord(JsonArrayBuilder jsonArrayBuilder){
55
        this();
56
        this.rootJsonArrayBuilder = jsonArrayBuilder;
57
    }
58
    
59
    /**
60
     * INTERNAL:
61
     */
62
    public void setMarshaller(XMLMarshaller marshaller) {
63
        super.setMarshaller(marshaller);
64
        attributePrefix = marshaller.getAttributePrefix();
65
       // encoder = Charset.forName(marshaller.getEncoding()).newEncoder();
66
        if (marshaller.getValueWrapper() != null) {
67
            textWrapperFragment = new XPathFragment();
68
            textWrapperFragment.setLocalName(marshaller.getValueWrapper());
69
        }
70
       // characterEscapeHandler = marshaller.getCharacterEscapeHandler();
71
    }
72
    
73
    @Override
74
    public void startDocument(String encoding, String version) {
75
        /*if(!levels.isEmpty()) {
76
            Level level = levels.peek();
77
            if(level.isFirst()) {
78
                level.setFirst(false);
79
            } 
80
        }*/
81
        Level rootLevel = new Level();
82
        if(rootJsonObjectBuilder == null){
83
            rootJsonObjectBuilder = Json.createObjectBuilder();
84
        }
85
        rootLevel.setJsonObjectBuilder(rootJsonObjectBuilder);             
86
        levels.push(rootLevel);
87
        
88
    }
89
90
    @Override
91
    public void endDocument() {
92
        //levels.pop();        
93
    }
94
95
    public void startCollection() {
96
        if(levels.isEmpty()) {           
97
             isRootArray = true;              
98
             Level rootLevel = new Level(true);
99
             if(rootJsonArrayBuilder == null){
100
                  rootJsonArrayBuilder = Json.createArrayBuilder();
101
             }
102
             rootLevel.setJsonArrayBuilder(rootJsonArrayBuilder);
103
             levels.push(rootLevel);                      
104
        } else {
105
            Level level = new Level(true);            
106
            level.setJsonArrayBuilder(Json.createArrayBuilder());
107
            level.setFirstInCollection(true);
108
            levels.push(level);
109
        }
110
        lastEventWasStart = false;
111
        /*else {
112
        //    levels.peek().setCollection(true);
113
          //  levels.peek().setEmptyCollection(true);
114
            
115
            //newLevel.setJsonArrayBuilder(Json.createArrayBuilder());
116
            Level newLevel = new Level(true, false);
117
            newLevel.setCollection(true);
118
            newLevel.setEmptyCollection(true);
119
            newLevel.setJsonArrayBuilder(Json.createArrayBuilder());
120
            levels.push(newLevel);
121
        }*/
122
    }
123
    
124
    @Override
125
    public void endCollection() {
126
       /* if(levels.size() == 1) {
127
            levels.pop();
128
         } else{
129
             
130
         }*/        
131
         Level position = levels.pop();
132
         Level parent = levels.peek();
133
         if(parent.isCollection){
134
             parent.getJsonArrayBuilder().add(position.getJsonArrayBuilder());
135
         }else{
136
             if(parent.getJsonObjectBuilder() == null){
137
                 parent.setJsonObjectBuilder(Json.createObjectBuilder());
138
             }
139
             parent.getJsonObjectBuilder().add(position.keyName, position.getJsonArrayBuilder());
140
         }
141
         lastEventWasStart = false;
142
         
143
           /* if(levels.size() == 1) {
144
             //   writer.write(']');
145
            } else {
146
               Level position = levels.peek();
147
               Level parent = levels.get(levels.size()-2);
148
               if(position != null && position.isCollection() && !position.isEmptyCollection()) {
149
                   parent.jsonObjectBuilder.add(position.keyName, position.getJsonArrayBuilder());
150
               }
151
                Level position = levels.pop();
152
                Level parent = levels.peek();
153
                if(position != null && position.isCollection() && !position.isEmptyCollection()) {
154
                    //writer.write(']');
155
                    //Level parent = levels.get(1);
156
                   parent.jsonObjectBuilder.add(position.keyName, position.getJsonArrayBuilder());  
157
                   parent.needToOpenComplex = false;
158
                   parent.needToCloseComplex = true;
159
                }  
160
                
161
                position.setCollection(false);
162
            }
163
            levels.peek().setCollection(false);
164
       */
165
    }
166
    
167
    @Override    
168
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
169
        
170
                
171
        if(levels.isEmpty()) {
172
            //TODO when does this happen?
173
        //    newLevel = new Level();
174
          //  newLevel.setJsonObjectBuilder(Json.createObjectBuilder());
175
            //levels.push(newLevel);
176
         } else {
177
            Level position = levels.peek();
178
            Level newLevel;
179
            //if(position.isCollection && position.isEmptyCollection() && !lastEventWasStart){
180
            if(position.isCollection && !lastEventWasStart){
181
                 newLevel = position;      
182
                 position.setEmptyCollection(false);
183
            }else{
184
                newLevel = new Level();  
185
                levels.push(newLevel);                
186
            }
187
            if(lastEventWasStart){
188
                //newLevel.setComplex(true);
189
                if(position.isCollection){
190
                    newLevel.setJsonObjectBuilder(Json.createObjectBuilder());    
191
                }else{
192
                position.setJsonObjectBuilder(Json.createObjectBuilder());
193
                }
194
            }
195
            
196
            //if(position.isCollection){
197
            //    newLevel.setCollection(true);
198
              //  newLevel.setJsonArrayBuilder(position.getJsonArrayBuilder());
199
           // }
200
            
201
            String keyName = getKeyName(xPathFragment);
202
            newLevel.setKeyName(keyName);
203
         }
204
        //if(!charactersAllowed){
205
            //complex??
206
      //  }
207
        charactersAllowed = true;
208
        lastEventWasStart = true;
209
    }
210
    
211
    protected String getKeyName(XPathFragment xPathFragment){
212
        super.openStartElement(xPathFragment, namespaceResolver);
213
        String keyName = xPathFragment.getLocalName(); 
214
        
215
        if(isNamespaceAware()){
216
            if(xPathFragment.getNamespaceURI() != null){
217
                String prefix = null;
218
                if(getNamespaceResolver() !=null){
219
                    prefix = getNamespaceResolver().resolveNamespaceURI(xPathFragment.getNamespaceURI());
220
                } else if(namespaceResolver != null){
221
                    prefix = namespaceResolver.resolveNamespaceURI(xPathFragment.getNamespaceURI());
222
                }
223
                if(prefix != null && !prefix.equals(Constants.EMPTY_STRING)){
224
                    keyName = prefix + getNamespaceSeparator() +  keyName;                           
225
                }
226
            }
227
        } 
228
        if(xPathFragment.isAttribute() && attributePrefix != null){
229
            keyName = attributePrefix + keyName;
230
        }
231
232
        return keyName;
233
    }
234
235
    public void attribute(XPathFragment xPathFragment, NamespaceResolver namespaceResolver,  Object value, QName schemaType){
236
        if(xPathFragment.getNamespaceURI() != null && xPathFragment.getNamespaceURI() == javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI){
237
            return;
238
        }
239
        xPathFragment.setAttribute(true);
240
        openStartElement(xPathFragment, namespaceResolver);
241
        characters(schemaType, value, null, false);
242
        endElement(xPathFragment, namespaceResolver);
243
    }
244
    
245
    /**
246
     * INTERNAL:
247
     */
248
    @Override
249
    public void marshalWithoutRootElement(ObjectBuilder treeObjectBuilder, Object object, Descriptor descriptor, Root root, boolean isXMLRoot){
250
        if(treeObjectBuilder != null){
251
            addXsiTypeAndClassIndicatorIfRequired(descriptor, null, descriptor.getDefaultRootElementField(), root, object, isXMLRoot, true);
252
            treeObjectBuilder.marshalAttributes(this, object, session);
253
        }         
254
     }
255
    
256
    /**
257
     * INTERNAL:
258
     * The character used to separate the prefix and uri portions when namespaces are present 
259
     * @since 2.4
260
     */
261
    public char getNamespaceSeparator(){        
262
        return marshaller.getNamespaceSeparator();
263
    }
264
    
265
    /**
266
     * INTERNAL:
267
     * The optional fragment used to wrap the text() mappings
268
     * @since 2.4
269
     */
270
    public XPathFragment getTextWrapperFragment() {
271
        return textWrapperFragment;
272
    }
273
    
274
    @Override
275
    public boolean isWrapperAsCollectionName() {
276
        return marshaller.isWrapperAsCollectionName();
277
    }
278
    
279
    @Override
280
    public void element(XPathFragment frag) {
281
        // TODO Auto-generated method stub
282
        
283
    }
284
    
285
    /**
286
     * Handle marshal of an empty collection.  
287
     * @param xPathFragment
288
     * @param namespaceResolver
289
     * @param openGrouping if grouping elements should be marshalled for empty collections
290
     * @return
291
     */    
292
    public boolean emptyCollection(XPathFragment xPathFragment, NamespaceResolver namespaceResolver, boolean openGrouping) {        
293
         if(marshaller.isMarshalEmptyCollections()){  
294
             super.emptyCollection(xPathFragment, namespaceResolver, true);
295
            if (null != xPathFragment) {
296
                startCollection();
297
                if (!xPathFragment.isSelfFragment()) {
298
                    openStartElement(xPathFragment, namespaceResolver);
299
                    if (!levels.isEmpty()) {
300
                        Level position = levels.peek();
301
                     //   position.setNeedToCloseComplex(false);
302
                      //  position.setNeedToOpenComplex(false);
303
                    }
304
                    endElement(xPathFragment, namespaceResolver);
305
                }
306
                endCollection();
307
                //endEmptyCollection();
308
            }
309
             return true;
310
         }else{
311
             return super.emptyCollection(xPathFragment, namespaceResolver, openGrouping);
312
         }
313
    }
314
315
    @Override
316
    public void attribute(XPathFragment xPathFragment,
317
            NamespaceResolver namespaceResolver, String value) {
318
        // TODO Auto-generated method stub
319
        
320
    }
321
322
    @Override
323
    public void attribute(String namespaceURI, String localName, String qName, String value) {
324
        XPathFragment xPathFragment = new XPathFragment();
325
        xPathFragment.setNamespaceURI(namespaceURI);
326
        xPathFragment.setAttribute(true);
327
        xPathFragment.setLocalName(localName);
328
329
        openStartElement(xPathFragment, namespaceResolver);
330
        writeValue(value, null);
331
        endElement(xPathFragment, namespaceResolver);
332
        
333
    }
334
335
    @Override
336
    public void closeStartElement() {
337
        // TODO Auto-generated method stub
338
        
339
    }
340
341
    @Override
342
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
343
        if(!levels.isEmpty()) {
344
            Level position = levels.peek();
345
            if(position.isCollection){// && position.isFirstInCollection()){                
346
                return;
347
            }
348
            position = levels.pop();
349
            //if(position.isCollection && position.isFirstInCollection ||
350
            // if(!position.isFinished() || position.getJsonObjectBuilder() != null){
351
            if(!position.isFinished() ){
352
                Level parent = levels.peek();
353
                if(parent.isCollection){
354
                    position.setEmptyCollection(false);
355
                    if(parent.getJsonArrayBuilder() == null){
356
                        parent.setJsonArrayBuilder(Json.createArrayBuilder());
357
                    }
358
                    if(position.isCollection){
359
                       parent.getJsonArrayBuilder().add(position.getJsonArrayBuilder());
360
                    }else{
361
                        parent.getJsonArrayBuilder().add(position.getJsonObjectBuilder()); 
362
                    }
363
                }else{
364
                    if(parent.getJsonObjectBuilder() == null){
365
                        parent.setJsonObjectBuilder(Json.createObjectBuilder());
366
                    }
367
                    if(position.isCollection){
368
                        parent.getJsonObjectBuilder().add(position.keyName,position.getJsonArrayBuilder());
369
                     }else{
370
                         parent.getJsonObjectBuilder().add(position.keyName,position.getJsonObjectBuilder()); 
371
                     }
372
                }
373
                
374
            }
375
        }
376
        lastEventWasStart = false;
377
    }
378
379
    @Override
380
    public void characters(String value) {
381
        writeValue(value, null);
382
    }
383
    
384
    @Override
385
    public void characters(QName schemaType, Object value, String mimeType, boolean isCDATA){          
386
        Level position = levels.peek();
387
        if(mimeType != null) {
388
            if(value instanceof List){
389
               value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesListForBinaryValues((List)value, marshaller, mimeType);
390
           }else{
391
392
            value = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesForBinaryValue(value, marshaller, mimeType).getData();
393
           }
394
        }         
395
        if(schemaType != null && Constants.QNAME_QNAME.equals(schemaType)){
396
            String convertedValue = getStringForQName((QName)value);
397
            //characters((String)convertedValue);
398
            writeValue(convertedValue, null);
399
        } else {
400
            writeValue(value, schemaType);        
401
        }
402
    }
403
    
404
    public void writeValue(Object value, QName schemaType) {
405
        Level position = levels.peek();
406
     //   Level parent = levels.get(levels.size() -2);        
407
        boolean textWrapperOpened = false;
408
        if(!charactersAllowed){    
409
             if(textWrapperFragment != null){
410
                 openStartElement(textWrapperFragment, namespaceResolver);
411
                 textWrapperOpened = true;
412
             }
413
        }
414
        
415
        if(position.isCollection()){
416
            position.setEmptyCollection(false);
417
            if(value == NULL){
418
                position.getJsonArrayBuilder().addNull();
419
            }else if(value instanceof Integer){
420
                position.getJsonArrayBuilder().add((Integer)value);  
421
            }else if(value instanceof BigDecimal){
422
                position.getJsonArrayBuilder().add((BigDecimal)value);   
423
            }else if(value instanceof BigInteger){
424
                position.getJsonArrayBuilder().add((BigInteger)value);               
425
            }else if(value instanceof Boolean){
426
                position.getJsonArrayBuilder().add((Boolean)value);
427
            }else if(value instanceof Double){
428
                position.getJsonArrayBuilder().add((Double)value);
429
            }else if(value instanceof Long){
430
                position.getJsonArrayBuilder().add((Long)value);
431
            }else if(value instanceof String){
432
                position.getJsonArrayBuilder().add((String)value);
433
            }else{
434
                String convertedValue = ((String) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.STRING, schemaType));
435
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
436
                if((schemaType == null || theClass == null) && (ClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
437
                    //if it's still a number and falls through the cracks we dont want "" around the value
438
                        BigDecimal convertedNumberValue = ((BigDecimal) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.BIGDECIMAL, schemaType));
439
                        position.getJsonArrayBuilder().add((BigDecimal)convertedNumberValue);
440
                }else{
441
                    position.getJsonArrayBuilder().add(convertedValue);
442
                }
443
            }
444
            
445
        }
446
        
447
        /*
448
        if(parent.isCollection()){
449
            parent.setEmptyCollection(false);
450
            if(value == NULL){
451
                parent.getJsonArrayBuilder().addNull();
452
            }else if(value instanceof Integer){
453
                parent.getJsonArrayBuilder().add((Integer)value);  
454
            }else if(value instanceof BigDecimal){
455
                parent.getJsonArrayBuilder().add((BigDecimal)value);   
456
            }else if(value instanceof BigInteger){
457
                parent.getJsonArrayBuilder().add((BigInteger)value);               
458
            }else if(value instanceof Boolean){
459
                parent.getJsonArrayBuilder().add((Boolean)value);
460
            }else if(value instanceof Double){
461
                parent.getJsonArrayBuilder().add((Double)value);
462
            }else if(value instanceof Long){
463
                parent.getJsonArrayBuilder().add((Long)value);
464
            }else if(value instanceof String){
465
                parent.getJsonArrayBuilder().add((String)value);
466
            }else{
467
                String convertedValue = ((String) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.STRING, schemaType));
468
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
469
                if((schemaType == null || theClass == null) && (ClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
470
                    //if it's still a number and falls through the cracks we dont want "" around the value
471
                        BigDecimal convertedNumberValue = ((BigDecimal) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.BIGDECIMAL, schemaType));
472
                        parent.getJsonArrayBuilder().add((BigDecimal)convertedNumberValue);
473
                }else{
474
                    parent.getJsonArrayBuilder().add(convertedValue);
475
                }
476
            }
477
            
478
        }*/
479
       /* if(parent.isCollection){
480
            position.setCollection(true);
481
            position.setJsonArrayBuilder(parent.jsonArrayBuilder);
482
        }
483
       
484
        if(position.isCollection()){
485
            position.setEmptyCollection(false);
486
            if(value == NULL){
487
                position.getJsonArrayBuilder().addNull();
488
            }else if(value instanceof Integer){
489
                position.getJsonArrayBuilder().add((Integer)value);  
490
            }else if(value instanceof BigDecimal){
491
                position.getJsonArrayBuilder().add((BigDecimal)value);   
492
            }else if(value instanceof BigInteger){
493
                position.getJsonArrayBuilder().add((BigInteger)value);               
494
            }else if(value instanceof Boolean){
495
                position.getJsonArrayBuilder().add((Boolean)value);
496
            }else if(value instanceof Double){
497
                position.getJsonArrayBuilder().add((Double)value);
498
            }else if(value instanceof Long){
499
                position.getJsonArrayBuilder().add((Long)value);
500
            }else if(value instanceof String){
501
                position.getJsonArrayBuilder().add((String)value);
502
            }else{
503
                String convertedValue = ((String) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.STRING, schemaType));
504
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
505
                if((schemaType == null || theClass == null) && (ClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
506
                    //if it's still a number and falls through the cracks we dont want "" around the value
507
                        BigDecimal convertedNumberValue = ((BigDecimal) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.BIGDECIMAL, schemaType));
508
                        position.getJsonArrayBuilder().add((BigDecimal)convertedNumberValue);
509
                }else{
510
                    position.getJsonArrayBuilder().add(convertedValue);
511
                }
512
            }
513
            
514
        }
515
        */
516
        else{
517
            //Level parent = levels.get(levels.size() -2);
518
            //JsonObjectBuilder builder = parent.getJsonObjectBuilder();
519
            
520
            JsonObjectBuilder builder = position.getJsonObjectBuilder();           
521
            if(builder == null){
522
                Level parent = levels.get(levels.size() -2);
523
                builder = parent.getJsonObjectBuilder();
524
            }
525
               
526
            
527
                
528
            /*
529
            if(!parent.isCollection && parent.getJsonObjectBuilder() == null){
530
                parent.setJsonObjectBuilder(Json.createObjectBuilder());   
531
            }*/
532
            
533
            if(value == NULL){
534
                builder.addNull(position.keyName);
535
            }else if(value instanceof Integer){
536
                builder.add(position.keyName, (Integer)value);  
537
            }else if(value instanceof BigDecimal){
538
                builder.add(position.keyName, (BigDecimal)value);   
539
            }else if(value instanceof BigInteger){
540
                builder.add(position.keyName, (BigInteger)value);               
541
            }else if(value instanceof Boolean){
542
                builder.add(position.keyName, (Boolean)value);
543
            }else if(value instanceof Double){
544
                builder.add(position.keyName, (Double)value);
545
            }else if(value instanceof Long){
546
                builder.add(position.keyName, (Long)value);
547
            }else if(value instanceof String){
548
                builder.add(position.keyName, (String)value);
549
            }else{
550
                String convertedValue = ((String) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.STRING, schemaType));
551
                Class theClass = (Class) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).getDefaultXMLTypes().get(schemaType);          
552
                if((schemaType == null || theClass == null) && (ClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
553
                    //if it's still a number and falls through the cracks we dont want "" around the value
554
                        BigDecimal convertedNumberValue = ((BigDecimal) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.BIGDECIMAL, schemaType));
555
                        builder.add(position.keyName, (BigDecimal)convertedNumberValue);
556
                }else{
557
                    builder.add(position.keyName, convertedValue);
558
                }
559
                    
560
            }
561
        }
562
        if(textWrapperOpened){    
563
            if(textWrapperFragment != null){
564
                endElement(textWrapperFragment, namespaceResolver);
565
            }
566
        }
567
        position.setFinished(true);
568
        charactersAllowed = false;
569
        lastEventWasStart = false;
570
571
    }
572
573
    @Override
574
    public void cdata(String value) {
575
        characters(value);        
576
    }
577
578
    @Override
579
    public void node(Node node, NamespaceResolver resolver,
580
            String qualifiedName, String rootUri) {
581
        // TODO Auto-generated method stub
582
        
583
    }        
584
    
585
    protected String getStringForQName(QName qName){
586
        if(null == qName) {
587
            return null;
588
        }
589
        XMLConversionManager xmlConversionManager = (XMLConversionManager) getSession().getDatasourcePlatform().getConversionManager();
590
591
        return (String) xmlConversionManager.convertObject(qName, String.class);       
592
    }
593
594
    /**
595
     * INTERNAL:
596
     */
597
     public void namespaceDeclarations(NamespaceResolver namespaceResolver) {
598
     }
599
600
     public void namespaceDeclaration(String prefix, String namespaceURI){
601
     }
602
     
603
     public void defaultNamespaceDeclaration(String defaultNamespace){
604
     }
605
     
606
    /**
607
     * INTERNAL:
608
     */
609
     public void nilComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
610
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
611
         closeStartGroupingElements(groupingFragment);
612
         openStartElement(xPathFragment, namespaceResolver);
613
         characters(NULL);
614
         endElement(xPathFragment, namespaceResolver);
615
     }
616
617
    /**
618
     * INTERNAL:
619
     */
620
     public void nilSimple(NamespaceResolver namespaceResolver){
621
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);         
622
         characters(NULL);
623
         closeStartGroupingElements(groupingFragment);
624
     }
625
626
     /**
627
      * Used when an empty simple value should be written
628
      * @since EclipseLink 2.4
629
      */
630
     public void emptySimple(NamespaceResolver namespaceResolver){
631
         nilSimple(namespaceResolver);
632
     }
633
     
634
     public void emptyAttribute(XPathFragment xPathFragment,NamespaceResolver namespaceResolver){
635
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
636
         openStartElement(xPathFragment, namespaceResolver);
637
         characters(NULL);
638
         endElement(xPathFragment, namespaceResolver);
639
         closeStartGroupingElements(groupingFragment);
640
     }
641
642
     /**
643
      * Used when an empty complex item should be written
644
      * @since EclipseLink 2.4
645
      */
646
     public void emptyComplex(XPathFragment xPathFragment, NamespaceResolver namespaceResolver){
647
         XPathFragment groupingFragment = openStartGroupingElements(namespaceResolver);
648
         closeStartGroupingElements(groupingFragment);
649
         openStartElement(xPathFragment, namespaceResolver);
650
         endElement(xPathFragment, namespaceResolver);
651
     }
652
    
653
    /**
654
     * Instances of this class are used to maintain state about the current
655
     * level of the JSON message being marshalled.
656
     */
657
    protected static class Level {
658
        
659
        private boolean isCollection;
660
        private boolean emptyCollection;
661
        private String keyName;
662
        private boolean finished;
663
        private JsonObjectBuilder jsonObjectBuilder;
664
        private JsonArrayBuilder jsonArrayBuilder;
665
        private boolean isFirstInCollection;
666
        private boolean isComplex;
667
        
668
        public Level(){
669
            
670
        }
671
        
672
        public Level(boolean isCollection) {
673
            this.isCollection = isCollection;
674
            this.emptyCollection = true;
675
        }
676
677
        public boolean isCollection() {
678
            return isCollection;
679
        }
680
681
        public void setCollection(boolean isCollection) {
682
            this.isCollection = isCollection;
683
        }
684
685
        public String getKeyName() {
686
            return keyName;
687
        }
688
689
        public void setKeyName(String keyName) {
690
            this.keyName = keyName;
691
        }
692
693
        public JsonObjectBuilder getJsonObjectBuilder() {
694
            return jsonObjectBuilder;
695
        }
696
697
        public void setJsonObjectBuilder(JsonObjectBuilder jsonObjectBuilder) {
698
            this.jsonObjectBuilder = jsonObjectBuilder;
699
        }
700
701
        public JsonArrayBuilder getJsonArrayBuilder() {
702
            return jsonArrayBuilder;
703
        }
704
705
        public void setJsonArrayBuilder(JsonArrayBuilder jsonArrayBuilder) {
706
            this.jsonArrayBuilder = jsonArrayBuilder;
707
        }
708
709
        public boolean isEmptyCollection() {
710
            return emptyCollection;
711
        }
712
713
        public void setEmptyCollection(boolean emptyCollection) {
714
            this.emptyCollection = emptyCollection;
715
        }
716
717
        public boolean isFinished() {
718
            return finished;
719
        }
720
721
        public void setFinished(boolean finished) {
722
            this.finished = finished;
723
        }
724
725
        public boolean isFirstInCollection() {
726
            return isFirstInCollection;
727
        }
728
729
        public void setFirstInCollection(boolean isFirstInCollection) {
730
            this.isFirstInCollection = isFirstInCollection;
731
        }
732
733
        public boolean isComplex() {
734
            return isComplex;
735
        }
736
737
        public void setComplex(boolean isComplex) {
738
            this.isComplex = isComplex;
739
        }
740
    }
741
742
743
}
(-)a/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/JAXBWithJSONTestCases.java (+61 lines)
Lines 23-30 import java.util.ArrayList; Link Here
23
import java.util.List;
23
import java.util.List;
24
24
25
import javax.json.Json;
25
import javax.json.Json;
26
import javax.json.JsonObject;
27
import javax.json.JsonObjectBuilder;
26
import javax.json.JsonReader;
28
import javax.json.JsonReader;
27
import javax.json.JsonStructure;
29
import javax.json.JsonStructure;
30
import javax.json.JsonWriter;
31
import javax.json.stream.JsonGenerator;
32
import javax.json.stream.JsonParser;
28
import javax.xml.bind.JAXBElement;
33
import javax.xml.bind.JAXBElement;
29
import javax.xml.bind.Marshaller;
34
import javax.xml.bind.Marshaller;
30
import javax.xml.bind.Unmarshaller;
35
import javax.xml.bind.Unmarshaller;
Lines 37-42 import org.eclipse.persistence.jaxb.JAXBContext; Link Here
37
import org.eclipse.persistence.jaxb.MarshallerProperties;
42
import org.eclipse.persistence.jaxb.MarshallerProperties;
38
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
43
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
39
import org.eclipse.persistence.oxm.MediaType;
44
import org.eclipse.persistence.oxm.MediaType;
45
import org.eclipse.persistence.oxm.json.JsonGeneratorResult;
46
import org.eclipse.persistence.oxm.json.JsonObjectBuilderResult;
47
import org.eclipse.persistence.oxm.json.JsonParserSource;
40
import org.eclipse.persistence.oxm.json.JsonStructureSource;
48
import org.eclipse.persistence.oxm.json.JsonStructureSource;
41
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
49
import org.eclipse.persistence.testing.jaxb.JAXBTestCases.MyStreamSchemaOutputResolver;
42
import org.xml.sax.InputSource;
50
import org.xml.sax.InputSource;
Lines 235-240 public abstract class JAXBWithJSONTestCases extends JAXBTestCases { Link Here
235
            jsonToObjectTest(testObject);
243
            jsonToObjectTest(testObject);
236
        }
244
        }
237
    }
245
    }
246
    
247
    //200 failures? doesn't handle attributes
248
   /* public void testJSONUnmarshalFromJsonParserSource() throws Exception {
249
        if(isUnmarshalTest()){
250
            getJSONUnmarshaller().setProperty(UnmarshallerProperties.MEDIA_TYPE, getJSONUnmarshalMediaType());
251
           InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(controlJSONLocation);    
252
           JsonParser parser = Json.createParser(inputStream);
253
           JsonParserSource source = new JsonParserSource(parser);
254
            
255
            Object testObject = null;
256
            if(getUnmarshalClass() != null){               
257
                testObject = getJSONUnmarshaller().unmarshal(source, getUnmarshalClass());
258
            }else{
259
                testObject = getJSONUnmarshaller().unmarshal(source);
260
            }
261
            jsonToObjectTest(testObject);
262
        }
263
    }
264
*/
238
       
265
       
239
    public void testJSONUnmarshalFromURL() throws Exception {
266
    public void testJSONUnmarshalFromURL() throws Exception {
240
    	if(isUnmarshalTest()){
267
    	if(isUnmarshalTest()){
Lines 290-295 public abstract class JAXBWithJSONTestCases extends JAXBTestCases { Link Here
290
        compareStringToControlFile("testJSONMarshalToStringWriter_FORMATTED", sw.toString(), getWriteControlJSONFormatted(),shouldRemoveWhitespaceFromControlDocJSON());
317
        compareStringToControlFile("testJSONMarshalToStringWriter_FORMATTED", sw.toString(), getWriteControlJSONFormatted(),shouldRemoveWhitespaceFromControlDocJSON());
291
    }
318
    }
292
319
320
  /*  public void testJSONMarshalToJsonGeneratorResult() throws Exception{
321
        getJSONMarshaller().setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
322
323
        StringWriter sw = new StringWriter();
324
        JsonGenerator generator = Json.createGenerator(sw);
325
        JsonGeneratorResult result = new JsonGeneratorResult(generator);
326
        getJSONMarshaller().marshal(getWriteControlObject(), result);
327
        generator.flush();
328
        log(sw.toString());
329
        compareStringToControlFile("**testJSONMarshalToStringWriter**", sw.toString());
330
    }
331
    */
332
    
333
    public void testJSONMarshalToBuilderResult() throws Exception{
334
        getJSONMarshaller().setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
335
336
        JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder();
337
       // JsonGenerator generator = Json.createGenerator(sw);
338
        JsonObjectBuilderResult result = new JsonObjectBuilderResult(jsonObjectBuilder);
339
        getJSONMarshaller().marshal(getWriteControlObject(), result);
340
        //generator.flush();
341
        JsonObject jsonObject = jsonObjectBuilder.build();
342
        
343
        StringWriter sw = new StringWriter();
344
        JsonWriter writer= Json.createWriter(sw);
345
        //writer.write(rootStructure);
346
        writer.writeObject(jsonObject);
347
        writer.close();
348
        System.out.println(sw.toString());
349
        
350
        log(sw.toString());
351
        compareStringToControlFile("**testJSONMarshalToStringWriter**", sw.toString());
352
    }
353
    
293
    protected void compareStringToControlFile(String test, String testString) {
354
    protected void compareStringToControlFile(String test, String testString) {
294
    	compareStringToControlFile(test, testString, getWriteControlJSON());
355
    	compareStringToControlFile(test, testString, getWriteControlJSON());
295
    }
356
    }

Return to bug 411377