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/oxm/record/JsonBuilderRecord.java (-201 / +46 lines)
Lines 12-19 Link Here
12
 ******************************************************************************/
12
 ******************************************************************************/
13
package org.eclipse.persistence.oxm.record;
13
package org.eclipse.persistence.oxm.record;
14
14
15
import java.io.IOException;
16
import java.io.StringWriter;
17
import java.math.BigDecimal;
15
import java.math.BigDecimal;
18
import java.math.BigInteger;
16
import java.math.BigInteger;
19
17
Lines 22-42 import javax.json.JsonArrayBuilder; Link Here
22
import javax.json.JsonObjectBuilder;
20
import javax.json.JsonObjectBuilder;
23
import javax.xml.namespace.QName;
21
import javax.xml.namespace.QName;
24
22
25
import org.eclipse.persistence.exceptions.XMLMarshalException;
26
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
23
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
27
import org.eclipse.persistence.internal.oxm.ConversionManager;
24
import org.eclipse.persistence.internal.oxm.ConversionManager;
28
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
29
import org.eclipse.persistence.internal.oxm.XPathFragment;
30
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
25
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
31
import org.eclipse.persistence.oxm.record.JsonRecord.Level;
32
26
33
public class JsonBuilderRecord extends JsonRecord {
27
public class JsonBuilderRecord extends JsonRecord<JsonBuilderRecord.Level> {
34
28
 
35
    private Level position;
36
    private JsonObjectBuilder rootJsonObjectBuilder;
29
    private JsonObjectBuilder rootJsonObjectBuilder;
37
    private JsonArrayBuilder rootJsonArrayBuilder;
30
    private JsonArrayBuilder rootJsonArrayBuilder;
38
 
31
 
39
    
40
    public JsonBuilderRecord(){
32
    public JsonBuilderRecord(){
41
        super();
33
        super();
42
        isLastEventStart = false;
34
        isLastEventStart = false;
Lines 52-268 public class JsonBuilderRecord extends JsonRecord { Link Here
52
        rootJsonArrayBuilder = jsonArrayBuilder;
44
        rootJsonArrayBuilder = jsonArrayBuilder;
53
        isRootArray = true;
45
        isRootArray = true;
54
    }
46
    }
55
      
47
     
56
    @Override
48
    protected Level createNewLevel(boolean collection, Level parentLevel){
57
    public void startDocument(String encoding, String version) {      
49
      return new Level(collection, position);       
58
        if(isRootArray){
59
            if(position == null){
60
                startCollection();
61
            }
62
            position.setEmptyCollection(false);
63
            
64
            Level newLevel = new Level(false, position);
65
            position = newLevel;
66
            
67
            isLastEventStart = true;
68
        }else{
69
            Level rootLevel = new Level(false, null);
70
            position = rootLevel;
71
            if(rootJsonObjectBuilder == null){
72
                rootJsonObjectBuilder = Json.createObjectBuilder();
73
            }  
74
            
75
            rootLevel.setJsonObjectBuilder(rootJsonObjectBuilder);
76
        }
77
    }
50
    }
78
51
  
79
    @Override
52
    protected void startRootObject(){
80
    public void endDocument() {
53
        super.startRootObject();                
81
        if(position != null){
54
        position.setJsonObjectBuilder(rootJsonObjectBuilder);
82
            if(position.parentLevel != null && position.parentLevel.isCollection){
55
        setComplex(position, true);
83
                popAndSetInParentBuilder();
84
            }else{
85
                //this is the root level list case
86
                position = (Level) position.parentLevel;
87
            }
88
        }
89
    }
56
    }
57
       
58
    protected void finishLevel(){
59
        if(!(position.isCollection && position.isEmptyCollection() && position.getKeyName() == null)){
60
            
61
            Level parentLevel = (Level) position.parentLevel;
90
    
62
    
91
    private void popAndSetInParentBuilder(){
63
            if(parentLevel != null){                  
92
        Level removedLevel = position;
64
                if(parentLevel.isCollection){
93
        Level parentLevel = (Level) position.parentLevel;
65
                    if(position.isCollection){
94
        position = (Level) position.parentLevel;
66
                        parentLevel.getJsonArrayBuilder().add(position.getJsonArrayBuilder());
95
        if(removedLevel.isCollection && removedLevel.isEmptyCollection() && removedLevel.keyName == null){
67
                    }else{                   
96
            return;
68
                        parentLevel.getJsonArrayBuilder().add(position.getJsonObjectBuilder());
97
        }
69
                    }
98
      
99
        if(parentLevel != null){                  
100
            if(parentLevel.isCollection){
101
                if(removedLevel.isCollection){
102
                    parentLevel.getJsonArrayBuilder().add(removedLevel.getJsonArrayBuilder());
103
                }else{                   
104
                    parentLevel.getJsonArrayBuilder().add(removedLevel.getJsonObjectBuilder());
105
                }
106
            }else{
107
                if(removedLevel.isCollection){                    
108
                    parentLevel.getJsonObjectBuilder().add(removedLevel.getKeyName(), removedLevel.getJsonArrayBuilder());
109
                }else{
70
                }else{
110
                    parentLevel.getJsonObjectBuilder().add(removedLevel.getKeyName(), removedLevel.getJsonObjectBuilder());
71
                    if(position.isCollection){                    
72
                        parentLevel.getJsonObjectBuilder().add(position.getKeyName(), position.getJsonArrayBuilder());
73
                    }else{
74
                        parentLevel.getJsonObjectBuilder().add(position.getKeyName(), position.getJsonObjectBuilder());
75
                    }
111
                }
76
                }
112
            }
77
            }
113
        }
78
        }
114
        
79
        super.finishLevel();      
115
    }    
80
    }    
116
    
81
    
117
    public void startCollection() {
82
    protected void startRootLevelCollection(){
118
        if(position == null){
83
        if(rootJsonArrayBuilder == null){
119
             isRootArray = true;              
84
            rootJsonArrayBuilder = Json.createArrayBuilder();
120
             Level rootLevel = new Level(true, null);
85
       }
121
             if(rootJsonArrayBuilder == null){
86
       position.setJsonArrayBuilder(rootJsonArrayBuilder); 
122
                  rootJsonArrayBuilder = Json.createArrayBuilder();
123
             }
124
             rootLevel.setJsonArrayBuilder(rootJsonArrayBuilder);
125
             position = rootLevel;
126
        } else {            
127
            if(isLastEventStart){
128
                setComplex(position, true);           
129
            }            
130
            Level level = new Level(true, position);            
131
            position = level;
132
        }      
133
        isLastEventStart = false;
134
    }
87
    }
135
    
88
136
    @Override
89
    @Override
137
    public void endCollection() {
90
    public void endCollection() {
138
         popAndSetInParentBuilder();    
91
        finishLevel();    
139
    }
92
    }
140
    
93
    
141
    private void setComplex(Level level, boolean complex){
94
    protected void setComplex(Level level, boolean complex){       
142
        boolean isAlreadyComplex = level.isComplex;
95
        boolean isAlreadyComplex = level.isComplex;
143
        level.setComplex(complex);
96
        super.setComplex(level, complex);
144
        if(complex && !isAlreadyComplex){
97
        if(complex && !isAlreadyComplex){
145
            if(complex && level.jsonObjectBuilder == null){
98
            if(level.jsonObjectBuilder == null){
146
                level.jsonObjectBuilder = Json.createObjectBuilder();
99
                level.jsonObjectBuilder = Json.createObjectBuilder();
147
            }
100
            }
148
        }
101
        }
149
    }
102
    }
150
    
103
    
151
    @Override    
104
    protected void writeEmptyCollection(Level level, String keyName){
152
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
105
        level.getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());
153
        super.openStartElement(xPathFragment, namespaceResolver);
154
        if(position != null){
155
            Level newLevel = new Level(false, position);            
156
            
157
            if(isLastEventStart){ 
158
                //this means 2 startevents in a row so the last this is a complex object
159
                setComplex(position, true);                                
160
            }
161
                      
162
            String keyName = getKeyName(xPathFragment);
163
           
164
            if(position.isCollection && position.isEmptyCollection() ){
165
                position.setKeyName(keyName);
166
            }else{
167
                newLevel.setKeyName(keyName);    
168
            }
169
            position = newLevel;   
170
            isLastEventStart = true;
171
        }
172
    }
173
       
174
    /**
175
     * Handle marshal of an empty collection.  
176
     * @param xPathFragment
177
     * @param namespaceResolver
178
     * @param openGrouping if grouping elements should be marshalled for empty collections
179
     * @return
180
     */    
181
    public boolean emptyCollection(XPathFragment xPathFragment, NamespaceResolver namespaceResolver, boolean openGrouping) {
182
183
         if(marshaller.isMarshalEmptyCollections()){
184
             super.emptyCollection(xPathFragment, namespaceResolver, true);
185
             
186
             if (null != xPathFragment) {
187
                 
188
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
189
                     String keyName = position.getKeyName();
190
                     setComplex(position, false);
191
                     ((Level)position.parentLevel).getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());                     
192
                 }else{ 
193
                     if(isLastEventStart){                         
194
                         setComplex(position, true);
195
                     }                 
196
                     String keyName =  getKeyName(xPathFragment);
197
                     if(keyName != null){
198
                        position.getJsonObjectBuilder().add(keyName, Json.createArrayBuilder());
199
                     }
200
                 }
201
                 isLastEventStart = false;   
202
             }
203
                  
204
             return true;
205
         }else{
206
             return super.emptyCollection(xPathFragment, namespaceResolver, openGrouping);
207
         }
208
    }
