Changeset 3115


Ignore:
Timestamp:
02/02/12 21:05:37 (4 months ago)
Author:
kasper
Message:

Changed the JSON creation to be based on a single column, to make it possible to create eg. a single (un-nested) JSON array or value.

Location:
AnalyzerBeans/trunk
Files:
1 edited
4 moved

Legend:

Unmodified
Added
Removed
  • AnalyzerBeans/trunk/components/json/src/main/java/org/eobjects/analyzer/beans/CreateJsonTransformer.java

    r3112 r3115  
    2020package org.eobjects.analyzer.beans; 
    2121 
    22 import java.io.IOException; 
    23 import java.util.LinkedHashMap; 
    24 import java.util.Map; 
    25  
    26 import org.codehaus.jackson.JsonGenerationException; 
    27 import org.codehaus.jackson.map.JsonMappingException; 
    2822import org.codehaus.jackson.map.ObjectMapper; 
    2923import org.eobjects.analyzer.beans.api.Configured; 
     
    3529import org.eobjects.analyzer.data.InputRow; 
    3630 
    37  
    3831@TransformerBean("Create JSON document") 
    3932@Description("Joins several columns into a single JSON document.") 
    40 public class JsonCreatorTransformer implements Transformer<String> { 
     33public class CreateJsonTransformer implements Transformer<String> { 
    4134 
    4235        @Configured 
    43         InputColumn<?>[] columns; 
     36        InputColumn<?> data; 
    4437 
    4538        private final ObjectMapper mapper = new ObjectMapper(); 
    4639 
    47         public JsonCreatorTransformer() { 
     40        public CreateJsonTransformer() { 
    4841        } 
    4942 
    50         public JsonCreatorTransformer(InputColumn<?>... columns) { 
    51                 this.columns = columns; 
     43        public CreateJsonTransformer(InputColumn<?> data) { 
     44                this.data = data; 
    5245        } 
    5346 
    5447        @Override 
    5548        public OutputColumns getOutputColumns() { 
    56                 StringBuilder sb = new StringBuilder("JSON document of "); 
    57                 for (int i = 0; i < columns.length; i++) { 
    58                         if (i != 0) { 
    59                                 sb.append(","); 
    60                         } 
    61                         sb.append(columns[i].getName()); 
    62                         if (i == 4) { 
    63                                 sb.append("..."); 
    64                                 // only include a preview of columns in the default name 
    65                                 break; 
    66                         } 
    67                 } 
    68                 return new OutputColumns(sb.toString()); 
     49                return new OutputColumns(data.getName() + " (as JSON)"); 
    6950        } 
    7051 
    7152        @Override 
    7253        public String[] transform(InputRow row) { 
    73                 Map<String, Object> map = new LinkedHashMap<String, Object>(); 
    74                 for (InputColumn<?> inputColumn : columns) { 
    75                         Object value = row.getValue(inputColumn); 
    76                         String key = inputColumn.getName(); 
    77                         map.put(key, value); 
     54                try { 
     55                        Object value = row.getValue(data); 
     56                        final String json = mapper.writeValueAsString(value); 
     57                        return new String[] { json }; 
     58                } catch (Exception e) { 
     59                        throw new IllegalStateException( 
     60                                        "Exception while creating JSON representation", e); 
    7861                } 
    79                 String json = null; 
    80                 try { 
    81                         json = mapper.writeValueAsString(map); 
    82                 } catch (JsonGenerationException e) { 
    83                         throw new IllegalStateException("Exception while generating Json."); 
    84                 } catch (JsonMappingException e) { 
    85                         throw new IllegalStateException("Exception while Json mapping."); 
    86                 } catch (IOException e) { 
    87                         throw new IllegalStateException("IOException while Json mapping."); 
    88                 } 
    89                 return new String[] { json }; 
    9062        } 
    9163 
  • AnalyzerBeans/trunk/components/json/src/main/java/org/eobjects/analyzer/beans/ParseJsonTransformer.java

    r3112 r3115  
    3838@TransformerBean("Parse JSON document") 
    3939@Description("Extract values from a JSON document") 
    40 public class ExtractJsonValuesTransformer implements 
     40public class ParseJsonTransformer implements 
    4141                Transformer<Map<String, ?>> { 
    4242 
     
    4646        private InputColumn<String> json; 
    4747 
    48         public ExtractJsonValuesTransformer() { 
     48        public ParseJsonTransformer() { 
    4949 
    5050        } 
    5151 
    52         public ExtractJsonValuesTransformer(InputColumn<String> json) { 
     52        public ParseJsonTransformer(InputColumn<String> json) { 
    5353                this.json = json; 
    5454        } 
  • AnalyzerBeans/trunk/components/json/src/test/java/org/eobjects/analyzer/beans/CreateJsonTransformerTest.java

    r3111 r3115  
    2424import java.util.ArrayList; 
    2525import java.util.HashMap; 
     26import java.util.LinkedHashMap; 
    2627import java.util.List; 
    2728import java.util.Map; 
     
    3233import org.junit.Test; 
    3334 
    34 public class JsonCreatorTransformerTest { 
     35public class CreateJsonTransformerTest { 
    3536 
    36     @Test 
    37     public void testStringColumnsToJson() { 
    38         InputColumn<String> col1 = new MockInputColumn<String>("name", String.class); 
    39         InputColumn<String> col2 = new MockInputColumn<String>("country", String.class); 
    40         JsonCreatorTransformer jsonTransformer = new JsonCreatorTransformer(col1, col2); 
    41         assertEquals(1, jsonTransformer.getOutputColumns().getColumnCount()); 
    42          
    43         String[] jsonDocs = jsonTransformer.transform(new MockInputRow().put(col1, "shekhar").put(col2, "India")); 
    44         assertEquals(1, jsonDocs.length); 
    45         assertEquals("{\"name\":\"shekhar\",\"country\":\"India\"}", jsonDocs[0]); 
    46     } 
    47      
    48     @Test 
    49         public void testStringAndMapColumnsToJson() throws Exception { 
    50         InputColumn<String> col1 = new MockInputColumn<String>("name", String.class); 
    51         InputColumn<String> col2 = new MockInputColumn<String>("country", String.class); 
    52         Map<String, String> stringMap = new HashMap<String,String>(); 
    53         stringMap.put("GivenName", "Ankit"); 
    54         stringMap.put("FamilyName", "Kumar"); 
    55         InputColumn<Map> col3 = new MockInputColumn<Map>("NamesMap", Map.class); 
    56         JsonCreatorTransformer jsonTransformer = new JsonCreatorTransformer(col1, col2, col3); 
    57         assertEquals(1, jsonTransformer.getOutputColumns().getColumnCount()); 
    58          
    59         String[] jsonDocs = jsonTransformer.transform(new MockInputRow().put(col1, "shekhar").put(col2, "India").put(col3, stringMap)); 
    60         assertEquals(1, jsonDocs.length); 
    61         assertEquals("{\"name\":\"shekhar\",\"country\":\"India\",\"NamesMap\":{\"GivenName\":\"Ankit\",\"FamilyName\":\"Kumar\"}}", jsonDocs[0]); 
     37        @Test 
     38        public void testCreateSimpleJsonOfDataTypes() throws Exception { 
     39 
    6240        } 
    63      
    64     @Test 
     41 
     42        @Test 
     43        public void testSimpleMapToJson() { 
     44                Map<String, Object> map = new LinkedHashMap<String, Object>(); 
     45                map.put("name", "shekhar"); 
     46                map.put("country", "India"); 
     47 
     48                InputColumn<Map<?, ?>> col = new MockInputColumn<Map<?, ?>>("map", 
     49                                MockInputColumn.MAP_CLASS); 
     50                CreateJsonTransformer jsonTransformer = new CreateJsonTransformer(col); 
     51                assertEquals(1, jsonTransformer.getOutputColumns().getColumnCount()); 
     52 
     53                String[] jsonDocs = jsonTransformer.transform(new MockInputRow().put( 
     54                                col, map)); 
     55                assertEquals(1, jsonDocs.length); 
     56                assertEquals("{\"name\":\"shekhar\",\"country\":\"India\"}", 
     57                                jsonDocs[0]); 
     58        } 
     59 
     60        @Test 
     61        public void testSimpleList() throws Exception { 
     62                List<String> list = new ArrayList<String>(); 
     63                list.add("hello"); 
     64                list.add("world"); 
     65 
     66                InputColumn<List<?>> col = new MockInputColumn<List<?>>("list", 
     67                                MockInputColumn.LIST_CLASS); 
     68 
     69                CreateJsonTransformer jsonTransformer = new CreateJsonTransformer(col); 
     70                assertEquals(1, jsonTransformer.getOutputColumns().getColumnCount()); 
     71 
     72                String[] jsonDocs = jsonTransformer.transform(new MockInputRow().put( 
     73                                col, list)); 
     74                assertEquals(1, jsonDocs.length); 
     75                assertEquals("[\"hello\",\"world\"]", jsonDocs[0]); 
     76        } 
     77 
     78        @Test 
    6579        public void testComplexCollectionColumnsToJson() throws Exception { 
    66         InputColumn<String> col1 = new MockInputColumn<String>("name", String.class); 
    67         InputColumn<String> col2 = new MockInputColumn<String>("country", String.class); 
    68         Map<String, String> namesMap = new HashMap<String,String>(); 
    69         namesMap.put("GivenName", "Ankit"); 
    70         namesMap.put("FamilyName", "Kumar"); 
    71         List<Map<String,String>> addresses = new ArrayList<Map<String, String>>(); 
    72         InputColumn<List> col3 = new MockInputColumn<List>("address", List.class); 
    73         Map<String, String> addressMap1 = new HashMap<String,String>(); 
    74         addressMap1.put("Street", "Utrechtseweg"); 
    75         addressMap1.put("HouseNumber", "310"); 
    76         addressMap1.put("City", "Arnhem"); 
    77         addressMap1.put("Postcode", "6812AR"); 
    78         addressMap1.put("Country", "Netherlands"); 
    79         Map<String, String> addressMap2 = new HashMap<String,String>(); 
    80         addressMap2.put("Street", "Silversteyn"); 
    81         addressMap2.put("HouseNumber", "893"); 
    82         addressMap2.put("City", "Arnhem"); 
    83         addressMap2.put("Postcode", "6812AB"); 
    84         addressMap2.put("Country", "Netherlands"); 
    85         addresses.add(addressMap1); 
    86         addresses.add(addressMap2); 
    87         JsonCreatorTransformer jsonTransformer = new JsonCreatorTransformer(col1, col2, col3); 
    88         assertEquals(1, jsonTransformer.getOutputColumns().getColumnCount()); 
    89          
    90         String[] jsonDocs = jsonTransformer.transform(new MockInputRow().put(col1, "shekhar").put(col2, "India").put(col3, addresses)); 
    91         assertEquals(1, jsonDocs.length); 
    92         assertEquals("{\"name\":\"shekhar\",\"country\":\"India\",\"address\":[{\"Postcode\":\"6812AR\",\"Street\":\"Utrechtseweg\",\"HouseNumber\":\"310\",\"Country\":\"Netherlands\",\"City\":\"Arnhem\"},{\"Postcode\":\"6812AB\",\"Street\":\"Silversteyn\",\"HouseNumber\":\"893\",\"Country\":\"Netherlands\",\"City\":\"Arnhem\"}]}", jsonDocs[0]); 
     80                Map<String, String> namesMap = new HashMap<String, String>(); 
     81                namesMap.put("GivenName", "Ankit"); 
     82                namesMap.put("FamilyName", "Kumar"); 
     83                List<Map<String, String>> addresses = new ArrayList<Map<String, String>>(); 
     84                Map<String, String> addressMap1 = new HashMap<String, String>(); 
     85                addressMap1.put("Street", "Utrechtseweg"); 
     86                addressMap1.put("HouseNumber", "310"); 
     87                addressMap1.put("City", "Arnhem"); 
     88                addressMap1.put("Postcode", "6812AR"); 
     89                addressMap1.put("Country", "Netherlands"); 
     90                Map<String, String> addressMap2 = new HashMap<String, String>(); 
     91                addressMap2.put("Street", "Silversteyn"); 
     92                addressMap2.put("HouseNumber", "893"); 
     93                addressMap2.put("City", "Arnhem"); 
     94                addressMap2.put("Postcode", "6812AB"); 
     95                addressMap2.put("Country", "Netherlands"); 
     96                addresses.add(addressMap1); 
     97                addresses.add(addressMap2); 
     98 
     99                Map<String, Object> map = new LinkedHashMap<String, Object>(); 
     100                map.put("name", namesMap); 
     101                map.put("addresses", addresses); 
     102                map.put("country", "India"); 
     103 
     104                InputColumn<Map<?, ?>> col = new MockInputColumn<Map<?, ?>>("name", 
     105                                MockInputColumn.MAP_CLASS); 
     106                CreateJsonTransformer jsonTransformer = new CreateJsonTransformer(col); 
     107                assertEquals(1, jsonTransformer.getOutputColumns().getColumnCount()); 
     108 
     109                String[] jsonDocs = jsonTransformer.transform(new MockInputRow().put( 
     110                                col, map)); 
     111                assertEquals(1, jsonDocs.length); 
     112                assertEquals( 
     113                                "{'name':{'GivenName':'Ankit','FamilyName':'Kumar'}," 
     114                                                + "'addresses':[{'Postcode':'6812AR','Street':'Utrechtseweg','HouseNumber':'310','Country':'Netherlands','City':'Arnhem'}," 
     115                                                + "{'Postcode':'6812AB','Street':'Silversteyn','HouseNumber':'893','Country':'Netherlands','City':'Arnhem'}],'country':'India'}", 
     116                                jsonDocs[0].replaceAll("\"", "'")); 
    93117        } 
    94118 
  • AnalyzerBeans/trunk/components/json/src/test/java/org/eobjects/analyzer/beans/ParseJsonTransformerTest.java

    r3111 r3115  
    3131import org.junit.Test; 
    3232 
    33 public class ExtractJsonValuesTransformerTest { 
     33public class ParseJsonTransformerTest { 
    3434 
    3535        @Test 
     
    3737                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    3838                                String.class); 
    39                 ExtractJsonValuesTransformer transformer = new ExtractJsonValuesTransformer( 
     39                ParseJsonTransformer transformer = new ParseJsonTransformer( 
    4040                                col1); 
    4141                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
     
    5454                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    5555                                String.class); 
    56                 ExtractJsonValuesTransformer transformer = new ExtractJsonValuesTransformer( 
     56                ParseJsonTransformer transformer = new ParseJsonTransformer( 
    5757                                col1); 
    5858                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
     
    7575                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    7676                                String.class); 
    77                 ExtractJsonValuesTransformer transformer = new ExtractJsonValuesTransformer( 
     77                ParseJsonTransformer transformer = new ParseJsonTransformer( 
    7878                                col1); 
    7979                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
     
    8787                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    8888                                String.class); 
    89                 ExtractJsonValuesTransformer transformer = new ExtractJsonValuesTransformer( 
     89                ParseJsonTransformer transformer = new ParseJsonTransformer( 
    9090                                col1); 
    9191                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
     
    102102 
    103103                assertTrue(map.get("addresses") instanceof List); 
    104                 List addresses = (List) map.get("addresses"); 
     104                 
     105                List<?> addresses = (List<?>) map.get("addresses"); 
     106                 
    105107                assertTrue(addresses.get(0) instanceof Map); 
    106108                assertTrue(map.get("emails") instanceof List); 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/data/MockInputColumn.java

    r3103 r3115  
    2020package org.eobjects.analyzer.data; 
    2121 
     22import java.util.List; 
     23import java.util.Map; 
     24 
    2225import org.eobjects.metamodel.schema.Column; 
    2326 
     
    3336 
    3437        private static final long serialVersionUID = 1L; 
     38 
     39        @SuppressWarnings("unchecked") 
     40        public static final Class<? extends Map<?, ?>> MAP_CLASS = (Class<? extends Map<?, ?>>) Map.class; 
     41         
     42        @SuppressWarnings("unchecked") 
     43        public static final Class<? extends List<?>> LIST_CLASS = (Class<? extends List<?>>) List.class; 
    3544 
    3645        private String _name; 
Note: See TracChangeset for help on using the changeset viewer.