WIP
[maven-thymeleaf-skin] / src / main / java / de / juplo / jackson / SimpleMapper.java
index 33133f6..e4028db 100644 (file)
@@ -5,14 +5,17 @@ import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonLocation;
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonToken;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Collections;
+import java.io.Reader;
+import java.net.URL;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.Spliterator;
 import static java.util.Spliterator.IMMUTABLE;
@@ -35,16 +38,395 @@ public class SimpleMapper
       LoggerFactory.getLogger(SimpleMapper.class);
 
 
-  private JsonFactory factory = new JsonFactory();
+  private final JsonFactory factory;
 
 
-  public static Stream<Object> getArrayStream(final JsonParser parser)
+  public SimpleMapper(JsonFactory factory)
+  {
+    this.factory = factory;
+  }
+
+
+  public Spliterator<Object> getArraySpliterator(File file)
       throws
         IOException
   {
-    return StreamSupport.stream(getArraySpliterator(parser), false);
+    return getArraySpliterator(factory.createParser(file));
+  }
+
+  public Spliterator<Object> getArraySpliterator(InputStream is)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(is));
+  }
+
+  public Spliterator<Object> getArraySpliterator(Reader r)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(r));
+  }
+
+  public Spliterator<Object> getArraySpliterator(String content)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(content));
+  }
+
+  public Spliterator<Object> getArraySpliterator(URL url)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(url));
+  }
+
+  public Spliterator<Object> getArraySpliterator(byte[] data)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(data));
+  }
+
+  public Spliterator<Object> getArraySpliterator(char[] content)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(content));
+  }
+
+  public Spliterator<Object> getArraySpliterator(byte[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(data, offset, len));
+  }
+
+  public Spliterator<Object> getArraySpliterator(char[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getArraySpliterator(factory.createParser(data, offset, len));
+  }
+
+  public Stream<Object> getArrayStream(File file)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(file));
+  }
+
+  public Stream<Object> getArrayStream(InputStream is)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(is));
+  }
+
+  public Stream<Object> getArrayStream(Reader r)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(r));
+  }
+
+  public Stream<Object> getArrayStream(String content)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(content));
+  }
+
+  public Stream<Object> getArrayStream(URL url)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(url));
+  }
+
+  public Stream<Object> getArrayStream(byte[] data)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(data));
+  }
+
+  public Stream<Object> getArrayStream(char[] content)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(content));
+  }
+
+  public Stream<Object> getArrayStream(byte[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(data, offset, len));
+  }
+
+  public Stream<Object> getArrayStream(char[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getArrayStream(factory.createParser(data, offset, len));
+  }
+
+  public Iterator<Object> getArrayIterator(File file)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(file));
+  }
+
+  public Iterator<Object> getArrayIterator(InputStream is)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(is));
+  }
+
+  public Iterator<Object> getArrayIterator(Reader r)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(r));
+  }
+
+  public Iterator<Object> getArrayIterator(String content)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(content));
+  }
+
+  public Iterator<Object> getArrayIterator(URL url)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(url));
+  }
+
+  public Iterator<Object> getArrayIterator(byte[] data)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(data));
+  }
+
+  public Iterator<Object> getArrayIterator(char[] content)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(content));
+  }
+
+  public Iterator<Object> getArrayIterator(byte[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(data, offset, len));
+  }
+
+  public Iterator<Object> getArrayIterator(char[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getArrayIterator(factory.createParser(data, offset, len));
+  }
+
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(File file)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(file));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(InputStream is)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(is));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(Reader r)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(r));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(String content)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(content));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(URL url)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(url));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(byte[] data)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(data));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(char[] content)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(content));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(byte[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(data, offset, len));
+  }
+
+  public Spliterator<Entry<String, Object>> getObjectSpliterator(char[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getObjectSpliterator(factory.createParser(data, offset, len));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(File file)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(file));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(InputStream is)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(is));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(Reader r)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(r));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(String content)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(content));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(URL url)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(url));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(byte[] data)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(data));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(char[] content)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(content));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(byte[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(data, offset, len));
+  }
+
+  public Stream<Entry<String, Object>> getObjectStream(char[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getObjectStream(factory.createParser(data, offset, len));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(File file)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(file));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(InputStream is)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(is));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(Reader r)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(r));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(String content)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(content));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(URL url)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(url));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(byte[] data)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(data));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(char[] content)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(content));
   }
 