209
210
    @Override
211
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
212
        if(position != null){
213
            if(isLastEventStart){
214
                setComplex(position, true);
215
            }
216
            if(position.isComplex){
217
                popAndSetInParentBuilder();
218
            }else{
219
                position = (Level) position.parentLevel;
220
            }            
221
            isLastEventStart = false;          
222
        }
223
    }
106
    }
224
    
225
    public void writeValue(Object value, QName schemaType, boolean isAttribute) {
226
        
227
        if (characterEscapeHandler != null && value instanceof String) {
228
            try {
229
                StringWriter stringWriter = new StringWriter();
230
                characterEscapeHandler.escape(((String)value).toCharArray(), 0, ((String)value).length(), isAttribute, stringWriter);
231
                value = stringWriter.toString();
232
            } catch (IOException e) {
233
                throw XMLMarshalException.marshalException(e);
234
            }
235
        }
236
        
237
        boolean textWrapperOpened = false;                       
238
        if(!isLastEventStart){
239
             openStartElement(textWrapperFragment, namespaceResolver);
240
             textWrapperOpened = true;
241
        }
242
      
107
      
243
        Level currentLevel = position;
108
    protected void addValueToObject(Level level, String keyName, Object value, QName schemaType){
244
        String keyName = position.getKeyName();
109
        JsonObjectBuilder jsonObjectBuilder = level.getJsonObjectBuilder();
245
        if(!position.isComplex){           
246
            currentLevel = (Level) position.parentLevel;         
247
        }       
248
        addValue(currentLevel, keyName, value, schemaType);
249
        isLastEventStart = false;
250
        if(textWrapperOpened){    
251
             endElement(textWrapperFragment, namespaceResolver);
252
        }    
253
    }
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
    
265
    private void addValueToObjectBuilder(JsonObjectBuilder jsonObjectBuilder, String keyName, Object value, QName schemaType){
266
        if(value == NULL){
110
        if(value == NULL){
267
            jsonObjectBuilder.addNull(keyName);
111
            jsonObjectBuilder.addNull(keyName);
268
        }else if(value instanceof Integer){
112
        }else if(value instanceof Integer){
Lines 297-303 public class JsonBuilderRecord extends JsonRecord { Link Here
297
        }
141
        }
298
    }
142
    }
299
    
143
    
300
    private void addValueToArrayBuilder(JsonArrayBuilder jsonArrayBuilder, Object value, QName schemaType){
144
    protected void addValueToArray(Level level, Object value, QName schemaType){
145
        JsonArrayBuilder jsonArrayBuilder = level.getJsonArrayBuilder();
301
        if(value == NULL){
146
        if(value == NULL){
302
            jsonArrayBuilder.addNull();
147
            jsonArrayBuilder.addNull();
303
        }else if(value instanceof Integer){
148
        }else if(value instanceof Integer){
Lines 341-348 public class JsonBuilderRecord extends JsonRecord { Link Here
341
        private JsonObjectBuilder jsonObjectBuilder;
186
        private JsonObjectBuilder jsonObjectBuilder;
342
        private JsonArrayBuilder jsonArrayBuilder;
187
        private JsonArrayBuilder jsonArrayBuilder;
343
        
188
        
344
        public Level(boolean isCollection, Level parentLevel) {
189
        public Level(boolean isCollection, Level position) {
345
            super(isCollection, parentLevel);
190
            super(isCollection, position);
346
        }
191
        }
347
     
192
     
348
        public void setCollection(boolean isCollection) {
193
        public void setCollection(boolean isCollection) {
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonGeneratorRecord.java (-173 / +31 lines)
Lines 12-35 Link Here
12
 ******************************************************************************/
12
 ******************************************************************************/
13
package org.eclipse.persistence.oxm.record;
13
package org.eclipse.persistence.oxm.record;
14
14
15
import java.io.IOException;
16
import java.io.StringWriter;
17
import java.math.BigDecimal;
15
import java.math.BigDecimal;
18
import java.math.BigInteger;
16
import java.math.BigInteger;
19
17
20
import javax.json.stream.JsonGenerator;
18
import javax.json.stream.JsonGenerator;
21
import javax.xml.namespace.QName;
19
import javax.xml.namespace.QName;
22
20
23
import org.eclipse.persistence.exceptions.XMLMarshalException;
24
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
21
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
25
import org.eclipse.persistence.internal.oxm.ConversionManager;
22
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;
23
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
29
24
30
public class JsonGeneratorRecord extends JsonRecord {
25
public class JsonGeneratorRecord extends JsonRecord<JsonRecord.Level> {
31
26
32
    private Level position;    
33
    private JsonGenerator jsonGenerator;
27
    private JsonGenerator jsonGenerator;
34
    private String rootKeyName;
28
    private String rootKeyName;
35
          
29
          
Lines 39-107 public class JsonGeneratorRecord extends JsonRecord { Link Here
39
        this.rootKeyName = rootKeyName;
33
        this.rootKeyName = rootKeyName;
40
    }
34
    }
41
    
35
    
42
    @Override
36
    protected void startRootObject(){
43
    public void startDocument(String encoding, String version) {      
37
        super.startRootObject();        
44
        if(isRootArray){  
38
        position.setKeyName(rootKeyName);
45
            if(position == null){
39
        setComplex(position, true);
46
                startCollection();
47
            }                            
48
            position.setEmptyCollection(false); 
49
            Level newLevel = new Level(false, position);
50
            position = newLevel;
51
            isLastEventStart = true;
52
        }else{
53
            Level rootLevel = new Level(false, null);
54
            rootLevel.setKeyName(rootKeyName);
55
            position = rootLevel;
56
            setComplex(position, true);
57
        }
58
    }
59
60
    @Override
61
    public void endDocument() {        
62
        if(position != null){
63
            jsonGenerator.writeEnd(); 
64
            position = position.parentLevel;
65
        }
66
    }
40
    }
67
    
41
   
68
    private void popAndSetInParentBuilder(){
42
    protected void finishLevel(){
69
        if(!(position.isCollection && position.isEmptyCollection() && position.getKeyName() == null)){
43
        if(!(position.isCollection && position.isEmptyCollection() && position.getKeyName() == null)){
70
            jsonGenerator.writeEnd(); 
44
            jsonGenerator.writeEnd(); 
71
        }
45
        }
72
        position = position.parentLevel;      
46
        super.finishLevel();
73
    }    
47
    }   
74
    
48
  
75
    public void startCollection() {
49
    protected void startRootLevelCollection(){
76
        if(position == null){
50
        if(rootKeyName != null){
77
             isRootArray = true;              
51
            jsonGenerator.writeStartArray(rootKeyName);
78
             Level rootLevel = new Level(true, null); 
52
         }else{
79
             position = rootLevel;
53
             jsonGenerator.writeStartArray();
80
             if(rootKeyName != null){
54
         }
81
                jsonGenerator.writeStartArray(rootKeyName);
82
             }else{
83
                 jsonGenerator.writeStartArray();
84
             }
85
        } else {            
86
            if(isLastEventStart){
87
                setComplex(position, true);         
88
            }            
89
            Level level = new Level(true, position);            
90
            position = level;
91
        }      
92
        isLastEventStart = false;
93
    }
55
    }
94
    
56
95
    @Override
57
    @Override
96
    public void endCollection() {        
58
    public void endCollection() {        
97
         popAndSetInParentBuilder();    
59
        finishLevel();    
98
    }
60
    }
99
61
100
    private void setComplex(Level level, boolean complex){
62
    protected void setComplex(Level level, boolean complex){
101
        boolean isAlreadyComplex = level.isComplex;
63
        boolean isAlreadyComplex = level.isComplex;
102
        level.setComplex(complex);
64
        super.setComplex(level, complex);
103
        if(complex && !isAlreadyComplex){
65
        if(complex && !isAlreadyComplex){
104
            Level parentLevel = level.parentLevel;
66
            Level parentLevel = level.parentLevel;
67
            if(parentLevel != null && parentLevel.isCollection && parentLevel.isEmptyCollection()){
68
                parentLevel.setEmptyCollection(false);
69
            }
105
            if((parentLevel != null && parentLevel.isCollection && !parentLevel.isEmptyCollection()) || level.keyName == null){
70
            if((parentLevel != null && parentLevel.isCollection && !parentLevel.isEmptyCollection()) || level.keyName == null){
106
                jsonGenerator.writeStartObject();                    
71
                jsonGenerator.writeStartObject();                    
107
            }else{
72
            }else{
Lines 110-232 public class JsonGeneratorRecord extends JsonRecord { Link Here
110
        }
75
        }
111
    }
76
    }
112
    
77
    
113
    @Override    
78
    protected void startEmptyCollection(){
114
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
79
       jsonGenerator.writeStartArray(position.keyName);
115
        super.openStartElement(xPathFragment, namespaceResolver);
116
        if(position != null){
117
            Level newLevel = new Level(false, position);            
118
            
119
            if(isLastEventStart){                              
120
                //this means 2 startevents in a row so the last this is a complex object
121
                setComplex(position, true);
122
            }
123
                      
124
            String keyName = getKeyName(xPathFragment);
125
           
126
            if(position.isCollection && position.isEmptyCollection() ){
127
                position.setKeyName(keyName);
128
                jsonGenerator.writeStartArray(keyName);
129
                position.setEmptyCollection(false);
130
            }else{
131
                newLevel.setKeyName(keyName);    
132
            }
133
            position = newLevel;   
134
            isLastEventStart = true;
135
        }
136
    }    
137
    
138
    /**
139
     * Handle marshal of an empty collection.  
140
     * @param xPathFragment
141
     * @param namespaceResolver
142
     * @param openGrouping if grouping elements should be marshalled for empty collections
143
     * @return
144
     */    
145
    public boolean emptyCollection(XPathFragment xPathFragment, NamespaceResolver namespaceResolver, boolean openGrouping) {
146
147
         if(marshaller.isMarshalEmptyCollections()){
148
             super.emptyCollection(xPathFragment, namespaceResolver, true);
149
             
150
             if (null != xPathFragment) {
151
                 
152
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
153
                     String keyName = position.getKeyName();
154
                     setComplex(position, false);
155
                     jsonGenerator.writeStartArray(keyName);
156
                     jsonGenerator.writeEnd();
157
                 }else{ 
158
                     if(isLastEventStart){
159
                         setComplex(position, true);
160
                     }                 
161
                     String keyName =  getKeyName(xPathFragment);
162
                     if(keyName != null){
163
                         jsonGenerator.writeStartArray(keyName);
164
                         jsonGenerator.writeEnd();
165
                     }
166
                 }
167
                 isLastEventStart = false;   
168
             }
169
                  
170
             return true;
171
         }else{
172
             return super.emptyCollection(xPathFragment, namespaceResolver, openGrouping);
173
         }
174
    } 
175
    @Override
176
    public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
177
        if(position != null){
178
            if(isLastEventStart){
179
                setComplex(position, true);
180
            }
181
            if(position.isComplex){
182
                popAndSetInParentBuilder();
183
            }else{
184
                position = position.parentLevel;
185
            }            
186
            isLastEventStart = false;          
187
        }
188
    }
189
    
190
    public void writeValue(Object value, QName schemaType, boolean isAttribute) {
191
        
192
        if (characterEscapeHandler != null && value instanceof String) {
193
            try {
194
                StringWriter stringWriter = new StringWriter();
195
                characterEscapeHandler.escape(((String)value).toCharArray(), 0, ((String)value).length(), isAttribute, stringWriter);
196
                value = stringWriter.toString();
197
            } catch (IOException e) {
198
                throw XMLMarshalException.marshalException(e);
199
            }
200
        }
201
        
202
        boolean textWrapperOpened = false;                       
203
        if(!isLastEventStart){
204
             openStartElement(textWrapperFragment, namespaceResolver);
205
             textWrapperOpened = true;
206
        }
207
      
208
        Level currentLevel = position;
209
        String keyName = position.getKeyName();
210
        if(!position.isComplex){           
211
            currentLevel = position.parentLevel;         
212
        }
213
        addValue(currentLevel, keyName, value, schemaType);
214
        isLastEventStart = false;
215
        if(textWrapperOpened){    
216
             endElement(textWrapperFragment, namespaceResolver);
217
        }    
218
    }
80
    }
219
    private void addValue(Level currentLevel, String keyName, Object value, QName schemaType){        
81
220
        if(currentLevel.isCollection()){
82
    protected void writeEmptyCollection(Level level, String keyName){
221
            currentLevel.setEmptyCollection(false);
83
        jsonGenerator.writeStartArray(keyName);
222
            addValueToArray(value, schemaType);            
84
        jsonGenerator.writeEnd();
223
        } else {
224
            addValueToObject(keyName, value, schemaType);
225
            
226
        }
227
    }
85
    }
228
    
86
    
229
    private void addValueToObject(String keyName, Object value, QName schemaType){
87
    protected void addValueToObject(Level level, String keyName, Object value, QName schemaType){
230
        
88
        
231
        if(value == NULL){
89
        if(value == NULL){
232
            jsonGenerator.writeNull(keyName);            
90
            jsonGenerator.writeNull(keyName);            
Lines 262-268 public class JsonGeneratorRecord extends JsonRecord { Link Here
262
        }
120
        }
263
    }
121
    }
264
    
122
    
265
    private void addValueToArray(Object value, QName schemaType){
123
    protected void addValueToArray(Level level, Object value, QName schemaType){
266
        if(value == NULL){            
124
        if(value == NULL){            
267
            jsonGenerator.writeNull();
125
            jsonGenerator.writeNull();
268
        }else if(value instanceof Integer){
126
        }else if(value instanceof Integer){
(-)a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/JsonRecord.java (-4 / +184 lines)
Lines 12-19 Link Here
12
 ******************************************************************************/
12
 ******************************************************************************/
13
package org.eclipse.persistence.oxm.record;
13
package org.eclipse.persistence.oxm.record;
14
14
15
import java.io.IOException;
16
import java.io.StringWriter;
15
import java.util.List;
17
import java.util.List;
16
18
19
import javax.json.Json;
17
import javax.xml.namespace.QName;
20
import javax.xml.namespace.QName;
18
21
19
import org.eclipse.persistence.exceptions.XMLMarshalException;
22
import org.eclipse.persistence.exceptions.XMLMarshalException;
Lines 39-46 import org.xml.sax.Locator; Link Here
39
import org.xml.sax.SAXException;
42
import org.xml.sax.SAXException;
40
import org.xml.sax.ext.LexicalHandler;
43
import org.xml.sax.ext.LexicalHandler;
41
44
42
public abstract class JsonRecord extends MarshalRecord <XMLMarshaller> {
45
public abstract class JsonRecord<T extends JsonRecord.Level> extends MarshalRecord <XMLMarshaller> {
43
46
47
    protected T position;    
44
    protected CharacterEscapeHandler characterEscapeHandler;
48
    protected CharacterEscapeHandler characterEscapeHandler;
45
    protected String attributePrefix;
49
    protected String attributePrefix;
46
    protected boolean isRootArray;
50
    protected boolean isRootArray;
Lines 60-65 public abstract class JsonRecord extends MarshalRecord <XMLMarshaller> { Link Here
60
        characterEscapeHandler = marshaller.getCharacterEscapeHandler();
64
        characterEscapeHandler = marshaller.getCharacterEscapeHandler();
61
    }
65
    }
62
       
66
       
67
    
68
    @Override
69
    public void startDocument(String encoding, String version) {      
70
        if(isRootArray){
71
            if(position == null){
72
                startCollection();
73
            }
74
            position.setEmptyCollection(false);
75
            
76
            position = createNewLevel(false, position);
77
            
78
            isLastEventStart = true;
79
        }else{            
80
            startRootObject();            
81
        }
82
    }
83
    
84
    protected T createNewLevel(boolean collection, T parentLevel){
85
        return (T)new Level(collection, position);        
86
    }
87
   
88
    protected void startRootObject(){
89
        position = createNewLevel(false, null);        
90
    }
91
    
92
    
93
    @Override    
94
    public void openStartElement(XPathFragment xPathFragment, NamespaceResolver namespaceResolver) {
95
        super.openStartElement(xPathFragment, namespaceResolver);
96
        if(position != null){
97
            T newLevel = createNewLevel(false, position);            
98
            
99
            if(isLastEventStart){                              
100
                //this means 2 startevents in a row so the last this is a complex object
101
                setComplex(position, true);
102
            }
103
                      
104
            String keyName = getKeyName(xPathFragment);
105
           
106
            if(position.isCollection && position.isEmptyCollection() ){
107
                position.setKeyName(keyName);                
108
                startEmptyCollection();
109
            }else{
110
                newLevel.setKeyName(keyName);    
111
            }
112
            position = newLevel;   
113
            isLastEventStart = true;
114
        }
115
    }     
116
    
117
    protected void startEmptyCollection(){}
118
    
119
    /**
120
     * Handle marshal of an empty collection.  
121
     * @param xPathFragment
122
     * @param namespaceResolver
123
     * @param openGrouping if grouping elements should be marshalled for empty collections
124
     * @return
125
     */    
126
    public boolean emptyCollection(XPathFragment xPathFragment, NamespaceResolver namespaceResolver, boolean openGrouping) {
127
128
         if(marshaller.isMarshalEmptyCollections()){
129
             super.emptyCollection(xPathFragment, namespaceResolver, true);
130
             
131
             if (null != xPathFragment) {
132
                 
133
                 if(xPathFragment.isSelfFragment() || xPathFragment.nameIsText()){
134
                     String keyName = position.getKeyName();
135
                     setComplex(position, false);
136
                     writeEmptyCollection((T)position.parentLevel, keyName);
137
                 }else{ 
138
                     if(isLastEventStart){                         
139
                         setComplex(position, true);
140
                     }                 
141
                     String keyName =  getKeyName(xPathFragment);
142
                     if(keyName != null){
143
                         writeEmptyCollection(position, keyName);
144
                     }
145
                 }
146
                 isLastEventStart = false;   
147
             }
148
                  
149
             return true;
150
         }else{
151
             return super.emptyCollection(xPathFragment, namespaceResolver, openGrouping);
152
         }
153
    }
154
      
155
    protected abstract void writeEmptyCollection(T level, String keyName);
156
    
157
    @Override
158
    public void endDocument() {
159
        if(position != null){
160
            finishLevel();          
161
        }
162
    }
163
    
164
    protected void finishLevel(){
165
        position = (T)position.parentLevel; 
166
    }
167
    
168
    public void startCollection() {
169
        if(position == null){
170
             isRootArray = true;              
171
             position = createNewLevel(true, null);
172
             startRootLevelCollection();             
173
        } else {            
174
            if(isLastEventStart){
175
                setComplex((T)position, true);           
176
            }            
177
            position = createNewLevel(true, position); 
178
        }      
179
        isLastEventStart = false;
180
    }
181
    
182
    protected void setComplex(T level, boolean complex){
183
        level.setComplex(complex);
184
    }
185
    
186
    protected abstract void startRootLevelCollection();
187
    
63
    protected String getKeyName(XPathFragment xPathFragment){
188
    protected String getKeyName(XPathFragment xPathFragment){
64
        String keyName = xPathFragment.getLocalName(); 
189
        String keyName = xPathFragment.getLocalName(); 
65
       
190
       
Lines 82-88 public abstract class JsonRecord extends MarshalRecord <XMLMarshaller> { Link Here
82
207
83
        return keyName;
208
        return keyName;
84
    }
209
    }
85
210
   
86
    public void attribute(XPathFragment xPathFragment, NamespaceResolver namespaceResolver,  Object value, QName schemaType){
211
    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){
212
        if(xPathFragment.getNamespaceURI() != null && xPathFragment.getNamespaceURI() == javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI){
88
            return;
213
            return;
Lines 239-246 public abstract class JsonRecord extends MarshalRecord <XMLMarshaller> { Link Here
239
        return false;
364
        return false;
240
    }        
365
    }        
241
    
366
    
242
    public abstract void writeValue(Object value, QName schemaType, boolean isAttribute);
367
   public void writeValue(Object value, QName schemaType, boolean isAttribute) {
243
368
        
369
        if (characterEscapeHandler != null && value instanceof String) {
370
            try {
371
                StringWriter stringWriter = new StringWriter();
372
                characterEscapeHandler.escape(((String)value).toCharArray(), 0, ((String)value).length(), isAttribute, stringWriter);
373
                value = stringWriter.toString();
374
            } catch (IOException e) {
375
                throw XMLMarshalException.marshalException(e);
376
            }
377
        }
378
        
379
        boolean textWrapperOpened = false;                       
380
        if(!isLastEventStart){
381
             openStartElement(textWrapperFragment, namespaceResolver);
382
             textWrapperOpened = true;
383
        }
384
      
385
        T currentLevel = position;
386
        String keyName = position.getKeyName();
387
        if(!position.isComplex){           
388
            currentLevel = (T)position.parentLevel;         
389
        }
390
        addValue(currentLevel, keyName, value, schemaType);
391
        isLastEventStart = false;
392
        if(textWrapperOpened){    
393
             endElement(textWrapperFragment, namespaceResolver);
394
        }    
395
    }
396
   
397
   @Override
398
   public void endElement(XPathFragment xPathFragment,NamespaceResolver namespaceResolver) {
399
       if(position != null){
400
           if(isLastEventStart){
401
               setComplex(position, true);
402
           }
403
           if(position.isComplex){
404
               finishLevel();
405
           }else{
406
               position = (T) position.parentLevel;
407
           }            
408
           isLastEventStart = false;          
409
       }
410
   }
411
   
412
   private void addValue(T currentLevel, String keyName, Object value, QName schemaType){        
413
       if(currentLevel.isCollection()){
414
           addValueToArray(currentLevel, value, schemaType);
415
           currentLevel.setEmptyCollection(false);            
416
       } else {            
417
           addValueToObject(currentLevel, keyName, value, schemaType);            
418
       }
419
   }
420
   protected abstract void addValueToObject(T currentLevel, String keyName, Object value, QName schemaType);
421
422
   protected abstract void addValueToArray(T currentLevel,  Object value, QName schemaType);
423
   
244
    @Override
424
    @Override
245
    public void cdata(String value) {
425
    public void cdata(String value) {
246
        characters(value);        
426
        characters(value);        

Return to bug 411382