Repository: incubator-juneau Updated Branches: refs/heads/master 35cb8461b -> d05dd4b10
Bug fixes and code cleanup. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/d05dd4b1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/d05dd4b1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/d05dd4b1 Branch: refs/heads/master Commit: d05dd4b10bddd0f70074d07283382602f4f5cd94 Parents: 35cb846 Author: JamesBognar <[email protected]> Authored: Tue Jun 20 18:09:03 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Tue Jun 20 18:09:03 2017 -0400 ---------------------------------------------------------------------- .../apache/juneau/utils/StringUtilsTest.java | 22 +- .../main/java/org/apache/juneau/BeanMap.java | 3 + .../main/java/org/apache/juneau/BeanMeta.java | 9 +- .../org/apache/juneau/BeanPropertyMeta.java | 6 +- .../java/org/apache/juneau/BeanSession.java | 2 +- .../main/java/org/apache/juneau/ObjectMap.java | 4 +- .../juneau/html/HtmlDocSerializerSession.java | 2 +- .../juneau/http/HeaderEntityValidatorArray.java | 2 +- .../apache/juneau/http/HeaderStringArray.java | 2 +- .../org/apache/juneau/http/MediaTypeRange.java | 2 +- .../org/apache/juneau/http/StringRange.java | 2 +- .../java/org/apache/juneau/ini/ConfigFile.java | 2 +- .../org/apache/juneau/internal/DateUtils.java | 16 +- .../org/apache/juneau/internal/StringUtils.java | 12 +- .../java/org/apache/juneau/parser/Parser.java | 2 +- .../apache/juneau/serializer/Serializer.java | 2 +- .../org/apache/juneau/svl/DefaultingVar.java | 2 +- .../org/apache/juneau/svl/MultipartVar.java | 2 +- .../transform/AnnotationBeanFilterBuilder.java | 4 +- .../transform/InterfaceBeanFilterBuilder.java | 4 +- .../org/apache/juneau/utils/SearchArgs.java | 6 +- juneau-core/src/main/javadoc/overview.html | 8 +- .../juneau/microservice/RestMicroservice.java | 2 +- .../apache/juneau/rest/client/RestClient.java | 2 - .../juneau/rest/client/RestClientBuilder.java | 2 +- .../juneau/rest/test/BpIncludesResource.java | 140 ++++++++++ .../java/org/apache/juneau/rest/test/Root.java | 1 + .../org/apache/juneau/rest/test/TestUtils.java | 16 ++ .../apache/juneau/rest/test/BpIncludesTest.java | 253 +++++++++++++++++++ .../java/org/apache/juneau/rest/CallMethod.java | 26 +- .../org/apache/juneau/rest/RequestHeaders.java | 2 +- .../org/apache/juneau/rest/RestContext.java | 4 +- .../org/apache/juneau/rest/RestRequest.java | 24 ++ .../org/apache/juneau/rest/RestServlet.java | 6 + .../rest/vars/SerializedRequestAttrVar.java | 2 +- 35 files changed, 536 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core-test/src/test/java/org/apache/juneau/utils/StringUtilsTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/utils/StringUtilsTest.java b/juneau-core-test/src/test/java/org/apache/juneau/utils/StringUtilsTest.java index c7c3052..243c905 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/utils/StringUtilsTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/utils/StringUtilsTest.java @@ -483,30 +483,30 @@ public class StringUtilsTest { public void testSplit() throws Exception { String[] r; - assertNull(split((String)null, ',')); - assertObjectEquals("[]", split("", ',')); - assertObjectEquals("['1']", split("1", ',')); - assertObjectEquals("['1','2']", split("1,2", ',')); - assertObjectEquals("['1,2']", split("1\\,2", ',')); + assertNull(split((String)null)); + assertObjectEquals("[]", split("")); + assertObjectEquals("['1']", split("1")); + assertObjectEquals("['1','2']", split("1,2")); + assertObjectEquals("['1,2']", split("1\\,2")); - r = split("1\\\\,2", ','); + r = split("1\\\\,2"); assertEquals("1\\", r[0]); assertEquals("2", r[1]); - r = split("1\\\\\\,2", ','); + r = split("1\\\\\\,2"); assertEquals(1, r.length); assertEquals("1\\,2", r[0]); - r = split("1,2\\", ','); + r = split("1,2\\"); assertEquals("2\\", r[1]); - r = split("1,2\\\\", ','); + r = split("1,2\\\\"); assertEquals("2\\", r[1]); - r = split("1,2\\,", ','); + r = split("1,2\\,"); assertEquals("2,", r[1]); - r = split("1,2\\\\,", ','); + r = split("1,2\\\\,"); assertEquals("2\\", r[1]); assertEquals("", r[2]); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/BeanMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java index 6f259ad..1bdacfa 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java @@ -18,6 +18,7 @@ import java.util.*; import org.apache.juneau.annotation.*; import org.apache.juneau.internal.*; +import org.apache.juneau.json.*; import org.apache.juneau.parser.*; import org.apache.juneau.transform.*; import org.apache.juneau.xml.annotation.*; @@ -156,6 +157,8 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T for (Map.Entry<String,Object> e : propertyCache.entrySet()) put(e.getKey(), e.getValue()); propertyCache = null; + } catch (IllegalArgumentException e) { + throw new BeanRuntimeException("IllegalArgumentException occurred on call to class constructor ''{0}'' with argument types ''{1}''", c.getName(), JsonSerializer.DEFAULT_LAX.toString(ClassUtils.getClasses(args))); } catch (Exception e) { throw new BeanRuntimeException(e); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java index 770236b..777a2b4 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java @@ -211,7 +211,7 @@ public class BeanMeta<T> { if (constructor != null) throw new BeanRuntimeException(c, "Multiple instances of '@BeanConstructor' found."); constructor = (Constructor<T>)x; - constructorArgs = split(x.getAnnotation(BeanConstructor.class).properties(), ','); + constructorArgs = split(x.getAnnotation(BeanConstructor.class).properties()); if (constructorArgs.length != x.getParameterTypes().length) throw new BeanRuntimeException(c, "Number of properties defined in '@BeanConstructor' annotation does not match number of parameters in constructor."); if (! setAccessible(constructor)) @@ -441,7 +441,7 @@ public class BeanMeta<T> { if (! name.isEmpty()) { if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name)) return name; - throw new BeanRuntimeException(classMeta.getInnerClass(), "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", name); + return null; // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties. } name = propertyNamer.getPropertyName(f.getName()); if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name)) @@ -604,9 +604,10 @@ public class BeanMeta<T> { n = bpName; if (! fixedBeanProps.isEmpty()) if (! fixedBeanProps.contains(n)) - throw new BeanRuntimeException(c, "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", n); + n = null; // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties } - l.add(new BeanMethod(n, isSetter, m)); + if (n != null) + l.add(new BeanMethod(n, isSetter, m)); } } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java index 6c84fd6..edf7ab2 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java @@ -129,7 +129,7 @@ public class BeanPropertyMeta { if (p != null) { swap = getPropertyPojoSwap(p); if (! p.properties().isEmpty()) - properties = split(p.properties(), ','); + properties = split(p.properties()); bdClasses.addAll(Arrays.asList(p.beanDictionary())); } } @@ -143,7 +143,7 @@ public class BeanPropertyMeta { if (swap == null) swap = getPropertyPojoSwap(p); if (properties != null && ! p.properties().isEmpty()) - properties = split(p.properties(), ','); + properties = split(p.properties()); bdClasses.addAll(Arrays.asList(p.beanDictionary())); } } @@ -157,7 +157,7 @@ public class BeanPropertyMeta { if (swap == null) swap = getPropertyPojoSwap(p); if (properties != null && ! p.properties().isEmpty()) - properties = split(p.properties(), ','); + properties = split(p.properties()); bdClasses.addAll(Arrays.asList(p.beanDictionary())); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/BeanSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java index 2e5ab64..cf957d0 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java @@ -488,7 +488,7 @@ public class BeanSession extends Session { else if (startsWith(value.toString(), '[')) return (T)toArray(type, new ObjectList(value.toString()).setBeanSession(this)); else - return (T)toArray(type, new ObjectList((Object[])StringUtils.split(value.toString(), ',')).setBeanSession(this)); + return (T)toArray(type, new ObjectList((Object[])StringUtils.split(value.toString())).setBeanSession(this)); } // Target type is some sort of Map that needs to be converted. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java index d3d4b87..5e00901 100644 --- a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java +++ b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java @@ -602,7 +602,7 @@ public class ObjectMap extends LinkedHashMap<String,Object> { */ public String[] getStringArray(String key) { String s = get(String.class, key); - return (s == null ? new String[0] : split(s, ',')); + return (s == null ? new String[0] : split(s)); } /** @@ -614,7 +614,7 @@ public class ObjectMap extends LinkedHashMap<String,Object> { */ public String[] getStringArray(String key, String[] def) { String s = get(String.class, key); - String[] r = (s == null ? new String[0] : split(s, ',')); + String[] r = (s == null ? new String[0] : split(s)); return (r.length == 0 ? def : r); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java index b874628..9f09744 100644 --- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java @@ -84,7 +84,7 @@ public final class HtmlDocSerializerSession extends HtmlSerializerSession { Map m = op.getMap(HTMLDOC_links, ctx.links); links = ObjectUtils.isEmpty(m) ? null : new LinkedHashMap(m); cssUrl = op.getString(HTMLDOC_cssUrl, ctx.cssUrl); - css = split(op.getString(HTMLDOC_css, null), ','); + css = split(op.getString(HTMLDOC_css, null)); nowrap = op.getBoolean(HTMLDOC_cssUrl, ctx.nowrap); noResultsMessage = op.getString(HTMLDOC_noResultsMessage, ctx.noResultsMessage); template = ClassUtils.newInstance(HtmlDocTemplate.class, op.get(HTMLDOC_template, ctx.template)); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java index a05cc0b..3571a97 100644 --- a/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java +++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java @@ -39,7 +39,7 @@ public class HeaderEntityValidatorArray { * @param value The raw header value. */ protected HeaderEntityValidatorArray(String value) { - String[] s = StringUtils.split(value, ','); + String[] s = StringUtils.split(value); this.value = new EntityValidator[s.length]; for (int i = 0; i < s.length; i++) { this.value[i] = new EntityValidator(s[i]); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java b/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java index 25a3046..78e15b8 100644 --- a/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java +++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java @@ -37,7 +37,7 @@ public class HeaderStringArray { * @param value The raw header value. */ protected HeaderStringArray(String value) { - this.value = StringUtils.split(value, ','); + this.value = StringUtils.split(value); } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/http/MediaTypeRange.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/http/MediaTypeRange.java b/juneau-core/src/main/java/org/apache/juneau/http/MediaTypeRange.java index 7ee7a16..4ef6ff2 100644 --- a/juneau-core/src/main/java/org/apache/juneau/http/MediaTypeRange.java +++ b/juneau-core/src/main/java/org/apache/juneau/http/MediaTypeRange.java @@ -69,7 +69,7 @@ public final class MediaTypeRange implements Comparable<MediaTypeRange> { Set<MediaTypeRange> ranges = new TreeSet<MediaTypeRange>(); - for (String r : StringUtils.split(value, ',')) { + for (String r : StringUtils.split(value)) { r = r.trim(); if (r.isEmpty()) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/http/StringRange.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/http/StringRange.java b/juneau-core/src/main/java/org/apache/juneau/http/StringRange.java index d347aec..4445909 100644 --- a/juneau-core/src/main/java/org/apache/juneau/http/StringRange.java +++ b/juneau-core/src/main/java/org/apache/juneau/http/StringRange.java @@ -75,7 +75,7 @@ public final class StringRange implements Comparable<StringRange> { Set<StringRange> ranges = new TreeSet<StringRange>(); - for (String r : StringUtils.split(value, ',')) { + for (String r : StringUtils.split(value)) { r = r.trim(); if (r.isEmpty()) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFile.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFile.java b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFile.java index 12c7dfc..2cef648 100644 --- a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFile.java +++ b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFile.java @@ -577,7 +577,7 @@ public abstract class ConfigFile implements Map<String,Section> { String s = getString(key); if (s == null) return def; - String[] r = StringUtils.isEmpty(s) ? new String[0] : split(s, ','); + String[] r = StringUtils.isEmpty(s) ? new String[0] : split(s); return r.length == 0 ? def : r; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java index 9ca1b5e..c0a5847 100644 --- a/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java +++ b/juneau-core/src/main/java/org/apache/juneau/internal/DateUtils.java @@ -107,6 +107,18 @@ public final class DateUtils { } /** + * Parses an ISO8601 string and converts it to a {@link Calendar}. + * + * @param s The string to parse. + * @return The parsed value, or <jk>null</jk> if the string was <jk>null</jk> or empty. + */ + public static Calendar parseISO8601Calendar(String s) { + if (StringUtils.isEmpty(s)) + return null; + return DatatypeConverter.parseDateTime(toValidISO8601DT(s)); + } + + /** * Formats the given date according to the RFC 1123 pattern. * * @param date The date to format. @@ -140,10 +152,6 @@ public final class DateUtils { DateFormatHolder.clearThreadLocal(); } - /** This class should not be instantiated. */ - private DateUtils() { - } - /** * A factory for {@link SimpleDateFormat}s. The instances are stored in a threadlocal way because SimpleDateFormat * is not threadsafe as noted in {@link SimpleDateFormat its javadoc}. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java index b91727c..4e78fd0 100644 --- a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java +++ b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java @@ -454,6 +454,16 @@ public final class StringUtils { } /** + * Shortcut for calling <code>split(s, <js>','</js>)</code> + * + * @param s The string to split. Can be <jk>null</jk>. + * @return The tokens, or <jk>null</jk> if the string was null. + */ + public static String[] split(String s) { + return split(s, ','); + } + + /** * Splits a character-delimited string into a string array. * Does not split on escaped-delimiters (e.g. "\,"); * Resulting tokens are trimmed of whitespace. @@ -470,7 +480,7 @@ public final class StringUtils { * * @param s The string to split. Can be <jk>null</jk>. * @param c The character to split on. - * @return The tokens. + * @return The tokens, or <jk>null</jk> if the string was null. */ public static String[] split(String s, char c) { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java index 6c94fc3..2eb4a5f 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java +++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java @@ -146,7 +146,7 @@ public abstract class Parser extends CoreObject { if (c == null) throw new RuntimeException(MessageFormat.format("Class ''{0}'' is missing the @Consumes annotation", getClass().getName())); - String[] mt = split(c.value(), ','); + String[] mt = split(c.value()); this.mediaTypes = new MediaType[mt.length]; for (int i = 0; i < mt.length; i++) { mediaTypes[i] = MediaType.forString(mt[i]); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java index 8350093..5e6e5a5 100644 --- a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java +++ b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java @@ -56,7 +56,7 @@ public abstract class Serializer extends CoreObject { if (p == null) throw new RuntimeException(MessageFormat.format("Class ''{0}'' is missing the @Produces annotation", getClass().getName())); - String[] mt = split(p.value(), ','); + String[] mt = split(p.value()); this.mediaTypes = new MediaType[mt.length]; for (int i = 0; i < mt.length; i++) { mediaTypes[i] = MediaType.forString(mt[i]); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/svl/DefaultingVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/DefaultingVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/DefaultingVar.java index 3d5d6da..a1142c2 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/DefaultingVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/DefaultingVar.java @@ -40,7 +40,7 @@ public abstract class DefaultingVar extends SimpleVar { int i = s.indexOf(','); if (i == -1) return resolve(session, s.trim()); - String[] s2 = split(s, ','); + String[] s2 = split(s); String v = resolve(session, s2[0]); if (v == null) v = s2[1]; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/svl/MultipartVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/MultipartVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/MultipartVar.java index c360eb9..43cb6f7 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/MultipartVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/MultipartVar.java @@ -43,7 +43,7 @@ public abstract class MultipartVar extends SimpleVar { @Override /* Var */ public String resolve(VarResolverSession session, String s) { - String[] s2 = s.indexOf(',') == -1 ? new String[]{s.trim()} : split(s, ','); + String[] s2 = s.indexOf(',') == -1 ? new String[]{s.trim()} : split(s); return resolve(session, s2); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java b/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java index 4c1956e..4b31f35 100644 --- a/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java +++ b/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java @@ -41,7 +41,7 @@ public final class AnnotationBeanFilterBuilder extends BeanFilterBuilder { Bean b = li.previous(); if (! b.properties().isEmpty()) - properties(split(b.properties(), ',')); + properties(split(b.properties())); if (! b.typeName().isEmpty()) typeName(b.typeName()); @@ -50,7 +50,7 @@ public final class AnnotationBeanFilterBuilder extends BeanFilterBuilder { sortProperties(true); if (! b.excludeProperties().isEmpty()) - excludeProperties(split(b.excludeProperties(), ',')); + excludeProperties(split(b.excludeProperties())); if (b.propertyNamer() != PropertyNamerDefault.class) propertyNamer(b.propertyNamer()); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java b/juneau-core/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java index 80f49cf..5e7faa1 100644 --- a/juneau-core/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java +++ b/juneau-core/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java @@ -44,7 +44,7 @@ public class InterfaceBeanFilterBuilder extends BeanFilterBuilder { Bean b = li.previous(); if (! b.properties().isEmpty()) - properties(split(b.properties(), ',')); + properties(split(b.properties())); if (! b.typeName().isEmpty()) typeName(b.typeName()); @@ -53,7 +53,7 @@ public class InterfaceBeanFilterBuilder extends BeanFilterBuilder { sortProperties(true); if (! b.excludeProperties().isEmpty()) - excludeProperties(split(b.excludeProperties(), ',')); + excludeProperties(split(b.excludeProperties())); try { if (b.propertyNamer() != PropertyNamerDefault.class) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java b/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java index 3c486c7..b44297a 100644 --- a/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java +++ b/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java @@ -77,7 +77,7 @@ public class SearchArgs { */ public Builder search(String searchTerms) { if (searchTerms != null) { - for (String s : StringUtils.split(searchTerms, ',')) { + for (String s : StringUtils.split(searchTerms)) { int i = StringUtils.indexOf(s, '=', '>', '<'); if (i == -1) throw new RuntimeException("Invalid search terms: '"+searchTerms+"'"); @@ -122,7 +122,7 @@ public class SearchArgs { */ public Builder view(String columns) { if (columns != null) - return view(Arrays.asList(StringUtils.split(columns, ','))); + return view(Arrays.asList(StringUtils.split(columns))); return this; } @@ -162,7 +162,7 @@ public class SearchArgs { */ public Builder sort(String sortArgs) { if (sortArgs != null) - sort(Arrays.asList(StringUtils.split(sortArgs, ','))); + sort(Arrays.asList(StringUtils.split(sortArgs))); return this; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-core/src/main/javadoc/overview.html ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/javadoc/overview.html b/juneau-core/src/main/javadoc/overview.html index 15aa1eb..31cf85f 100644 --- a/juneau-core/src/main/javadoc/overview.html +++ b/juneau-core/src/main/javadoc/overview.html @@ -6184,12 +6184,18 @@ <br>Search columns containing lists and maps. <br>Sort columns containing lists and maps. <li>New {@link org.apache.juneau.remoteable.RemoteMethod#returns()} annotation. + <li>Fixed bugs with {@link org.apache.juneau.BeanContext#BEAN_includeProperties} and {@link org.apache.juneau.BeanContext#BEAN_excludeProperties} settings. </ul> <h6 class='topic'>org.apache.juneau.rest</h6> <ul class='spaced-list'> - <li>{@link org.apache.juneau.rest.widgets.QueryWidget} improvements. + <li>{@link org.apache.juneau.rest.widget.QueryWidget} improvements. <br>Fields are prefilled with current search arguments. + <li>Two convenience methods added to {@link org.apache.juneau.rest.RestRequest}: + <ul> + <li>{@link org.apache.juneau.rest.RestRequest#attr(String,Object) attr(String,Object)} + <li>{@link org.apache.juneau.rest.RestRequest#prop(String,Object) prop(String,Object)} + </ul> </ul> </div> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java index a4e4953..931d4d9 100755 --- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java +++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java @@ -366,7 +366,7 @@ public class RestMicroservice extends Microservice { // We're using Jetty 8 that doesn't allow regular expression matching in SslContextFactory.setExcludeCipherSuites(), // so to prevent having the config file list all old cipher suites, exclude the known bad ones. String[] excludeCipherSuites = combine( - split("SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA", ','), + split("SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA"), sslContextFactory.getExcludeCipherSuites() ); sslContextFactory.setExcludeCipherSuites(excludeCipherSuites); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java index 6d06825..5f8d1e9 100644 --- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java @@ -534,8 +534,6 @@ public class RestClient extends CoreObject { String path = r == null ? "" : trimSlashes(r.path()); if (path.indexOf("://") == -1) { - if (path.isEmpty()) - path = interfaceClass.getName(); if (rootUrl == null) throw new RemoteableMetadataException(interfaceClass, "Root URI has not been specified. Cannot construct absolute path to remoteable proxy."); path = trimSlashes(rootUrl) + '/' + path; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java index ed1d272..55d3a1c 100644 --- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java @@ -219,7 +219,7 @@ public class RestClientBuilder extends CoreObjectBuilder { default: throw new RuntimeException("Programmer error"); } - for (String p : split(sslOpts.getProtocols(), ',')) { + for (String p : split(sslOpts.getProtocols())) { try { TrustManager tm = new SimpleX509TrustManager(sslOpts.getCertValidate() == SSLOpts.CertValidate.LAX); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/BpIncludesResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/BpIncludesResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/BpIncludesResource.java new file mode 100644 index 0000000..8960870 --- /dev/null +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/BpIncludesResource.java @@ -0,0 +1,140 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest.test; + +import org.apache.juneau.annotation.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.rest.jena.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testBpIncludes" +) +public class BpIncludesResource extends RestServletJenaDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Validates that the @RestMethod(bpIncludes,bpExcludes) properties work. + //==================================================================================================== + + @RestMethod(name="GET", path="/test/a1", bpIncludes="{MyBeanA:'a,_b'}") + public Object testA1() throws Exception { + return new MyBeanA().init(); + } + + @RestMethod(name="GET", path="/test/a2", bpIncludes="{MyBeanA:'a'}") + public Object testA2() throws Exception { + return new MyBeanA().init(); + } + + @RestMethod(name="GET", path="/test/a3", bpIncludes="{MyBeanA:'_b'}") + public Object testA3() throws Exception { + return new MyBeanA().init(); + } + + @RestMethod(name="GET", path="/test/a4", bpExcludes="{MyBeanA:'a'}") + public Object testA4() throws Exception { + return new MyBeanA().init(); + } + + @RestMethod(name="GET", path="/test/a5", bpExcludes="{MyBeanA:'_b'}") + public Object testA5() throws Exception { + return new MyBeanA().init(); + } + + @RestMethod(name="GET", path="/test/a6", bpExcludes="{MyBeanA:'a,_b'}") + public Object testA6() throws Exception { + return new MyBeanA().init(); + } + + @RestMethod(name="GET", path="/test/b1", bpIncludes="{MyBeanB:'a,_b'}") + public Object testB1() throws Exception { + return new MyBeanB().init(); + } + + @RestMethod(name="GET", path="/test/b2", bpIncludes="{MyBeanB:'a'}") + public Object testB2() throws Exception { + return new MyBeanB().init(); + } + + @RestMethod(name="GET", path="/test/b3", bpIncludes="{MyBeanB:'_b'}") + public Object testB3() throws Exception { + return new MyBeanB().init(); + } + + @RestMethod(name="GET", path="/test/b4", bpExcludes="{MyBeanB:'a'}") + public Object testB4() throws Exception { + return new MyBeanB().init(); + } + + @RestMethod(name="GET", path="/test/b5", bpExcludes="{MyBeanB:'_b'}") + public Object testB5() throws Exception { + return new MyBeanB().init(); + } + + @RestMethod(name="GET", path="/test/b6", bpExcludes="{MyBeanB:'a,_b'}") + public Object testB6() throws Exception { + return new MyBeanB().init(); + } + + @RestMethod(name="GET", path="/test/c1", bpIncludes="{*:'a'}") + public Object testC1() throws Exception { + return new MyBeanA().init(); + } + + @RestMethod(name="GET", path="/test/c2", bpIncludes="{org.apache.juneau.rest.test.BpIncludesResource$MyBeanA:'a'}") + public Object testC2() throws Exception { + return new MyBeanA().init(); + } + + // Should not match. + @RestMethod(name="GET", path="/test/d1", bpIncludes="{MyBean:'a'}") + public Object testD1() throws Exception { + return new MyBeanA().init(); + } + + // Should not match. + @RestMethod(name="GET", path="/test/d2", bpIncludes="{MyBean*:'a'}") + public Object testD2() throws Exception { + return new MyBeanA().init(); + } + + //------------------------------------------------------------------------------------------------------------------- + // Beans + //------------------------------------------------------------------------------------------------------------------- + + public static class MyBeanA { + public int a; + @BeanProperty("_b") public String b; + + MyBeanA init() { + a = 1; + b = "foo"; + return this; + } + } + + @Bean(properties="_b,a") + public static class MyBeanB { + public int a; + @BeanProperty("_b") public String b; + + MyBeanB init() { + a = 1; + b = "foo"; + return this; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java index 3bee867..130611d 100644 --- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java @@ -22,6 +22,7 @@ import org.apache.juneau.rest.labels.*; children={ AcceptCharsetResource.class, BeanContextPropertiesResource.class, + BpIncludesResource.class, CallbackStringsResource.class, CharsetEncodingsResource.class, ClientFuturesResource.class, http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/TestUtils.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/TestUtils.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/TestUtils.java index 102c17e..a25626c 100644 --- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/TestUtils.java +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/TestUtils.java @@ -13,12 +13,14 @@ package org.apache.juneau.rest.test; import java.text.*; +import java.util.*; import org.apache.juneau.json.*; import org.apache.juneau.rest.client.*; import org.apache.juneau.serializer.*; import org.apache.juneau.transforms.*; import org.junit.Assert; +import org.junit.ComparisonFailure; import junit.framework.*; @@ -76,4 +78,18 @@ public class TestUtils { System.err.println(r); // NOT DEBUG System.err.println("*** Response-End ***********************************************************************************"); // NOT DEBUG } + + public static void assertEqualsAfterSort(String expected, String actual, String msg, Object...args) { + String[] e = expected.trim().split("\n"), a = actual.trim().split("\n"); + + if (e.length != a.length) + throw new ComparisonFailure(MessageFormat.format(msg, args), expected, actual); + + Arrays.sort(e); + Arrays.sort(a); + + for (int i = 0; i < e.length; i++) + if (! e[i].equals(a[i])) + throw new ComparisonFailure(MessageFormat.format(msg, args), expected, actual); + } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BpIncludesTest.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BpIncludesTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BpIncludesTest.java new file mode 100644 index 0000000..7439d37 --- /dev/null +++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BpIncludesTest.java @@ -0,0 +1,253 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest.test; + +import static org.junit.Assert.*; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.msgpack.*; +import org.apache.juneau.rest.client.*; +import org.junit.*; +import org.junit.runner.*; +import org.junit.runners.*; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@RunWith(Parameterized.class) +public class BpIncludesTest extends RestTestcase { + + @Parameterized.Parameters + public static Collection<Object[]> getParameters() { + return Arrays.asList(new Object[][] { + { /* 0 */ + "a1", + "{a:1,_b:'foo'}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a><_b>foo</_b></object>", + "<table><tr><td>a</td><td>1</td></tr><tr><td>_b</td><td>foo</td></tr></table>", + "(a=1,_b=foo)", + "a=1&_b=foo", + "{a:1,_b:'foo'}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 1 */ + "a2", + "{a:1}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a></object>", + "<table><tr><td>a</td><td>1</td></tr></table>", + "(a=1)", + "a=1", + "{a:1}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 2 */ + "a3", + "{_b:'foo'}", + "<?xml version='1.0' encoding='UTF-8'?><object><_b>foo</_b></object>", + "<table><tr><td>_b</td><td>foo</td></tr></table>", + "(_b=foo)", + "_b=foo", + "{_b:'foo'}", + "<rdf:RDF>\n<rdf:Description>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 3 */ + "a4", + "{_b:'foo'}", + "<?xml version='1.0' encoding='UTF-8'?><object><_b>foo</_b></object>", + "<table><tr><td>_b</td><td>foo</td></tr></table>", + "(_b=foo)", + "_b=foo", + "{_b:'foo'}", + "<rdf:RDF>\n<rdf:Description>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 4 */ + "a5", + "{a:1}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a></object>", + "<table><tr><td>a</td><td>1</td></tr></table>", + "(a=1)", + "a=1", + "{a:1}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 5 */ + "a6", + "{}", + "<?xml version='1.0' encoding='UTF-8'?><object/>", + "<table></table>", + "()", + "", + "{}", + "<rdf:RDF>\n</rdf:RDF>" + }, + { /* 6 */ + "b1", + "{_b:'foo',a:1}", + "<?xml version='1.0' encoding='UTF-8'?><object><_b>foo</_b><a>1</a></object>", + "<table><tr><td>_b</td><td>foo</td></tr><tr><td>a</td><td>1</td></tr></table>", + "(_b=foo,a=1)", + "_b=foo&a=1", + "{_b:'foo',a:1}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 7 */ + "b2", + "{a:1}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a></object>", + "<table><tr><td>a</td><td>1</td></tr></table>", + "(a=1)", + "a=1", + "{a:1}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 8 */ + "b3", + "{_b:'foo'}", + "<?xml version='1.0' encoding='UTF-8'?><object><_b>foo</_b></object>", + "<table><tr><td>_b</td><td>foo</td></tr></table>", + "(_b=foo)", + "_b=foo", + "{_b:'foo'}", + "<rdf:RDF>\n<rdf:Description>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 9 */ + "b4", + "{_b:'foo'}", + "<?xml version='1.0' encoding='UTF-8'?><object><_b>foo</_b></object>", + "<table><tr><td>_b</td><td>foo</td></tr></table>", + "(_b=foo)", + "_b=foo", + "{_b:'foo'}", + "<rdf:RDF>\n<rdf:Description>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 10 */ + "b5", + "{a:1}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a></object>", + "<table><tr><td>a</td><td>1</td></tr></table>", + "(a=1)", + "a=1", + "{a:1}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 11 */ + "b6", + "{}", + "<?xml version='1.0' encoding='UTF-8'?><object/>", + "<table></table>", + "()", + "", + "{}", + "<rdf:RDF>\n</rdf:RDF>" + }, + { /* 12 */ + "c1", + "{a:1}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a></object>", + "<table><tr><td>a</td><td>1</td></tr></table>", + "(a=1)", + "a=1", + "{a:1}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 13 */ + "c2", + "{a:1}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a></object>", + "<table><tr><td>a</td><td>1</td></tr></table>", + "(a=1)", + "a=1", + "{a:1}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 14 */ + "d1", + "{a:1,_b:'foo'}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a><_b>foo</_b></object>", + "<table><tr><td>a</td><td>1</td></tr><tr><td>_b</td><td>foo</td></tr></table>", + "(a=1,_b=foo)", + "a=1&_b=foo", + "{a:1,_b:'foo'}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + }, + { /* 15 */ + "d2", + "{a:1,_b:'foo'}", + "<?xml version='1.0' encoding='UTF-8'?><object><a>1</a><_b>foo</_b></object>", + "<table><tr><td>a</td><td>1</td></tr><tr><td>_b</td><td>foo</td></tr></table>", + "(a=1,_b=foo)", + "a=1&_b=foo", + "{a:1,_b:'foo'}", + "<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:_b>foo</jp:_b>\n</rdf:Description>\n</rdf:RDF>" + } + }); + } + + private String label; + private String json, xml, html, uon, urlEnc, msgPack, rdfXml; + private RestClient client = TestMicroservice.DEFAULT_CLIENT; + + public BpIncludesTest(String label, String json, String xml, String html, String uon, String urlEnc, String msgPack, String rdfXml) { + this.label = label; + this.json = json; + this.xml = xml; + this.html = html; + this.uon = uon; + this.urlEnc = urlEnc; + this.msgPack = msgPack; + this.rdfXml = rdfXml; + } + + @Test + public void a01_json() throws Exception { + String r = client.doGet("/testBpIncludes/test/" + label).accept("text/json+simple").getResponseAsString(); + assertEquals(json, r); + } + + @Test + public void a02_xml() throws Exception { + String r = client.doGet("/testBpIncludes/test/" + label).accept("text/xml").getResponseAsString().replace('"', '\''); + assertEquals(xml, r); + } + + @Test + public void a03_html() throws Exception { + String r = client.doGet("/testBpIncludes/test/" + label).accept("text/html+stripped").getResponseAsString(); + assertEquals(html, r); + } + + @Test + public void a04_uon() throws Exception { + String r = client.doGet("/testBpIncludes/test/" + label).accept("text/uon").getResponseAsString(); + assertEquals(uon, r); + } + + @Test + public void a05_urlEnc() throws Exception { + String r = client.doGet("/testBpIncludes/test/" + label).accept("application/x-www-form-urlencoded").getResponseAsString(); + assertEquals(urlEnc, r); + } + + @Test + public void a06_msgPack() throws Exception { + String r = client.doGet("/testBpIncludes/test/" + label).accept("octal/msgpack").parser(MsgPackParser.DEFAULT).getResponse(ObjectMap.class).toString(); + assertEquals(msgPack, r); + } + + @Test + public void a07_rdfXml() throws Exception { + String r = client.doGet("/testBpIncludes/test/" + label).accept("text/xml+rdf+abbrev").getResponseAsString(); + r = r.replaceAll("<rdf:RDF[^>]*>", "<rdf:RDF>").replace('"', '\''); + TestUtils.assertEqualsAfterSort(rdfXml, r, "a07_rdfXml failed"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java index 207e312..9376f0f 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java @@ -146,11 +146,13 @@ class CallMethod implements Comparable<CallMethod> { @SuppressWarnings({ "unchecked", "rawtypes" }) private Builder(Object servlet, java.lang.reflect.Method method, RestContext context) throws RestServletException { + String sig = method.getDeclaringClass().getName() + '.' + method.getName(); + try { RestMethod m = method.getAnnotation(RestMethod.class); if (m == null) - throw new RestServletException("@RestMethod annotation not found on method ''{0}.{1}''", method.getDeclaringClass().getName(), method.getName()); + throw new RestServletException("@RestMethod annotation not found on method ''{0}''", sig); if (! m.description().isEmpty()) description = m.description(); @@ -260,9 +262,17 @@ class CallMethod implements Comparable<CallMethod> { for (Property p1 : m.properties()) sgb.property(p1.name(), p1.value()); if (! m.bpIncludes().isEmpty()) - sgb.includeProperties((Map)JsonParser.DEFAULT.parse(m.bpIncludes(), Map.class, String.class, String.class)); + try { + sgb.includeProperties((Map)JsonParser.DEFAULT.parse(m.bpIncludes(), Map.class, String.class, String.class)); + } catch (ParseException e) { + throw new RestServletException("Invalid format for @RestMethod.bpIncludes() on method ''{0}''. Must be a valid JSON object. \nValue: {1}", sig, m.bpIncludes()); + } if (! m.bpExcludes().isEmpty()) - sgb.excludeProperties((Map)JsonParser.DEFAULT.parse(m.bpExcludes(), Map.class, String.class, String.class)); + try { + sgb.excludeProperties((Map)JsonParser.DEFAULT.parse(m.bpExcludes(), Map.class, String.class, String.class)); + } catch (ParseException e) { + throw new RestServletException("Invalid format for @RestMethod.bpExcludes() on method ''{0}''. Must be a valid JSON object. \nValue: {1}", sig, m.bpExcludes()); + } sgb.beanFilters(m.beanFilters()); sgb.pojoSwaps(m.pojoSwaps()); } @@ -304,7 +314,7 @@ class CallMethod implements Comparable<CallMethod> { try { g.append(c); } catch (Exception e) { - throw new RestServletException("Exception occurred while trying to instantiate Encoder ''{0}''", c.getSimpleName()).initCause(e); + throw new RestServletException("Exception occurred while trying to instantiate Encoder on method ''{0}'': ''{1}''", sig, c.getSimpleName()).initCause(e); } } encoders = g.build(); @@ -314,7 +324,7 @@ class CallMethod implements Comparable<CallMethod> { for (String s : m.defaultRequestHeaders()) { String[] h = RestUtils.parseKeyValuePair(s); if (h == null) - throw new RestServletException("Invalid default request header specified: ''{0}''. Must be in the format: ''name[:=]value''", s); + throw new RestServletException("Invalid default request header specified on method ''{0}'': ''{1}''. Must be in the format: ''name[:=]value''", sig, s); defaultRequestHeaders.put(h[0], h[1]); } @@ -322,7 +332,7 @@ class CallMethod implements Comparable<CallMethod> { for (String s : m.defaultQuery()) { String[] h = RestUtils.parseKeyValuePair(s); if (h == null) - throw new RestServletException("Invalid default query parameter specified: ''{0}''. Must be in the format: ''name[:=]value''", s); + throw new RestServletException("Invalid default query parameter specified on method ''{0}'': ''{1}''. Must be in the format: ''name[:=]value''", sig, s); defaultQuery.put(h[0], h[1]); } @@ -330,7 +340,7 @@ class CallMethod implements Comparable<CallMethod> { for (String s : m.defaultFormData()) { String[] h = RestUtils.parseKeyValuePair(s); if (h == null) - throw new RestServletException("Invalid default form data parameter specified: ''{0}''. Must be in the format: ''name[:=]value''", s); + throw new RestServletException("Invalid default form data parameter specified on method ''{0}'': ''{1}''. Must be in the format: ''name[:=]value''", sig, s); defaultFormData.put(h[0], h[1]); } @@ -376,7 +386,7 @@ class CallMethod implements Comparable<CallMethod> { } catch (RestServletException e) { throw e; } catch (Exception e) { - throw new RestServletException("Exception occurred while initializing method ''{0}''", method.getName()).initCause(e); + throw new RestServletException("Exception occurred while initializing method ''{0}''", sig).initCause(e); } } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest/src/main/java/org/apache/juneau/rest/RequestHeaders.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RequestHeaders.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RequestHeaders.java index ea2d9de..992f954 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RequestHeaders.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RequestHeaders.java @@ -271,7 +271,7 @@ public class RequestHeaders extends TreeMap<String,String[]> { * @return A new headers object. */ public RequestHeaders subset(String headers) { - return subset(split(headers, ',')); + return subset(split(headers)); } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java index feadcdc..c04c22d 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java @@ -631,7 +631,7 @@ public final class RestContext extends Context { defaultCharset = ps.getProperty(REST_defaultCharset, String.class, "utf-8"); paramFormat = ps.getProperty(REST_paramFormat, String.class, ""); - for (String m : split(ps.getProperty(REST_allowMethodParam, String.class, ""), ',')) + for (String m : split(ps.getProperty(REST_allowMethodParam, String.class, ""))) if (m.equals("true")) // For backwards compatibility when this was a boolean field. allowMethodParams.add("*"); else @@ -701,7 +701,7 @@ public final class RestContext extends Context { for (Object o : sc.styleSheets) { if (o instanceof Pair) { Pair<Class<?>,String> p = (Pair<Class<?>,String>)o; - for (String path : split(vr.resolve(StringUtils.toString(p.second())), ',')) + for (String path : split(vr.resolve(StringUtils.toString(p.second())))) if (path.startsWith("file://")) contents.add(new FileInputStream(path)); else http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java index faf062d..a77766d 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java @@ -213,6 +213,18 @@ public final class RestRequest extends HttpServletRequestWrapper { return (o == null ? def : o); } + /** + * Shorthand method for calling {@link #setAttribute(String, Object)} fluently. + * + * @param name The request attribute name. + * @param value The request attribute value. + * @return This object (for method chaining). + */ + public RestRequest attr(String name, Object value) { + setAttribute(name, value); + return this; + } + //-------------------------------------------------------------------------------- // Properties @@ -236,6 +248,18 @@ public final class RestRequest extends HttpServletRequestWrapper { public ObjectMap getProperties() { return this.properties; } + + /** + * Shortcut for calling <code>getProperties().append(name, value);</code> fluently. + * + * @param name The property name. + * @param value The property value. + * @return This object (for method chaining). + */ + public RestRequest prop(String name, Object value) { + this.properties.append(name, value); + return this; + } //-------------------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java index 7e6d98b..52d01b4 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java @@ -240,6 +240,12 @@ public abstract class RestServlet extends HttpServlet { protected void log(Level level, Throwable cause, String msg, Object...args) { if (context != null) context.getLogger().log(level, cause, msg, args); + else { + // If context failed to initialize, log to the console. + System.err.println(MessageFormat.format(msg, args)); + if (cause != null) + cause.printStackTrace(); + } } @Override /* GenericServlet */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d05dd4b1/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java index db22a53..da6f78f 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java @@ -51,7 +51,7 @@ public class SerializedRequestAttrVar extends StreamedVar { int i = key.indexOf(','); if (i == -1) throw new RuntimeException("Invalid format for $SA var. Must be of the format $SA{contentType,key[,defaultValue]}"); - String[] s2 = split(key, ','); + String[] s2 = split(key); RestRequest req = session.getSessionObject(RestRequest.class, RequestVar.SESSION_req); if (req != null) { Object o = req.getAttribute(key);
