HI All,

Thank you chamara and sajith for your valuable suggestions.I have done the
improvement in Jaggery to log the java Object.

improvement
-----------------
1)
https://github.com/wso2/jaggery/blob/master/components/script-engine/org.jaggeryjs.scriptengine/src/main/java/org/jaggeryjs/scriptengine/util/HostObjectUtil.java#L78

Added new code segment as per sajith's suggestion

try{
    return (new ObjectMapper().writeValueAsString(obj));
}catch (Exception e){
    log.debug("Object " + obj.toString() + " of class " +
obj.getClass() + " cannot be converted to JSON");
}

return "{}";


2) https://github.com/wso2/jaggery/blob/master/pom.xml

Added maven dependencies for Jackson data-bind and annotations

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>

3) 
https://github.com/wso2/jaggery/blob/master/components/script-engine/org.jaggeryjs.scriptengine/pom.xml

Added maven dependencies for Jackson data-bind and annotations


I have tried to build(mvn clean install) Jaggery and product-Jaggery
respectively.I can build Jaggery successfully But It has failed when
building product Jaggery at Jaggery - Profile Generation.

As per offline discussion with Niranjan I have added <importBundleDef> and <
*dependency*> for Jackson data-bind and annotation in POM.xml[
https://github.com/wso2/jaggery/blob/master/features/org.jaggeryjs.server.feature/pom.xml]
file as below.

<importBundleDef>com.fasterxml.jackson.core:jackson-databind</importBundleDef>
<importBundleDef>com.fasterxml.jackson.core:jackson-annotations</importBundleDef>


<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
</dependency>


But Still I am getting product Jaggery build fail at the point Jaggery
- Profile Generation,following error can be observe in the command
line.


Installation failed.Cannot complete the install because one or more
required items could not be found.

 Software being installed: uuid Module - Feature 1.4.3
(org.jaggeryjs.modules.uuid.feature.group 1.4.3)
 Missing requirement: jackson-databind 2.0.0 (jackson-databind 2.0.0)
requires 'package com.fasterxml.jackson.core [2.0.0,3.0.0)' but it
could not be found
 Cannot satisfy dependency:
  From: org.jaggeryjs.modules.uuid 1.4.3 (org.jaggeryjs.modules.uuid 1.4.3)
  To: package org.jaggeryjs.scriptengine.exceptions [0.11.0,1.0.0)
 Cannot satisfy dependency:

  From: uuid Module - Feature 1.4.3
(org.jaggeryjs.modules.uuid.feature.group 1.4.3)
  To: org.jaggeryjs.modules.uuid [1.4.3]
 Cannot satisfy dependency:
  From: org.jaggeryjs.scriptengine 0.12.1.SNAPSHOT
(org.jaggeryjs.scriptengine 0.12.1.SNAPSHOT)
  To: package com.fasterxml.jackson.databind [2.0.0,3.0.0)
Application failed, log file location:
/home/rajee/.m2/repository/org/eclipse/tycho/tycho-p2-runtime/0.13.0/eclipse/configuration/1454469448601.log


Can anyone help me to figure out the cause of build fail.Hope I have
included all the steps I have followed.Your help would be appreciated.




On Tue, Feb 2, 2016 at 10:23 AM, Rajeenthini Satkunam <[email protected]>
wrote:

> Hi sajith,
>
> Noted and thank you for the suggestions.
>
> On Mon, Feb 1, 2016 at 11:53 PM, Sajith Ariyarathna <[email protected]>
> wrote:
>
>> Hi Rajeenthini,
>>
>> You are hoping to add the following code snippet to the serializeJSON
>> method [1] of the org.jaggeryjs.scriptengine.util.HostObjectUtil class.
>>
>>>     String JsonString = null;
>>>     try{
>>>         ObjectMapper mapper = new ObjectMapper();
>>>         JsonString = mapper.writeValueAsString(obj);
>>>     }catch (Exception e){
>>>         System.out.println(e.getMessage());
>>>     }
>>>
>>>     return "{\"javaObject\":\"true\",\"object\":\"" + JsonString + "\"}";
>>>
>>> There are few issue in this code snippet.
>>
>>    - Don't catch generic Exception, always catch a specific exception.
>>    In here you should catch JsonProcessingException [2].
>>    - Don't use System.out.println to log exceptions. Instead use a
>>    proper logger. HostObjectUtil class has a log object defined in line
>>    30 [3], you can use that.
>>    - Returning '{"javaObject": "true", "object": "{ ... }"}' string
>>    gives a wrong impression that there are two attributes called 'javaObject'
>>    & 'object' in the logged object. I think just returning the JSON string
>>    will be enough.
>>
>> After corrections (I also took the liberty to reduce no of lines):
>>
>> try {
>>
>> return (new ObjectMapper()).writeValueAsString(obj);
>>
>> } catch (JsonProcessingException e) {
>>
>> log.debug("Object " + obj.toString() + " of class " + obj.getClassName()
>> + " cannot be converted to JSON");
>>
>> }
>>
>> return "{}";
>>
>>
>> [1]
>> https://github.com/wso2/jaggery/blob/master/components/script-engine/org.jaggeryjs.scriptengine/src/main/java/org/jaggeryjs/scriptengine/util/HostObjectUtil.java#L78
>> [2]
>> https://static.javadoc.io/com.fasterxml.jackson.core/jackson-databind/2.6.3/com/fasterxml/jackson/databind/ObjectMapper.html#writeValueAsString(java.lang.Object)
>> [3]
>> https://github.com/wso2/jaggery/blob/master/components/script-engine/org.jaggeryjs.scriptengine/src/main/java/org/jaggeryjs/scriptengine/util/HostObjectUtil.java#L30
>>
>> Thanks.
>>
>>
>> On Mon, Feb 1, 2016 at 8:13 PM, Rajeenthini Satkunam <
>> [email protected]> wrote:
>>
>>> Hi sajith,
>>>
>>> i have added this Student class for example.As for current
>>> implementation goes like this way in Jaggery below.
>>>
>>> public static String serializeJSON(Object obj) {
>>>     if (obj instanceof Wrapper) {
>>>         obj = ((Wrapper) obj).unwrap();
>>>     }
>>>     if (obj == null) {
>>>         return "null";
>>>     }
>>>     if (obj instanceof Undefined) {
>>>         return "null";
>>>     }
>>>     if (obj instanceof Boolean) {
>>>         return Boolean.toString((Boolean) obj);
>>>     }
>>>     if (obj instanceof String) {
>>>         return serializeString((String) obj);
>>>     }
>>>     if (obj instanceof ConsString) {
>>>         return serializeString(obj.toString());
>>>     }
>>>     if (obj instanceof Number) {
>>>         return obj.toString();
>>>     }
>>>     if (obj instanceof XMLObject) {
>>>         return serializeString(serializeXML((ScriptableObject) obj));
>>>     }
>>>     if (obj instanceof NativeObject) {
>>>         return serializeNativeObject((NativeObject) obj);
>>>     }
>>>     if (obj instanceof NativeArray) {
>>>         return serializeNativeArray((NativeArray) obj);
>>>     }
>>>     if (obj instanceof Object[]) {
>>>         return serializeObjectArray((Object[]) obj);
>>>     }
>>>     if (obj instanceof Scriptable) {
>>>         Scriptable object = (Scriptable) obj;
>>>         String jsClass = object.getClassName();
>>>         if ("Date".equals(jsClass)) {
>>>             return serializeString(serializeNativeDate(object));
>>>         } else if ("Error".equals(jsClass)) {
>>>             return serializeString(serializeNativeError(object));
>>>         }
>>>     }
>>>     String JsonString = null;
>>>     try{
>>>         ObjectMapper mapper = new ObjectMapper();
>>>         JsonString = mapper.writeValueAsString(obj);
>>>     }catch (Exception e){
>>>         System.out.println(e.getMessage());
>>>     }
>>>
>>>     return "{\"javaObject\":\"true\",\"object\":\"" + JsonString + "\"}";
>>> }
>>>
>>> AFAIU since we are parsing Object type of argument It is better we can
>>> use ObjectMapper.Correct me If I am wrong.Your suggestion would be more
>>> appreciated.
>>>
>>> On Sun, Jan 31, 2016 at 10:23 AM, Sajith Ariyarathna <[email protected]>
>>> wrote:
>>>
>>>> Hi Rajeenthini,
>>>>
>>>> AFAIK ability to convert a POJO into JSON object does nor affect the
>>>> output of a Jaggery Log of that POJO.
>>>> To get a proper log output for a Java object, you need to implement the
>>>> "toString" method in that Java class. For example in your case,
>>>>
>>>> public class Student {
>>>>
>>>> ...
>>>>
>>>> public String toString() {
>>>>
>>>> return "{name: " + this.name + ", age: " + this.age + ", indexNo: " +
>>>> this.indexNo + "}";
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>> Now you can log a Student object in your Jaggery code as following.
>>>>
>>>> log.info(studentObj.toString());
>>>>
>>>>
>>>> Thanks.
>>>>
>>>>
>>>>
>>>> On Sat, Jan 30, 2016 at 9:28 PM, Rajeenthini Satkunam <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I have worked on writing Jaggery test for Jaggery-Product.I can
>>>>> observe when we tried to log the object it always gives us empty JSON
>>>>> ({}).Currently the implementation goes this way when we try to log java
>>>>> object.
>>>>>
>>>>> So I was trying to get rid of this observed behavior of Jaggery.I have
>>>>> gone through a solution.
>>>>>
>>>>> *using Jackson[1] *
>>>>>
>>>>> We can convert java object to JSON[2] and can log it.
>>>>>
>>>>> I have shared the piece of code I have tried out with Jackson below.
>>>>>
>>>>> *Simple POJO Student class*
>>>>>
>>>>> public class Student {
>>>>>     private int age;
>>>>>     private String name;
>>>>>     private String indexNo;
>>>>>
>>>>>     public int getAge() {
>>>>>         return age;
>>>>>     }
>>>>>
>>>>>     public void setAge(int age) {
>>>>>         this.age = age;
>>>>>     }
>>>>>
>>>>>     public String getName() {
>>>>>         return name;
>>>>>     }
>>>>>
>>>>>     public void setName(String name) {
>>>>>         this.name = name;
>>>>>     }
>>>>>
>>>>>     public String getIndexNo() {
>>>>>         return indexNo;
>>>>>     }
>>>>>
>>>>>     public void setIndexNo(String indexNo) {
>>>>>         this.indexNo = indexNo;
>>>>>     }
>>>>> }
>>>>>
>>>>> *Simple class to test Jackson*
>>>>>
>>>>> import com.fasterxml.jackson.databind.ObjectMapper;
>>>>> import util.Student;
>>>>> public class MyTest {
>>>>>     public static void main(String args[]){
>>>>>         Student st = new Student();
>>>>>         st.setIndexNo("DS001");
>>>>>         st.setAge(12);
>>>>>         st.setName("kareena");
>>>>>         try{
>>>>>             ObjectMapper mapper = new ObjectMapper();
>>>>>             String jsonInString = mapper.writeValueAsString(st);
>>>>>             
>>>>> System.out.println("************************************************");
>>>>>             System.out.println(jsonInString);
>>>>>             
>>>>> System.out.println("************************************************");
>>>>>
>>>>>         }catch(Exception e){
>>>>>             System.out.print("Exception caught  "+ e);
>>>>>         }
>>>>>
>>>>>     }
>>>>> }
>>>>>
>>>>> Actual output by above code.
>>>>> ************************************************
>>>>> {"age":12,"name":"kareena","indexNo":"DS001"}
>>>>> ************************************************
>>>>>
>>>>> I have added a dependency in the POM.xml
>>>>>
>>>>> <dependency>
>>>>>     <groupId>com.fasterxml.jackson.core</groupId>
>>>>>     <artifactId>jackson-databind</artifactId>
>>>>>     <version>2.6.3</version>
>>>>> </dependency>
>>>>>
>>>>>
>>>>> IMHO we can use the same scenario in case of log JAVA object.Your help
>>>>> and suggestions are more appreciated and guide me if I am wrong or I can
>>>>> have better solution than this.
>>>>>
>>>>> [1] - https://github.com/FasterXML/jackson-databind
>>>>> [2] -
>>>>> http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/
>>>>> --
>>>>>
>>>>> *Thank You.*
>>>>>
>>>>> *Rajeenthini Satkunam*
>>>>>
>>>>> *Associate Software Engineer | WSO2*
>>>>>
>>>>>
>>>>> *E:[email protected] <[email protected]>*
>>>>>
>>>>> *M :+94770832823 <%2B94770832823>   *
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Dev mailing list
>>>>> [email protected]
>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Sajith Ariyarathna
>>>> Software Engineer; WSO2, Inc.;  http://wso2.com/
>>>> mobile: +94 77 6602284, +94 71 3951048
>>>>
>>>
>>>
>>>
>>> --
>>>
>>> *Thank You.*
>>>
>>> *Rajeenthini Satkunam*
>>>
>>> *Associate Software Engineer | WSO2*
>>>
>>>
>>> *E:[email protected] <[email protected]>*
>>>
>>> *M :+94770832823 <%2B94770832823>   *
>>>
>>>
>>
>>
>> --
>> Sajith Ariyarathna
>> Software Engineer; WSO2, Inc.;  http://wso2.com/
>>
>
>
>
> --
>
> *Thank You.*
>
> *Rajeenthini Satkunam*
>
> *Associate Software Engineer | WSO2*
>
>
> *E:[email protected] <[email protected]>*
>
> *M :+94770832823 <%2B94770832823>   *
>
>


-- 

*Thank You.*

*Rajeenthini Satkunam*

*Associate Software Engineer | WSO2*


*E:[email protected] <[email protected]>*

*M :+94770832823   *
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to