+  public Iterator<Entry<String, Object>> getObjectIterator(byte[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(data, offset, len));
+  }
+
+  public Iterator<Entry<String, Object>> getObjectIterator(char[] data, int offset, int len)
+      throws
+        IOException
+  {
+    return getObjectIterator(factory.createParser(data, offset, len));
+  }
+
+
   public static Spliterator<Object> getArraySpliterator(final JsonParser parser)
       throws
         IOException
@@ -101,6 +483,13 @@ public class SimpleMapper
     };
   }
 
+  public static Stream<Object> getArrayStream(final JsonParser parser)
+      throws
+        IOException
+  {
+    return StreamSupport.stream(getArraySpliterator(parser), false);
+  }
+
   public static Iterator<Object> getArrayIterator(final JsonParser parser)
       throws
         IOException
@@ -109,7 +498,8 @@ public class SimpleMapper
     return new Iterator<Object>()
     {
       private Object next = null;
-      
+
+
       @Override
       public boolean hasNext()
       {
@@ -139,6 +529,134 @@ public class SimpleMapper
   }
 
 
+  public static Spliterator<Entry<String, Object>> getObjectSpliterator(final JsonParser parser)
+      throws
+        IOException
+  {
+    JsonToken token = parser.nextToken();
+
+    if (token == null)
+    {
+      LOG.warn("empty input");
+      return Spliterators.emptySpliterator();
+    }
+
+    if (!JsonToken.START_OBJECT.equals(token))
+      fail(parser, "The root-element must be an array!");
+
+    return new Spliterator<Entry<String, Object>>()
+    {
+      @Override
+      public boolean tryAdvance(Consumer<? super Entry<String, Object>> action)
+      {
+        try
+        {
+          JsonToken token = parser.nextToken();
+          if (token == null)
+            fail(parser, "Unexpected end of data!");
+          if (JsonToken.END_OBJECT.equals(token))
+            return false;
+          if (!JsonToken.FIELD_NAME.equals(token))
+            fail(parser, "expected a field-name");
+          final String key = parser.getText();
+          parser.nextToken();
+          final Object value = convert(parser);
+          action.accept(new Entry<String, Object>()
+          {
+            @Override
+            public String getKey()
+            {
+              return key;
+            }
+
+            @Override
+            public Object getValue()
+            {
+              return value;
+            }
+
+            @Override
+            public Object setValue(Object value)
+            {
+              throw new UnsupportedOperationException("Not supported.");
+            }
+          });
+          return true;
+        }
+        catch (IOException e)
+        {
+          throw new IllegalArgumentException(e);
+        }
+      }
+
+      @Override
+      public Spliterator<Entry<String, Object>> trySplit()
+      {
+        return null;
+      }
+
+      @Override
+      public long estimateSize()
+      {
+        return Long.MAX_VALUE;
+      }
+
+      @Override
+      public int characteristics()
+      {
+        return IMMUTABLE;
+      }
+    };
+  }
+
+  public static Stream<Entry<String, Object>> getObjectStream(final JsonParser parser)
+      throws
+        IOException
+  {
+    return StreamSupport.stream(getObjectSpliterator(parser), false);
+  }
+
+  public static Iterator<Entry<String, Object>> getObjectIterator(
+      final JsonParser parser
+      )
+      throws
+        IOException
+  {
+    Spliterator<Entry<String, Object>> spliterator = getObjectSpliterator(parser);
+    return new Iterator<Entry<String, Object>>()
+    {
+      private Entry<String, Object> next = null;
+
+
+      @Override
+      public boolean hasNext()
+      {
+        if (next != null)
+          return true;
+
+        return spliterator.tryAdvance(new Consumer<Entry<String, Object>>()
+        {
+          @Override
+          public void accept(Entry<String, Object> e)
+          {
+            next = e;
+          }
+        });
+      }
+
+      @Override
+      public Entry<String, Object> next()
+      {
+        if (next == null && !hasNext())
+          throw new NoSuchElementException();
+        Entry<String, Object> e = next;
+        next = null;
+        return e;
+      }
+    };
+  }
+
+
   static Object convert(JsonParser parser) throws IOException
   {
     JsonToken token = parser.getCurrentToken();
@@ -161,6 +679,7 @@ public class SimpleMapper
     return null; // << Will never be reached, because fail always throws an exception
   }
 
+
   static Map<String, Object> convertObject(JsonParser parser) throws IOException
   {
     JsonToken token = parser.nextToken();
@@ -207,6 +726,7 @@ public class SimpleMapper
     return list;
   }
 
+
   static void fail(JsonParser parser, String message)
   {
     JsonLocation location = parser.getCurrentLocation();