Hi Shameera,

Since I'm in dev service, didn't have much time to work on this. I have
created unit test cases for this scenario and attached the new diff.

Thanks,

On Mon, Sep 29, 2014 at 7:16 AM, Shameera Rathnayaka <shameerai...@gmail.com
> wrote:

> Hi Rajith,
>
> Unfortunately, for me there is no way to test above patch, if you could
> attach a patch for current axis2 trunk then I can have a look. I tried with
> the attached patch with axis2 trunk it gave me conflicts. And it is good to
> add an integration test to cover this improvement then we won't break this
> in future.
>
> Regards,
> Shameera.
>
> On Mon, Sep 29, 2014 at 12:11 AM, Rajith Vitharana <raji...@wso2.com>
> wrote:
>
>> ping
>>
>> On Tue, Sep 23, 2014 at 3:12 PM, Rajith Vitharana <raji...@wso2.com>
>> wrote:
>>
>>> Hi All,
>>>
>>> Regarding the jira [1].
>>> In DSS when using json output mapping we can filter out the output
>>> fields according to the person's role who invokes the service. If he have
>>> permission, those fields will be visible to them. If he doesn't have
>>> permission, only other fields will be visible to him. This is explained in
>>> [2]
>>>
>>> But as the jira says, this feature doesn't work in standalone pack.
>>> In wsdl file of the data service, these fields are marked as optional by
>>> adding 'minOccurs="0"' attribute. But the "GsonXMLStreamWriter.java" class
>>> in "axis2-json" module doesn't consider this "minOccurs" attribute when
>>> converting the xml output to json. This causes the error mentioned in the
>>> jira [1].
>>> I have changed the source to avoid this situation and consider the
>>> "minOccurs" attribute when doing the conversion part. Is this the better
>>> way of resolving this problem? If so please review the code and commit to
>>> kernel patch 009.
>>>
>>> [1] - https://wso2.org/jira/browse/DS-963
>>> [2] - https://docs.wso2.com/display/DSS321/JSON+Mapping
>>>
>>> Thanks
>>>
>>> --
>>> Rajith Vitharana
>>>
>>> Software Engineer,
>>> WSO2 Inc. : wso2.com
>>> Mobile : +94715883223
>>> Blog : http://lankavitharana.blogspot.com/
>>>
>>
>>
>>
>> --
>> Rajith Vitharana
>>
>> Software Engineer,
>> WSO2 Inc. : wso2.com
>> Mobile : +94715883223
>> Blog : http://lankavitharana.blogspot.com/
>>
>
>
>
> --
> Best Regards,
> Shameera Rathnayaka.
>
> email: shameera AT apache.org , shameerainfo AT gmail.com
> Blog : http://shameerarathnayaka.blogspot.com/
>



-- 
Rajith Vitharana

