Repository: incubator-juneau Updated Branches: refs/heads/master 9c746e647 -> 593f92b22
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/593f92b2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/593f92b2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/593f92b2 Branch: refs/heads/master Commit: 593f92b2272c8d384d756c47ac37763c0cf783a6 Parents: 9c746e6 Author: JamesBognar <jamesbog...@apache.org> Authored: Mon Oct 9 19:21:46 2017 -0400 Committer: JamesBognar <jamesbog...@apache.org> Committed: Mon Oct 9 19:21:46 2017 -0400 ---------------------------------------------------------------------- .../apache/juneau/svl/ResolvingObjectMap.java | 72 +--------------- .../apache/juneau/svl/VarResolverSession.java | 89 +++++++++++++++++++- .../org/apache/juneau/rest/RestRequest.java | 8 +- 3 files changed, 91 insertions(+), 78 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/593f92b2/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/ResolvingObjectMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/ResolvingObjectMap.java b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/ResolvingObjectMap.java index 0890e52..a31ae91 100644 --- a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/ResolvingObjectMap.java +++ b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/ResolvingObjectMap.java @@ -12,9 +12,6 @@ // *************************************************************************************************************************** package org.apache.juneau.svl; -import java.lang.reflect.*; -import java.util.*; - import org.apache.juneau.*; /** @@ -32,7 +29,7 @@ import org.apache.juneau.*; * <p> * All other data types are left as-is. */ -@SuppressWarnings({"serial","unchecked","rawtypes"}) +@SuppressWarnings({"serial"}) public class ResolvingObjectMap extends ObjectMap { private final VarResolverSession varResolver; @@ -49,71 +46,6 @@ public class ResolvingObjectMap extends ObjectMap { @Override /* Map */ public Object get(Object key) { - return resolve(super.get(key)); - } - - private Object resolve(Object o) { - if (o == null) - return null; - if (o instanceof CharSequence) - return varResolver.resolve(o.toString()); - if (o.getClass().isArray()) { - if (! containsVars(o)) - return o; - Object o2 = Array.newInstance(o.getClass().getComponentType(), Array.getLength(o)); - for (int i = 0; i < Array.getLength(o); i++) - Array.set(o2, i, resolve(Array.get(o, i))); - return o2; - } - if (o instanceof Collection) { - try { - Collection c = (Collection)o; - if (! containsVars(c)) - return o; - Collection c2 = c.getClass().newInstance(); - for (Object o2 : c) - c2.add(resolve(o2)); - return c2; - } catch (Exception e) { - return o; - } - } - if (o instanceof Map) { - try { - Map m = (Map)o; - if (! containsVars(m)) - return o; - Map m2 = m.getClass().newInstance(); - for (Map.Entry e : (Set<Map.Entry>)m.entrySet()) - m2.put(e.getKey(), resolve(e.getValue())); - return m2; - } catch (Exception e) { - return o; - } - } - return o; - } - - private static boolean containsVars(Object array) { - for (int i = 0; i < Array.getLength(array); i++) { - Object o = Array.get(array, i); - if (o instanceof CharSequence && o.toString().contains("$")) - return true; - } - return false; - } - - private static boolean containsVars(Collection c) { - for (Object o : c) - if (o instanceof CharSequence && o.toString().contains("$")) - return true; - return false; - } - - private static boolean containsVars(Map m) { - for (Object o : m.values()) - if (o instanceof CharSequence && o.toString().contains("$")) - return true; - return false; + return varResolver.resolve(super.get(key)); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/593f92b2/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverSession.java b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverSession.java index f9da289..65b847b 100644 --- a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverSession.java +++ b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverSession.java @@ -15,6 +15,7 @@ package org.apache.juneau.svl; import static org.apache.juneau.internal.StringUtils.*; import java.io.*; +import java.lang.reflect.*; import java.util.*; import org.apache.juneau.*; @@ -71,7 +72,7 @@ public class VarResolverSession { /** * Resolve all variables in the specified string. * - * @param s + * @param s * The string to resolve variables in. * @return * The new string with all variables resolved, or the same string if no variables were found. @@ -116,6 +117,92 @@ public class VarResolverSession { } } + /** + * Convenience method for resolving variables in arbitrary objects. + * + * <p> + * Supports resolving variables in the following object types: + * <ul> + * <li>{@link CharSequence} + * <li>Arrays containing values of type {@link CharSequence}. + * <li>Collections containing values of type {@link CharSequence}. + * <br>Collection class must have a no-arg constructor. + * <li>Maps containing values of type {@link CharSequence}. + * <br>Map class must have a no-arg constructor. + * </ul> + * + * @param o The object. + * @return The same object if no resolution was needed, otherwise a new object or data structure if resolution was + * needed. + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public <T> T resolve(T o) { + if (o == null) + return null; + if (o instanceof CharSequence) + return (T)resolve(o.toString()); + if (o.getClass().isArray()) { + if (! containsVars(o)) + return o; + Object o2 = Array.newInstance(o.getClass().getComponentType(), Array.getLength(o)); + for (int i = 0; i < Array.getLength(o); i++) + Array.set(o2, i, resolve(Array.get(o, i))); + return (T)o2; + } + if (o instanceof Collection) { + try { + Collection c = (Collection)o; + if (! containsVars(c)) + return o; + Collection c2 = c.getClass().newInstance(); + for (Object o2 : c) + c2.add(resolve(o2)); + return (T)c2; + } catch (Exception e) { + return o; + } + } + if (o instanceof Map) { + try { + Map m = (Map)o; + if (! containsVars(m)) + return o; + Map m2 = m.getClass().newInstance(); + for (Map.Entry e : (Set<Map.Entry>)m.entrySet()) + m2.put(e.getKey(), resolve(e.getValue())); + return (T)m2; + } catch (Exception e) { + return o; + } + } + return o; + } + + private static boolean containsVars(Object array) { + for (int i = 0; i < Array.getLength(array); i++) { + Object o = Array.get(array, i); + if (o instanceof CharSequence && o.toString().contains("$")) + return true; + } + return false; + } + + @SuppressWarnings("rawtypes") + private static boolean containsVars(Collection c) { + for (Object o : c) + if (o instanceof CharSequence && o.toString().contains("$")) + return true; + return false; + } + + @SuppressWarnings("rawtypes") + private static boolean containsVars(Map m) { + for (Object o : m.values()) + if (o instanceof CharSequence && o.toString().contains("$")) + return true; + return false; + } + /* * Checks to see if string is of the simple form "$X{...}" with no embedded variables. * This is a common case, and we can avoid using StringWriters. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/593f92b2/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java ---------------------------------------------------------------------- diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java index e635521..30c2180 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java @@ -964,13 +964,7 @@ public final class RestRequest extends HttpServletRequestWrapper { * @return A copy of the array with variables resolved. */ public String[] resolveVars(String[] input) { - VarResolverSession vs = getVarResolverSession(); - if (input == null || input.length == 0) - return input; - input = Arrays.copyOf(input, input.length); - for (int i = 0; i < input.length; i++) - input[i] = vs.resolve(input[i]); - return input; + return getVarResolverSession().resolve(input); } /**