Repository: incubator-juneau Updated Branches: refs/heads/master 1bb80a053 -> f5f5edfb6
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java index fa8b57f..36a1e71 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java @@ -21,116 +21,7 @@ import org.apache.juneau.parser.*; import org.apache.juneau.serializer.*; /** - * Specialized {@link PojoSwap} for surrogate classes. - * - * <p> - * Surrogate classes are used in place of other classes during serialization. - * For example, you may want to use a surrogate class to change the names or order of bean properties on a bean. - * - * <p> - * The following is an example of a surrogate class change changes a property name: - * <p class='bcode'> - * <jk>public class</jk> SurrogateClass { - * <jk>public</jk> String surrogateField; <jc>// New bean property</jc> - * - * <jk>public</jk> SurrogateClass(NormalClass normalClass) { - * <jk>this</jk>.surrogateField = normalClass.normalField; - * } - * } - * </p> - * - * <p> - * Optionally, a public static method can be used to un-transform a class during parsing: - * <p class='bcode'> - * <jk>public class</jk> SurrogateClass { - * ... - * <jk>public static</jk> NormalClass <jsm>toNormalClass</jsm>(SurrogateClass surrogateClass) { - * <jk>return new</jk> NormalClass(surrogateClass.transformedField); - * } - * } - * </p> - * - * <p> - * Surrogate classes must conform to the following: - * <ul class='spaced-list'> - * <li> - * It must have a one or more public constructors that take in a single parameter whose type is the normal types. - * (It is possible to define a class as a surrogate for multiple class types by using multiple constructors with - * different parameter types). - * <li> - * It optionally can have a public static method that takes in a single parameter whose type is the transformed - * type and returns an instance of the normal type. - * This is called the un-transform method. - * The method can be called anything. - * <li> - * If an un-transform method is present, the class must also contain a no-arg constructor (so that the - * transformed class can be instantiated by the parser before being converted into the normal class by the - * un-transform method). - * </ul> - * - * <p> - * Surrogate classes are associated with serializers and parsers using the {@link CoreObjectBuilder#pojoSwaps(Class...)} - * method. - * <p class='bcode'> - * <ja>@Test</ja> - * <jk>public void</jk> test() <jk>throws</jk> Exception { - * JsonSerializer s = <jk>new</jk> JsonSerializerBuilder().simple().pojoSwaps(Surrogate.<jk>class</jk>).build(); - * JsonParser p = <jk>new</jk> JsonParserBuilder().pojoSwaps(Surrogate.<jk>class</jk>).build(); - * String r; - * Normal n = Normal.<jsm>create</jsm>(); - * - * r = s.serialize(n); - * assertEquals(<js>"{f2:'f1'}"</js>, r); - * - * n = p.parse(r, Normal.<jk>class</jk>); - * assertEquals(<js>"f1"</js>, n.f1); - * } - * - * <jc>// The normal class</jc> - * <jk>public class</jk> Normal { - * <jk>public</jk> String f1; - * - * <jk>public static</jk> Normal <jsm>create</jsm>() { - * Normal n = <jk>new</jk> Normal(); - * n.f1 = <js>"f1"</js>; - * <jk>return</jk> n; - * } - * } - * - * <jc>// The surrogate class</jc> - * <jk>public static class</jk> Surrogate { - * <jk>public</jk> String f2; - * - * <jc>// Surrogate constructor</jc> - * <jk>public</jk> Surrogate(Normal n) { - * f2 = n.f1; - * } - * - * <jc>// Constructor used during parsing (only needed if un-transform method specified)</jc> - * <jk>public</jk> Surrogate() {} - * - * <jc>// Un-transform method (optional)</jc> - * <jk>public static</jk> Normal <jsm>toNormal</jsm>(Surrogate f) { - * Normal n = <jk>new</jk> Normal(); - * n.f1 = f.f2; - * <jk>return</jk> n; - * } - * } - * </p> - * - * <p> - * It should be noted that a surrogate class is functionally equivalent to the following {@link PojoSwap} - * implementation: - * <p class='bcode'> - * <jk>public static class</jk> SurrogateSwap <jk>extends</jk> PojoSwap<Normal,Surrogate> { - * <jk>public</jk> Surrogate swap(Normal n) <jk>throws</jk> SerializeException { - * <jk>return new</jk> Surrogate(n); - * } - * <jk>public</jk> Normal unswap(Surrogate s, ClassMeta<?> hint) <jk>throws</jk> ParseException { - * <jk>return</jk> Surrogate.<jsm>toNormal</jsm>(s); - * } - * } - * </p> + * Specialized {@link PojoSwap} for {@link Surrogate} classes. * * @param <T> The class type that this transform applies to. * @param <F> The transformed class type. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/package.html ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/package.html b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/package.html index 124bc10..9c4be10 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/package.html +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/package.html @@ -114,7 +114,7 @@ {@link org.apache.juneau.rest.jaxrs.JuneauProvider#beanFilters() @JuneauProvider.beanFilters()} / {@link org.apache.juneau.rest.jaxrs.JuneauProvider#pojoSwaps() @JuneauProvider.pojoSwaps()} - On all serializers and parsers defined on a JAX-RS provider. </ul> <p> - Swaps can also be associated with classes through the {@link org.apache.juneau.annotation.Pojo#swap @Pojo.swap()} annotation. + Swaps can also be associated with classes through the {@link org.apache.juneau.annotation.Swap @Swap} annotation. </p> <!-- ======================================================================================================== --> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java index 5183c5b..bff57ad 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java @@ -15,8 +15,6 @@ package org.apache.juneau.transforms; import static org.apache.juneau.internal.StringUtils.*; import org.apache.juneau.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; /** @@ -28,23 +26,15 @@ public class ByteArrayBase64Swap extends StringSwap<byte[]> { * Converts the specified <code><jk>byte</jk>[]</code> to a {@link String}. */ @Override /* PojoSwap */ - public String swap(BeanSession session, byte[] b) throws SerializeException { - try { - return base64Encode(b); - } catch (Exception e) { - throw new SerializeException(e); - } + public String swap(BeanSession session, byte[] b) throws Exception { + return base64Encode(b); } /** * Converts the specified {@link String} to a <code><jk>byte</jk>[]</code>. */ @Override /* PojoSwap */ - public byte[] unswap(BeanSession session, String s, ClassMeta<?> hint) throws ParseException { - try { - return base64Decode(s); - } catch (Exception e) { - throw new ParseException(e); - } + public byte[] unswap(BeanSession session, String s, ClassMeta<?> hint) throws Exception { + return base64Decode(s); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarLongSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarLongSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarLongSwap.java index daed18c..7da3952 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarLongSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarLongSwap.java @@ -15,7 +15,6 @@ package org.apache.juneau.transforms; import java.util.*; import org.apache.juneau.*; -import org.apache.juneau.parser.*; import org.apache.juneau.transform.*; /** @@ -36,17 +35,13 @@ public class CalendarLongSwap extends PojoSwap<Calendar,Long> { */ @Override /* PojoSwap */ @SuppressWarnings("unchecked") - public Calendar unswap(BeanSession session, Long o, ClassMeta<?> hint) throws ParseException { + public Calendar unswap(BeanSession session, Long o, ClassMeta<?> hint) throws Exception { ClassMeta<? extends Calendar> tt; - try { - if (hint == null || ! hint.canCreateNewInstance()) - hint = session.getClassMeta(GregorianCalendar.class); - tt = (ClassMeta<? extends Calendar>)hint; - Calendar c = tt.newInstance(); - c.setTimeInMillis(o); - return c; - } catch (Exception e) { - throw new ParseException(e); - } + if (hint == null || ! hint.canCreateNewInstance()) + hint = session.getClassMeta(GregorianCalendar.class); + tt = (ClassMeta<? extends Calendar>)hint; + Calendar c = tt.newInstance(); + c.setTimeInMillis(o); + return c; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarMapSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarMapSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarMapSwap.java index ec4afe4..bcabe1a 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarMapSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/CalendarMapSwap.java @@ -15,7 +15,6 @@ package org.apache.juneau.transforms; import java.util.*; import org.apache.juneau.*; -import org.apache.juneau.parser.*; import org.apache.juneau.transform.*; /** @@ -40,21 +39,17 @@ public class CalendarMapSwap extends PojoSwap<Calendar,Map> { */ @Override /* PojoSwap */ @SuppressWarnings("unchecked") - public Calendar unswap(BeanSession session, Map o, ClassMeta<?> hint) throws ParseException { + public Calendar unswap(BeanSession session, Map o, ClassMeta<?> hint) throws Exception { ClassMeta<? extends Calendar> tt; - try { - if (hint == null || ! hint.canCreateNewInstance()) - hint = session.getClassMeta(GregorianCalendar.class); - tt = (ClassMeta<? extends Calendar>)hint; - long time = Long.parseLong(o.get("time").toString()); - String timeZone = o.get("timeZone").toString(); - Date d = new Date(time); - Calendar c = tt.newInstance(); - c.setTime(d); - c.setTimeZone(TimeZone.getTimeZone(timeZone)); - return c; - } catch (Exception e) { - throw new ParseException(e); - } + if (hint == null || ! hint.canCreateNewInstance()) + hint = session.getClassMeta(GregorianCalendar.class); + tt = (ClassMeta<? extends Calendar>)hint; + long time = Long.parseLong(o.get("time").toString()); + String timeZone = o.get("timeZone").toString(); + Date d = new Date(time); + Calendar c = tt.newInstance(); + c.setTime(d); + c.setTimeZone(TimeZone.getTimeZone(timeZone)); + return c; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateLongSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateLongSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateLongSwap.java index 9316280..27c373f 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateLongSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateLongSwap.java @@ -37,7 +37,7 @@ public class DateLongSwap extends PojoSwap<Date,Long> { * Converts the specified {@link Long} to a {@link Date}. */ @Override /* PojoSwap */ - public Date unswap(BeanSession session, Long o, ClassMeta<?> hint) throws ParseException { + public Date unswap(BeanSession session, Long o, ClassMeta<?> hint) throws Exception { Class<?> c = (hint == null ? java.util.Date.class : hint.getInnerClass()); if (c == java.util.Date.class) return new java.util.Date(o); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateMapSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateMapSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateMapSwap.java index fcaafe0..0893bbb 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateMapSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/DateMapSwap.java @@ -40,7 +40,7 @@ public class DateMapSwap extends PojoSwap<Date,Map> { * Converts the specified {@link Map} to a {@link Date}. */ @Override /* PojoSwap */ - public Date unswap(BeanSession session, Map o, ClassMeta<?> hint) throws ParseException { + public Date unswap(BeanSession session, Map o, ClassMeta<?> hint) throws Exception { Class<?> c = (hint == null ? java.util.Date.class : hint.getInnerClass()); long l = Long.parseLong(((Map<?,?>)o).get("time").toString()); if (c == java.util.Date.class) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ReaderSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ReaderSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ReaderSwap.java index 9c8a0a1..47a6f51 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ReaderSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/ReaderSwap.java @@ -20,7 +20,6 @@ import org.apache.juneau.*; import org.apache.juneau.html.*; import org.apache.juneau.json.*; import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; import org.apache.juneau.xml.*; @@ -96,16 +95,9 @@ public class ReaderSwap extends PojoSwap<Reader,Object> { * Converts the specified {@link Reader} to an {@link Object} whose type is determined by the contents of the reader. */ @Override /* PojoSwap */ - public Object swap(BeanSession session, Reader o) throws SerializeException { - try { - if (parser == null) - return read(o); - return parser.parse(o, Object.class); - } catch (IOException e) { - return e.getLocalizedMessage(); - } catch (Exception e) { - throw new SerializeException("ReaderSwap could not transform object of type ''{0}''", - o == null ? null : o.getClass().getName()).initCause(e); - } + public Object swap(BeanSession session, Reader o) throws Exception { + if (parser == null) + return read(o); + return parser.parse(o, Object.class); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java index bb05ab1..29c4900 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java @@ -14,8 +14,6 @@ package org.apache.juneau.transforms; import org.apache.juneau.*; import org.apache.juneau.annotation.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; /** @@ -35,12 +33,12 @@ public class StringFormatSwap extends StringSwap<Object> { } @Override /* PojoSwap */ - public String swap(BeanSession session, Object o) throws SerializeException { + public String swap(BeanSession session, Object o) throws Exception { return String.format(format, o); } @Override /* PojoSwap */ - public Object unswap(BeanSession session, String f, ClassMeta<?> hint) throws ParseException { + public Object unswap(BeanSession session, String f, ClassMeta<?> hint) throws Exception { return session.convertToType(f, hint); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java index ec0d9dc..446e150 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java @@ -17,8 +17,6 @@ import static org.apache.juneau.internal.StringUtils.*; import javax.xml.datatype.*; import org.apache.juneau.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; /** @@ -49,7 +47,7 @@ public class XMLGregorianCalendarSwap extends StringSwap<XMLGregorianCalendar> { * Converts the specified <code>XMLGregorianCalendar</code> to a {@link String}. */ @Override /* PojoSwap */ - public String swap(BeanSession session, XMLGregorianCalendar b) throws SerializeException { + public String swap(BeanSession session, XMLGregorianCalendar b) throws Exception { return b.toXMLFormat(); } @@ -57,7 +55,7 @@ public class XMLGregorianCalendarSwap extends StringSwap<XMLGregorianCalendar> { * Converts the specified {@link String} to an <code>XMLGregorianCalendar</code>. */ @Override /* PojoSwap */ - public XMLGregorianCalendar unswap(BeanSession session, String s, ClassMeta<?> hint) throws ParseException { + public XMLGregorianCalendar unswap(BeanSession session, String s, ClassMeta<?> hint) throws Exception { if (isEmpty(s)) return null; return dtf.newXMLGregorianCalendar(s); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-core/juneau-marshall/src/main/javadoc/overview.html ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/javadoc/overview.html b/juneau-core/juneau-marshall/src/main/javadoc/overview.html index 03fed7b..7f6a0f7 100644 --- a/juneau-core/juneau-marshall/src/main/javadoc/overview.html +++ b/juneau-core/juneau-marshall/src/main/javadoc/overview.html @@ -84,7 +84,7 @@ <li><p><a class='doclink' href='#Core.Transforms'>Transforms</a></p> <ol> <li><p><a class='doclink' href='#Core.PojoSwaps'>PojoSwaps</a></p> - <li><p><a class='doclink' href='#Core.PojoAnnotation'>@Pojo annotation</a></p> + <li><p><a class='doclink' href='#Core.SwapAnnotation'>@Swap annotation</a></p> <li><p><a class='doclink' href='#Core.SwapMethods'>Swap methods</a></p> <li><p><a class='doclink' href='#Core.BeanFilters'>BeanFilters and @Bean annotations</a></p> <li><p><a class='doclink' href='#Core.SerializingReadersAndInputStreams'>Serializing Readers and InputStreams</a></p> @@ -773,7 +773,7 @@ </p> <ul class='doctree'> <li class='ja'> - {@link org.apache.juneau.annotation.Pojo @Pojo} + {@link org.apache.juneau.annotation.Swap @Swap} - Used to tailor how non-bean POJOs get interpreted by the framework. <li class='ja'> {@link org.apache.juneau.annotation.Bean @Bean} @@ -900,17 +900,17 @@ </div> <!-- ======================================================================================================== --> - <a id="Core.PojoAnnotation"></a> - <h4 class='topic' onclick='toggle(this)'>2.6.2 - @Pojo annotation</h4> + <a id="Core.SwapAnnotation"></a> + <h4 class='topic' onclick='toggle(this)'>2.6.2 - @Swap annotation</h4> <div class='topic'> <p> - {@link org.apache.juneau.annotation.Pojo @Pojo} can be used to associate a swap class using an + {@link org.apache.juneau.annotation.Swap @Swap} can be used to associate a swap class using an annotation. This is often cleaner than using the builder <code>pojoSwaps()</code> method since you can keep your swap class near your POJO class. </p> <p class='bcode'> - <ja>@Pojo</ja>(swap=MyPojoSwap.<jk>class</jk>) + <ja>@Swap</ja>(MyPojoSwap.<jk>class</jk>) <jk>public class</jk> MyPojo { ... } @@ -1181,7 +1181,7 @@ all other renditions as-is: </p> <p class='bcode'> - <ja>@Pojo</ja>(swap=MyBeanSwap.<jk>class</jk>) + <ja>@Swap</ja>(MyBeanSwap.<jk>class</jk>) <jk>public class</jk> MyBean {...} <jk>public class</jk> MyBeanSwap <jk>extends</jk> PojoSwap<MyBean,Object> { @@ -2090,8 +2090,7 @@ </td> <td> Juneau uses swaps to convert non-serializable object to serializable forms: - <br>{@link org.apache.juneau.annotation.BeanProperty#swap() @BeanProperty(swap=...)} - <br>{@link org.apache.juneau.annotation.Pojo#swap() @Pojo(swap=...)} + <br>{@link org.apache.juneau.annotation.Swap @Swap} </td> </tr> <tr> @@ -6740,7 +6739,7 @@ <h5 class='toc'>What's new in each release</h5> <ul class='toc'> - <li><p><a class='doclink' href='#6.3.2'>6.3.2 (TBD)</a></p> + <li><p><a class='doclink' href='#6.4.0'>6.4.0 (TBD)</a></p> <li><p><a class='doclink' href='#6.3.1'>6.3.1 (Aug 1, 2017)</a></p> <li><p><a class='doclink' href='#6.3.0'>6.3.0 (Jun 30, 2017)</a></p> <li><p><a class='doclink' href='#6.2.0'>6.2.0 (Apr 28, 2017)</a></p> @@ -6810,8 +6809,8 @@ </ul> <!-- ======================================================================================================== --> - <a id="6.3.2"></a> - <h3 class='topic' onclick='toggle(this)'>6.3.2 (TBD)</h3> + <a id="6.4.0"></a> + <h3 class='topic' onclick='toggle(this)'>6.4.0 (TBD)</h3> <div class='topic'> <p> The major change in this release is the project structure @@ -6824,8 +6823,8 @@ <th>Category</th><th>Maven Artifacts</th><th>Description</th><th>Prereqs</th> </tr> <tr class='dark bb'> - <td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;'><a class='doclink' href='#JuneauCore'>Juneau Core</a></td> - <td class='code'><a class='doclink' href='#juneau-marshall'>juneau-marshall</a></td> + <td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;'>Juneau Core</td> + <td class='code'>juneau-marshall</td> <td>Serializers and parsers for: <ul style='margin:0px 10px;'> <li>JSON @@ -6848,7 +6847,7 @@ </td> </tr> <tr class='dark bb'> - <td class='code'><a class='doclink' href='#juneau-marshall-rdf'>juneau-marshall-rdf</a></td> + <td class='code'>juneau-marshall-rdf</td> <td> Serializers and parsers for: <ul style='margin:0px 10px;'> @@ -6867,7 +6866,7 @@ </td> </tr> <tr class='dark bb'> - <td class='code'><a class='doclink' href='#juneau-dto'>juneau-dto</a></td> + <td class='code'>juneau-dto</td> <td> Data Transfer Objects for: <ul style='margin:0px 10px;'> @@ -6881,22 +6880,22 @@ <td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td> </tr> <tr class='dark bb'> - <td class='code'><a class='doclink' href='#juneau-svl'>juneau-svl</a></td> + <td class='code'>juneau-svl</td> <td> Simple Variable Language API </td> <td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td> </tr> <tr class='dark bb'> - <td class='code'><a class='doclink' href='#juneau-config'>juneau-config</a></td> + <td class='code'>juneau-config</td> <td> Configuration file API </td> <td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td> </tr> <tr class='light bb'> - <td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;'><a class='doclink' href='#JuneauRest'>Juneau REST</a></td> - <td class='code'><a class='doclink' href='#juneau-rest-server'>juneau-rest-server</a></td> + <td rowspan="3" style='text-align:center;font-weight:bold;padding:20px;'>Juneau REST</td> + <td class='code'>juneau-rest-server</td> <td> REST Servlet API </td> @@ -6908,7 +6907,7 @@ </td> </tr> <tr class='light bb'> - <td class='code'><a class='doclink' href='#juneau-rest-server-jaxrs'>juneau-rest-server-jaxrs</a></td> + <td class='code'>juneau-rest-server-jaxrs</td> <td> Optional JAX-RS support </td> @@ -6920,7 +6919,7 @@ </td> </tr> <tr class='light bb'> - <td class='code'><a class='doclink' href='#juneau-rest-client'>juneau-rest-client</a></td> + <td class='code'>juneau-rest-client</td> <td> REST Client API </td> @@ -6931,10 +6930,11 @@ </ul> </td> </tr> - <tr class='light bb'> - <td class='code'><a class='doclink' href='#juneau-microservice'>juneau-microservice</a></td> + <tr class='dark bb'> + <td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;'>Juneau Microservice</td> + <td class='code'>juneau-microservice-server</td> <td> - REST Microservice API + REST Microservice Server API </td> <td> <ul style='margin:0px 10px;'> @@ -6943,8 +6943,8 @@ </ul> </td> </tr> - <tr class='light bb'> - <td class='code'><a class='doclink' href='#juneau-microservice-template'>juneau-microservice-template</a></td> + <tr class='dark bb'> + <td class='code'>juneau-microservice-template</td> <td> Developer template project </td> @@ -6955,23 +6955,23 @@ </ul> </td> </tr> - <tr class='dark bb'> - <td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;'><a class='doclink' href='#Examples'>Examples</a></td> + <tr class='light bb'> + <td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;'>Examples</td> <td class='code'><code>juneau-examples-core</code></td> <td> Core code examples </td> <td></td> </tr> - <tr class='dark bb'> + <tr class='light bb'> <td class='code'><code>juneau-examples-rest</code></td> <td> REST code examples </td> <td></td> </tr> - <tr class='light bb'> - <td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;'><a class='doclink' href='#JuneauAll'>Juneau All</a></td> + <tr class='dark bb'> + <td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;'>Juneau All</td> <td class='code'><code>juneau-all</code></td> <td> Combination of the following: @@ -6997,6 +6997,72 @@ <h6 class='topic'>juneau-marshall</h6> <ul class='spaced-list'> <li> + Improvements to swap support. + <ul> + <li>New {@link org.apache.juneau.annotation.Swap @Swap} annotation. + <br>Replaces the <code>@Pojo</code> and <code>@BeanProperty.swap()</code> annotations. + <li>Support for per-media-type swaps. + <br>Programmatic example: + <p class='bcode'> + <ja>@Swap</ja>(MyJsonOnlySwap.<jk>class</jk>) + <jk>public class</jk> MyPojo {} + + <jk>public class</jk> MyJsonOnlySwap <jk>extends</jk> PojoSwap<MyPojo,String> { + + <jk>public</jk> MediaType[] forMediaTypes() { + <jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"*/json"</js>); + } + + <jk>public</jk> String swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception { + <jk>return</jk> <js>"It's JSON!"</js>; + } + </p> + <br>Annotated example: + <p class='bcode'> + <ja>@Swap</ja>(impl=ToStringSwap.<jk>class</jk>, mediaTypes=<js>"*/json"</js>) + <jk>public class</jk> MyBean { ... } + + <jk>public class</jk> ToStringSwap <jk>extends</jk> PojoSwap<Object,String> { + <jk>public</jk> String swap(BeanSession session, Object o) <jk>throws</jk> Exception { + <jk>return</jk> o.toString(); + } + } + </p> + <li>Support for templated swaps which provide additional context information for a swap. + <br>The following is an example of a templated swap class used to serialize POJOs to HTML using FreeMarker: + <p class='bcode'> + <jc>// Our abstracted templated swap class.</jc> + <jk>public abstract class</jk> FreeMarkerSwap <jk>extends</jk> PojoSwap<Object,Reader> { + + <jk>public</jk> MediaType[] forMediaTypes() { + <jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"*/html"</js>); + } + + <jk>public</jk> Reader swap(BeanSession session, Object o, String template) <jk>throws</jk> Exception { + <jk>return</jk> getFreeMarkerReader(template, o); <jc>// Some method that creates raw HTML.</jc> + } + } + </p> + <p class='bcode'> + <ja>@Swap</ja>(impl=FreeMarkerSwap.<jk>class</jk>, template=<js>"MyPojo.div.ftl"</js>) + <jk>public class</jk> MyPojo {} + </p> + <li>New {@link org.apache.juneau.annotation.Swaps @Swaps} annotation for defining multiple swaps + against the same POJO when they're differentiated by media types: + <p class='bcode'> + <ja>@Swaps</ja>( + { + <ja>@Swap</ja>(MyJsonSwap.<jk>class</jk>), + <ja>@Swap</ja>(MyXmlSwap.<jk>class</jk>), + <ja>@Swap</ja>(MyOtherSwap.<jk>class</jk>) + } + ) + <jk>public class</jk> MyPojo {} + </p> + </ul> + <li> + New {@link org.apache.juneau.transform.Surrogate} interface for identifying surrogate classes. + <li> Serializers can now serialize to {@link java.util.StringBuilder StringBuilders}. <li> Serializers now serialize the contents of {@link java.io.Reader Readers} and {@link java.io.InputStream InputStreams} @@ -7032,10 +7098,10 @@ <jc>// Same, but using a session object</jc> SerializerSession session = JsonSerializer.<jsf>DEFAULT</jsf>.createSession(); <jk>try</jk> { - session.serialize(writer1, pojo1); - session.serialize(writer2, pojo2); + session.serialize(writer1, pojo1); + session.serialize(writer2, pojo2); } <jk>finally</jk> { - session.close(); + session.close(); } </p> This is mostly an internal change and doesn't affect the existing APIs. @@ -8472,7 +8538,7 @@ <li>{@link org.apache.juneau.BeanPropertyMetaExtended} / {@link org.apache.juneau.BeanPropertyMeta#getExtendedMeta(Class)} </ul> </li> - <li>Renamed <code>@Transform</code> annotation to {@link org.apache.juneau.annotation.Pojo @Pojo} so that it can be used for various POJO-related behavior, not just associating transforms. + <li>Renamed <code>@Transform</code> annotation to <code><del>@Pojo</del></code> so that it can be used for various POJO-related behavior, not just associating transforms. <li>Introduced {@link org.apache.juneau.dto.swagger Swagger DTOs}. </ul> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/CreatePerson.java ---------------------------------------------------------------------- diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/CreatePerson.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/CreatePerson.java index d064fd7..03cc416 100755 --- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/CreatePerson.java +++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/CreatePerson.java @@ -29,7 +29,10 @@ public class CreatePerson { // Bean properties public String name; - @BeanProperty(swap=CalendarSwap.DateMedium.class) public Calendar birthDate; + + @Swap(CalendarSwap.DateMedium.class) + public Calendar birthDate; + public LinkedList<CreateAddress> addresses = new LinkedList<CreateAddress>(); /** Bean constructor - Needed for instantiating on server side */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/Person.java ---------------------------------------------------------------------- diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/Person.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/Person.java index e95806a..c298333 100755 --- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/Person.java +++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/addressbook/Person.java @@ -31,11 +31,18 @@ public class Person { private static int nextPersonId = 1; // Bean properties - @Rdf(beanUri=true) public URI uri; + @Rdf(beanUri=true) + public URI uri; + private URI addressBookUri; + public int id; + public String name; - @BeanProperty(swap=CalendarSwap.DateMedium.class) public Calendar birthDate; + + @Swap(CalendarSwap.DateMedium.class) + public Calendar birthDate; + public LinkedList<Address> addresses = new LinkedList<Address>(); /** Bean constructor - Needed for instantiating on server side */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java index 868c205..532b554 100644 --- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java +++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java @@ -137,7 +137,7 @@ public class PetStoreResource extends ResourceJena { @BeanProperty(format="$%.2f") // Renders price in dollars. public float price; - @BeanProperty(swap=DateSwap.ISO8601D.class) // Renders dates in ISO8601 format. + @Swap(DateSwap.ISO8601D.class) // Renders dates in ISO8601 format. public Date birthDate; public int getAge() { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java index b191358..497a4b1 100644 --- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java +++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java @@ -217,9 +217,17 @@ public class SystemPropertiesResource extends Resource { ) public Form getFormPage() { return form().method("POST").action("servlet:/formPagePost").children( - h4("Set system property"), - "Name: ", input("text").name("name"), br(), - "Value: ", input("text").name("value"), br(), br(), + table( + tr( + th("Set system property").colspan(2) + ), + tr( + td("Name: "), td(input("text").name("name")) + ), + tr( + td("Value: "), td(input("text").name("value")) + ) + ), button("submit","Click me!").style("float:right") ); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java index a6d98fe..4d18d87 100644 --- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java +++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java @@ -106,7 +106,7 @@ public class UrlEncodedFormResource extends Resource { public static class FormInputBean { public String aString; public int aNumber; - @BeanProperty(swap=CalendarSwap.ISO8601DT.class) + @Swap(CalendarSwap.ISO8601DT.class) public Calendar aDate; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java index ea3dce8..0c0edc4 100755 --- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java +++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java @@ -321,7 +321,7 @@ public class DirectoryResource extends Resource { /** * @return The file last modified timestamp. */ - @BeanProperty(swap=DateSwap.ISO8601DTP.class) + @Swap(DateSwap.ISO8601DTP.class) public Date getLastModified() { return new Date(f.lastModified()); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f5f5edfb/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java index 1a813d9..d98b77d 100755 --- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java +++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java @@ -308,7 +308,7 @@ public class LogsResource extends Resource { public String type; public Object name; public Long size; - @BeanProperty(swap=DateSwap.DateTimeMedium.class) public Date lastModified; + @Swap(DateSwap.DateTimeMedium.class) public Date lastModified; public URI view, highlighted, parsed, download, delete; public FileResource(File f, URI uri) throws Exception {