Changeset 3117


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

further improvements to JSON transformers

Location:
AnalyzerBeans/trunk
Files:
5 edited

Legend:

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

    r3115 r3117  
    2020package org.eobjects.analyzer.beans; 
    2121 
     22import javax.inject.Inject; 
     23 
    2224import org.codehaus.jackson.map.ObjectMapper; 
     25import org.eobjects.analyzer.beans.api.Categorized; 
    2326import org.eobjects.analyzer.beans.api.Configured; 
    2427import org.eobjects.analyzer.beans.api.Description; 
     
    2629import org.eobjects.analyzer.beans.api.Transformer; 
    2730import org.eobjects.analyzer.beans.api.TransformerBean; 
     31import org.eobjects.analyzer.beans.categories.DataStructuresCategory; 
    2832import org.eobjects.analyzer.data.InputColumn; 
    2933import org.eobjects.analyzer.data.InputRow; 
    3034 
    3135@TransformerBean("Create JSON document") 
    32 @Description("Joins several columns into a single JSON document.") 
     36@Description("Creates a representation of a data structure as a JSON (JavaScript Object Notation) document") 
     37@Categorized(DataStructuresCategory.class) 
    3338public class CreateJsonTransformer implements Transformer<String> { 
    3439 
     40        @Inject 
    3541        @Configured 
     42        @Description("Column containing data structures to format") 
    3643        InputColumn<?> data; 
    3744 
  • AnalyzerBeans/trunk/components/json/src/main/java/org/eobjects/analyzer/beans/ParseJsonTransformer.java

    r3115 r3117  
    2020package org.eobjects.analyzer.beans; 
    2121 
    22 import java.io.IOException; 
    23 import java.util.Collections; 
    2422import java.util.Map; 
    2523 
     24import javax.inject.Inject; 
     25 
    2626import org.apache.commons.lang.StringUtils; 
    27 import org.codehaus.jackson.JsonParseException; 
    28 import org.codehaus.jackson.map.JsonMappingException; 
    2927import org.codehaus.jackson.map.ObjectMapper; 
     28import org.eobjects.analyzer.beans.api.Categorized; 
    3029import org.eobjects.analyzer.beans.api.Configured; 
    3130import org.eobjects.analyzer.beans.api.Description; 
     
    3332import org.eobjects.analyzer.beans.api.Transformer; 
    3433import org.eobjects.analyzer.beans.api.TransformerBean; 
     34import org.eobjects.analyzer.beans.categories.DataStructuresCategory; 
    3535import org.eobjects.analyzer.data.InputColumn; 
    3636import org.eobjects.analyzer.data.InputRow; 
    3737 
    3838@TransformerBean("Parse JSON document") 
    39 @Description("Extract values from a JSON document") 
    40 public class ParseJsonTransformer implements 
    41                 Transformer<Map<String, ?>> { 
     39@Description("Parses a JSON document and materializes the data structure it represents") 
     40@Categorized(DataStructuresCategory.class) 
     41public class ParseJsonTransformer implements Transformer<Object> { 
    4242 
    4343        private final ObjectMapper mapper = new ObjectMapper(); 
    4444 
    45         @Configured 
    46         private InputColumn<String> json; 
     45        @Inject 
     46        @Configured(order = 1) 
     47        @Description("Column containing JSON documents to parse") 
     48        InputColumn<String> json; 
     49 
     50        @Inject 
     51        @Configured(order = 2) 
     52        Class<?> dataType = Map.class; 
    4753 
    4854        public ParseJsonTransformer() { 
     
    5662        @Override 
    5763        public OutputColumns getOutputColumns() { 
    58                 return new OutputColumns(json.getName() + " (as Map)"); 
     64                String[] names = new String[] { json.getName() + " (as Map)" }; 
     65                Class<?>[] types = new Class[] { dataType }; 
     66                return new OutputColumns(names, types); 
    5967        } 
    6068 
    61         @SuppressWarnings("unchecked") 
    6269        @Override 
    63         public Map<String, ?>[] transform(InputRow inputRow) { 
     70        public Object[] transform(InputRow inputRow) { 
    6471                final String jsonString = inputRow.getValue(json); 
    65  
     72                final Object result; 
    6673                if (StringUtils.isBlank(jsonString)) { 
    67                         return new Map[] { Collections.emptyMap() }; 
     74                        result = null; 
     75                } else { 
     76                        try { 
     77                                result = mapper.readValue(jsonString, dataType); 
     78                        } catch (Exception e) { 
     79                                throw new IllegalStateException( 
     80                                                "Exception occurred while parsing JSON", e); 
     81                        } 
    6882                } 
    6983 
    70                 Map<String, Object> jsonMap = Collections.emptyMap(); 
    71                 try { 
    72                         jsonMap = mapper.readValue(jsonString, Map.class); 
    73                 } catch (JsonParseException e) { 
    74                         throw new IllegalStateException("Exception while parsing Json."); 
    75                 } catch (JsonMappingException e) { 
    76                         throw new IllegalStateException("Exception while Json mapping."); 
    77                 } catch (IOException e) { 
    78                         throw new IllegalStateException("IOException while parsing Json."); 
    79                 } 
    80                 final Map<String, ?>[] result = new Map[] { jsonMap }; 
    81                 return result; 
     84                return new Object[] { result }; 
    8285        } 
    8386} 
  • AnalyzerBeans/trunk/components/json/src/test/java/org/eobjects/analyzer/beans/ParseJsonTransformerTest.java

    r3115 r3117  
    2121 
    2222import static org.junit.Assert.assertEquals; 
     23import static org.junit.Assert.assertNull; 
    2324import static org.junit.Assert.assertTrue; 
    2425 
     
    3738                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    3839                                String.class); 
    39                 ParseJsonTransformer transformer = new ParseJsonTransformer( 
    40                                 col1); 
     40                ParseJsonTransformer transformer = new ParseJsonTransformer(col1); 
    4141                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
    4242 
    4343                String json = "{\"name\":\"shekhar\",\"country\":\"india\"}"; 
    4444 
    45                 Map<String, ?>[] values = transformer.transform(new MockInputRow().put( 
    46                                 col1, json)); 
     45                Object[] values = transformer.transform(new MockInputRow().put(col1, 
     46                                json)); 
    4747                assertEquals(1, values.length); 
    48                 assertEquals(2, values[0].size()); 
     48                assertEquals(2, ((Map<?, ?>) values[0]).size()); 
    4949                assertEquals("{name=shekhar, country=india}", values[0].toString()); 
    5050        } 
     
    5454                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    5555                                String.class); 
    56                 ParseJsonTransformer transformer = new ParseJsonTransformer( 
    57                                 col1); 
     56                ParseJsonTransformer transformer = new ParseJsonTransformer(col1); 
    5857                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
    5958 
    6059                String json = "{\"name\":\"kasper\",\"age\":29,\"developer\":true,\"manager\":false,\"balance\":400.17}"; 
    6160 
    62                 Map<String, ?>[] values = transformer.transform(new MockInputRow().put( 
    63                                 col1, json)); 
     61                Object[] values = transformer.transform(new MockInputRow().put(col1, 
     62                                json)); 
    6463 
    6564                assertEquals(1, values.length); 
    66                 assertEquals(5, values[0].size()); 
     65                assertEquals(5, ((Map<?, ?>) values[0]).size()); 
    6766                assertEquals( 
    6867                                "{name=kasper, age=29, developer=true, manager=false, balance=400.17}", 
     
    7574                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    7675                                String.class); 
    77                 ParseJsonTransformer transformer = new ParseJsonTransformer( 
    78                                 col1); 
     76                ParseJsonTransformer transformer = new ParseJsonTransformer(col1); 
    7977                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
    80                 Map<String, ?>[] values = transformer.transform(new MockInputRow()); 
     78                Object[] values = transformer.transform(new MockInputRow()); 
    8179                assertTrue(values.length == 1); 
    82                 assertEquals(true, values[0].isEmpty()); 
     80                assertNull(values[0]); 
    8381        } 
    8482 
     
    8785                InputColumn<String> col1 = new MockInputColumn<String>("jsonDocument", 
    8886                                String.class); 
    89                 ParseJsonTransformer transformer = new ParseJsonTransformer( 
    90                                 col1); 
     87                ParseJsonTransformer transformer = new ParseJsonTransformer(col1); 
    9188                assertEquals(1, transformer.getOutputColumns().getColumnCount()); 
    9289 
    9390                String json = "{\"name\":\"shekhar\",\"addresses\":[{\"city\":\"Delhi\",\"country:\":\"India\"},{\"city\":\"Delhi\",\"country:\":\"India\"}],\"emails\":[\"email1\",\"email2\"]}"; 
    9491 
    95                 Map<String, ?>[] values = transformer.transform(new MockInputRow().put( 
    96                                 col1, json)); 
     92                Object[] values = transformer.transform(new MockInputRow().put(col1, 
     93                                json)); 
    9794                assertEquals(1, values.length); 
    98                 Map<String, ?> map = values[0]; 
     95                Map<?, ?> map = (Map<?, ?>) values[0]; 
    9996                assertEquals( 
    10097                                "{name=shekhar, addresses=[{city=Delhi, country:=India}, {city=Delhi, country:=India}], emails=[email1, email2]}", 
     
    10299 
    103100                assertTrue(map.get("addresses") instanceof List); 
    104                  
     101 
    105102                List<?> addresses = (List<?>) map.get("addresses"); 
    106                  
     103 
    107104                assertTrue(addresses.get(0) instanceof Map); 
    108105                assertTrue(map.get("emails") instanceof List); 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/beans/datastructures/ExtractFromListTransformer.java

    r3102 r3117  
    2626import org.eobjects.analyzer.beans.api.Categorized; 
    2727import org.eobjects.analyzer.beans.api.Configured; 
     28import org.eobjects.analyzer.beans.api.Description; 
    2829import org.eobjects.analyzer.beans.api.OutputColumns; 
    2930import org.eobjects.analyzer.beans.api.OutputRowCollector; 
     
    5657        @Inject 
    5758        @Configured 
     59        @Description("Verify that expected element type and actual type are the same") 
    5860        boolean verifyTypes = false; 
    5961 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/beans/datastructures/ExtractFromMapTransformer.java

    r3102 r3117  
    2727import org.eobjects.analyzer.beans.api.Categorized; 
    2828import org.eobjects.analyzer.beans.api.Configured; 
     29import org.eobjects.analyzer.beans.api.Description; 
    2930import org.eobjects.analyzer.beans.api.OutputColumns; 
    3031import org.eobjects.analyzer.beans.api.Transformer; 
     
    6061        @Inject 
    6162        @Configured 
     63        @Description("Verify that expected type and actual type are the same") 
    6264        boolean verifyTypes = false; 
    6365 
Note: See TracChangeset for help on using the changeset viewer.