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