Software Engineer,
WSO2 Inc. : wso2.com
Mobile : +94715883223
Blog : http://lankavitharana.blogspot.com/
Index: src/org/apache/axis2/json/gson/GsonXMLStreamWriter.java
===================================================================
--- src/org/apache/axis2/json/gson/GsonXMLStreamWriter.java     (revision 
207992)
+++ src/org/apache/axis2/json/gson/GsonXMLStreamWriter.java     (working copy)
@@ -131,7 +131,11 @@
     private void writeStartJson(JsonObject jsonObject) throws IOException {
 
         if (jsonObject.getType() == JSONType.OBJECT) {
-            jsonWriter.name(jsonObject.getName());
+            try {
+                jsonWriter.name(jsonObject.getName());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
         } else if (jsonObject.getType() == JSONType.ARRAY) {
             jsonWriter.name(jsonObject.getName());
             jsonWriter.beginArray();
@@ -208,6 +212,11 @@
             if (miniStack.isEmpty()) {
                 if (!queue.isEmpty()) {
                     JsonObject queObj = queue.peek();
+                    if (!queObj.getName().equals(localName) && 
queObj.getMinOccurs() == 0
+                            && (stack.isEmpty() || 
!stack.peek().getName().equals(localName))){
+                        queue.poll();
+                        queObj = queue.peek();
+                    }
                     if (queObj.getName().equals(localName)) {
                         if (flushObject != null) {
                             if (topNestedArrayObj != null && 
flushObject.getType() == JSONType.NESTED_ARRAY
Index: src/org/apache/axis2/json/gson/factory/JsonObject.java
===================================================================
--- src/org/apache/axis2/json/gson/factory/JsonObject.java      (revision 
207992)
+++ src/org/apache/axis2/json/gson/factory/JsonObject.java      (working copy)
@@ -25,6 +25,7 @@
     private JSONType type;
     private String valueType;
     private String namespaceUri;
+    private long minOccurs;
 
     public JsonObject(String name, JSONType type, String valueType , String 
namespaceUri) {
         this.name = name;
@@ -48,4 +49,12 @@
     public String getNamespaceUri() {
         return namespaceUri;
     }
+
+    public void setMinOccurs(long minOccurs) {
+        this.minOccurs = minOccurs;
+    }
+
+    public long getMinOccurs() {
+        return minOccurs;
+    }
 }
Index: src/org/apache/axis2/json/gson/factory/XmlNode.java
===================================================================
--- src/org/apache/axis2/json/gson/factory/XmlNode.java (revision 207992)
+++ src/org/apache/axis2/json/gson/factory/XmlNode.java (working copy)
@@ -30,6 +30,7 @@
     private List<XmlNode> childrenList = new ArrayList<XmlNode>();
     private String valueType;
     private String namespaceUri;
+    private long minOccurs;
 
     public XmlNode(String name,String namespaceUri, boolean attribute, boolean 
array , String valueType) {
         this.name = name;
@@ -68,4 +69,12 @@
     public String getNamespaceUri() {
         return namespaceUri;
     }
+
+    public void setMinOccurs(long minOccurs) {
+        this.minOccurs = minOccurs;
+    }
+
+    public long getMinOccurs() {
+        return minOccurs;
+    }
 }
Index: src/org/apache/axis2/json/gson/factory/XmlNodeGenerator.java
===================================================================
--- src/org/apache/axis2/json/gson/factory/XmlNodeGenerator.java        
(revision 207992)
+++ src/org/apache/axis2/json/gson/factory/XmlNodeGenerator.java        
(working copy)
@@ -90,6 +90,7 @@
         QName refName = element.getRefName();
         if (schemaTypeName != null) {
             xmlNode = new XmlNode(element.getName(), targetNamespace, false, 
(element.getMaxOccurs() != 1), schemaTypeName.getLocalPart());
+            xmlNode.setMinOccurs(element.getMinOccurs());
             parentNode.addChildToList(xmlNode);
             if 
(("http://www.w3.org/2001/XMLSchema";).equals(schemaTypeName.getNamespaceURI())) 
{
             } else {
@@ -106,6 +107,7 @@
             }
         }else if (schemaType != null) {
             xmlNode = new XmlNode(element.getName(), targetNamespace, false, 
(element.getMaxOccurs() != 1), schemaType.getQName().getLocalPart());
+            xmlNode.setMinOccurs(element.getMinOccurs());
             parentNode.addChildToList(xmlNode);
             processSchemaType(schemaType, xmlNode, schema);
         }else if (refName != null) {
@@ -175,17 +177,25 @@
     private void generateQueue(XmlNode node) {
         if (node.isArray()) {
             if (node.getChildrenList().size() > 0) {
-                queue.add(new JsonObject(node.getName(), 
JSONType.NESTED_ARRAY, node.getValueType() , node.getNamespaceUri()));
+                JsonObject obj = new JsonObject(node.getName(), 
JSONType.NESTED_ARRAY, node.getValueType() , node.getNamespaceUri());
+                obj.setMinOccurs(node.getMinOccurs());
+                queue.add(obj);
                 processXmlNodeChildren(node.getChildrenList());
             } else {
-                queue.add(new JsonObject(node.getName(), JSONType.ARRAY , 
node.getValueType() , node.getNamespaceUri()));
+                JsonObject obj = new JsonObject(node.getName(), JSONType.ARRAY 
, node.getValueType() , node.getNamespaceUri());
+                obj.setMinOccurs(node.getMinOccurs());
+                queue.add(obj);
             }
         } else {
             if (node.getChildrenList().size() > 0) {
-                queue.add(new JsonObject(node.getName(), 
JSONType.NESTED_OBJECT, node.getValueType() , node.getNamespaceUri()));
+                JsonObject obj = new JsonObject(node.getName(), 
JSONType.NESTED_OBJECT, node.getValueType() , node.getNamespaceUri());
+                obj.setMinOccurs(node.getMinOccurs());
+                queue.add(obj);
                 processXmlNodeChildren(node.getChildrenList());
             } else {
-                queue.add(new JsonObject(node.getName(), JSONType.OBJECT , 
node.getValueType() , node.getNamespaceUri()));
+                JsonObject obj = new JsonObject(node.getName(), 
JSONType.OBJECT , node.getValueType() , node.getNamespaceUri());
+                obj.setMinOccurs(node.getMinOccurs());
+                queue.add(obj);
             }
         }
     }
Index: test/org/apache/axis2/json/gson/GsonXMLStreamWriterTest.java
===================================================================
--- test/org/apache/axis2/json/gson/GsonXMLStreamWriterTest.java        
(revision 207992)
+++ test/org/apache/axis2/json/gson/GsonXMLStreamWriterTest.java        
(working copy)
@@ -68,6 +68,26 @@
         String actualString = baos.toString();
         outputStreamWriter.close();
         Assert.assertEquals(jsonString, actualString);
+
+
+        //test for when we have elements which may or may not included in the 
output
+        //for those kinds of elements, wsdl file includes attribute "minOccurs"
+        //so if "minOccurs" is 0 then that element may not be in the output 
xml document.
+        //so those kinds of outputs should be converted to json successfully
+        //this is the test for that
+        ByteArrayOutputStream baosFormo = new ByteArrayOutputStream();
+        OutputStreamWriter outputStreamWriterFormo = new 
OutputStreamWriter(baosFormo, "UTF-8");
+        JsonWriter jsonWriterFormo = new JsonWriter(outputStreamWriterFormo);
+
+        GsonXMLStreamWriter gsonXMLStreamWriterFormo = new 
GsonXMLStreamWriter(jsonWriterFormo, elementQName, schemaList, configCtxt);
+        OMElement omElementFormo = getResponseOMElementFormo();
+        gsonXMLStreamWriterFormo.writeStartDocument();
+        omElementFormo.serialize(gsonXMLStreamWriterFormo);
+        gsonXMLStreamWriterFormo.writeEndDocument();
+
+        String actualStringFormo = baosFormo.toString();
+        outputStreamWriterFormo.close();
+        
Assert.assertEquals("{\"response\":{\"return\":{\"age\":\"35\",\"gender\":\"female\"}}}",
 actualStringFormo);
     }
 
 
@@ -89,4 +109,20 @@
         response.addChild(ret);
         return response;
     }
+
+    private OMElement getResponseOMElementFormo() {
+        OMFactory omFactory = OMAbstractFactory.getOMFactory();
+        OMNamespace ns = omFactory.createOMNamespace("", "");
+
+        OMElement response = omFactory.createOMElement("response", ns);
+        OMElement ret = omFactory.createOMElement("return", ns);
+        OMElement age = omFactory.createOMElement("age", ns);
+        age.setText("35");
+        OMElement gender = omFactory.createOMElement("gender", ns);
+        gender.setText("female");
+        ret.addChild(age);
+        ret.addChild(gender);
+        response.addChild(ret);
+        return response;
+    }
 }
Index: test-resources/custom_schema/testSchema_1.xsd
===================================================================
--- test-resources/custom_schema/testSchema_1.xsd       (revision 207992)
+++ test-resources/custom_schema/testSchema_1.xsd       (working copy)
@@ -35,7 +35,7 @@
 
     <xs:complexType name="Person">
         <xs:sequence>
-            <xs:element name="name" type="xs:string"/>
+            <xs:element name="name" type="xs:string" minOccurs="0"/>
             <xs:element name="age" type="xs:string"/>
             <xs:element name="gender" type="xs:string"/>
         </xs:sequence>
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to