Return-Path: X-Original-To: apmail-abdera-commits-archive@www.apache.org Delivered-To: apmail-abdera-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id CBE259E68 for ; Mon, 31 Oct 2011 23:45:05 +0000 (UTC) Received: (qmail 83204 invoked by uid 500); 31 Oct 2011 23:45:05 -0000 Delivered-To: apmail-abdera-commits-archive@abdera.apache.org Received: (qmail 83174 invoked by uid 500); 31 Oct 2011 23:45:05 -0000 Mailing-List: contact commits-help@abdera.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@abdera.apache.org Delivered-To: mailing list commits@abdera.apache.org Received: (qmail 83167 invoked by uid 99); 31 Oct 2011 23:45:05 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 31 Oct 2011 23:45:05 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 31 Oct 2011 23:45:03 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id B18842388AA9 for ; Mon, 31 Oct 2011 23:44:43 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1195721 - in /abdera/abdera2: activities/src/main/java/org/apache/abdera2/activities/extra/ common/src/main/java/org/apache/abdera2/common/misc/ common/src/main/java/org/apache/abdera2/common/text/ Date: Mon, 31 Oct 2011 23:44:43 -0000 To: commits@abdera.apache.org From: jmsnell@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111031234443.B18842388AA9@eris.apache.org> Author: jmsnell Date: Mon Oct 31 23:43:57 2011 New Revision: 1195721 URL: http://svn.apache.org/viewvc?rev=1195721&view=rev Log: (empty) Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MorePredicates.java abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/Codec.java abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/UrlEncoding.java Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java?rev=1195721&r1=1195720&r2=1195721&view=diff ============================================================================== --- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java (original) +++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java Mon Oct 31 23:43:57 2011 @@ -1,19 +1,28 @@ package org.apache.abdera2.activities.extra; +import java.lang.reflect.Method; import java.util.Comparator; +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + import org.apache.abdera2.activities.model.ASObject; import org.apache.abdera2.activities.model.Activity; import org.apache.abdera2.activities.model.Activity.Audience; import org.apache.abdera2.activities.model.IO; import org.apache.abdera2.activities.model.Verb; +import org.apache.abdera2.common.anno.AnnoUtil; +import org.apache.abdera2.common.anno.Name; import org.apache.abdera2.common.date.DateTimes; +import org.apache.abdera2.common.misc.MoreFunctions; import org.apache.abdera2.common.selector.AbstractSelector; import org.apache.abdera2.common.selector.PropertySelector; import org.apache.abdera2.common.selector.Selector; import org.apache.abdera2.common.selector.MultiSelector; import org.joda.time.DateTime; +import com.google.common.base.CaseFormat; import com.google.common.base.Equivalence; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -764,4 +773,104 @@ public class Extra { return innerCompare(d1,d2); } } + + + private static String get_name(Method obj) { + String name = null; + if (obj.isAnnotationPresent(Name.class)) + name = obj.getAnnotation(Name.class).value(); + else { + name = obj.getName(); + if (name.startsWith("get") || + name.startsWith("set")) + name = name.substring(3); + name = CaseFormat.UPPER_CAMEL.to( + CaseFormat.LOWER_CAMEL, name); + } + return name; + } + + /** + * Uses cglib to create an extension of the base ASObject type + * that implements the given interface. All setter/getter methods + * on the supplied interface will be mapped to properties on the + * underlying ASObject.. for instance, getFoo() and setFoo(..) will + * be mapped to a "foo" property + */ + public static T extend( + Class type, + Class base) { + checkNotNull(type); + Enhancer e = new Enhancer(); + if (type.isInterface()) { + e.setSuperclass(base); + e.setInterfaces(MoreFunctions.array(type)); + } else if (ASObject.class.isAssignableFrom(type)) { + e.setSuperclass(type); + } + e.setCallback(new ExtensionObjectProxy(type,base)); + ASObject obj = (ASObject) e.create(); + obj.setObjectType(AnnoUtil.getName(type)); + return type.cast(obj); + } + + /** + * Uses cglib to create an extension of the base ASObject type + * that implements the given interface. All setter/getter methods + * on the supplied interface will be mapped to properties on the + * underlying ASObject.. for instance, getFoo() and setFoo(..) will + * be mapped to a "foo" property + */ + public static T extend(Class type) { + checkNotNull(type); + Enhancer e = new Enhancer(); + if (type.isInterface()) { + e.setSuperclass(ASObject.class); + e.setInterfaces(MoreFunctions.array(type)); + } else if (ASObject.class.isAssignableFrom(type)) { + e.setSuperclass(type); + } + e.setCallback(new ExtensionObjectProxy(type)); + ASObject obj = (ASObject) e.create(); + obj.setObjectType(type.getSimpleName().toLowerCase()); + return type.cast(obj); + } + + private static class ExtensionObjectProxy + implements MethodInterceptor { + private final Class type; + private final Class base; + ExtensionObjectProxy(Class type) { + this.type = type; + this.base = type; + } + ExtensionObjectProxy(Class type, Class base) { + this.type = type; + this.base = base; + } + public Object intercept( + Object obj, + Method method, + Object[] args, + MethodProxy proxy) + throws Throwable { + ASObject as = (ASObject) obj; + if (method.getDeclaringClass().equals(type) || + method.getDeclaringClass().equals(base)) { + boolean setter = + method.getName().matches("[Ss]et.+") || + (void.class.isAssignableFrom(method.getReturnType()) && + method.getParameterTypes().length == 1); + String name = get_name(method); + if (setter) { + if (args.length != 1) + throw new IllegalArgumentException(); + as.setProperty(name,args[0]); + return null; + } else { + return method.getReturnType().cast(as.getProperty(name)); + } + } else return proxy.invokeSuper(obj, args); + } + } } Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java?rev=1195721&r1=1195720&r2=1195721&view=diff ============================================================================== --- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java (original) +++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java Mon Oct 31 23:43:57 2011 @@ -78,6 +78,10 @@ public class Comparisons { return onlySecondApplies(predicate).apply(t1, t2); } + public static boolean testBoth(T t1, T t2, Predicate p1, Predicate p2) { + return testBoth(p1,p2).apply(t1,t2); + } + public static final Comparison bothAreNull = bothAreNull(); @@ -113,6 +117,17 @@ public class Comparisons { } /** + * Returns true if predicate1.apply(r1) && predicate2.apply(r2) + */ + public static Comparison testBoth(final Predicate predicate1, final Predicate predicate2) { + return new Comparison() { + public boolean apply(T r1, T r2) { + return predicate1.apply(r1) && predicate2.apply(r2); + } + }; + } + + /** * Returns a Comparison that checks both inputs against a Predicate */ public static Comparison bothApply(final Predicate predicate) { Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MorePredicates.java URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MorePredicates.java?rev=1195721&r1=1195720&r2=1195721&view=diff ============================================================================== --- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MorePredicates.java (original) +++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MorePredicates.java Mon Oct 31 23:43:57 2011 @@ -4,10 +4,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.regex.Pattern; +import org.apache.abdera2.common.selector.AbstractSelector; import org.apache.abdera2.common.selector.PropertySelector; +import org.apache.abdera2.common.selector.Selector; import org.apache.abdera2.common.text.CodepointMatcher; -import com.google.common.base.Predicate; import com.google.common.base.Predicates; import static com.google.common.base.Preconditions.*; @@ -16,20 +17,22 @@ public final class MorePredicates { private MorePredicates() {} - public static Predicate equalsIgnoreCase(final String val) { - return new Predicate() { - public boolean apply(String input) { + public static Selector equalsIgnoreCase(final String val) { + return new AbstractSelector() { + public boolean select(Object input) { checkNotNull(input); checkNotNull(val); - return input.equalsIgnoreCase(val); + return input.toString().equalsIgnoreCase(val); } }; } - public static Predicate notNullOrEmpty() { - return new Predicate() { - public boolean apply(String input) { - return input != null && input.length() > 0; + public static Selector notNullOrEmpty() { + return new AbstractSelector() { + public boolean select(Object input) { + checkArgument(input instanceof String); + String val = input.toString(); + return val != null && val.length() > 0; } }; } @@ -40,7 +43,7 @@ public final class MorePredicates { * and MUST NOT require any input parameters. The method name is case * sensitive. */ - public static Predicate isNull(Class _class, String method) { + public static Selector isNull(Class _class, String method) { return PropertySelector.create(_class, method, Predicates.isNull()); } @@ -50,7 +53,7 @@ public final class MorePredicates { * and MUST NOT require any input parameters. The method name is case * sensitive. */ - public static Predicate isNotNull(Class _class, String method) { + public static Selector isNotNull(Class _class, String method) { return PropertySelector.create(_class, method, Predicates.not(Predicates.isNull())); } @@ -58,36 +61,66 @@ public final class MorePredicates { * Returns a Predicate that checks if the value of a named property of * instances of the specified class is an instance of the given test class */ - public static Predicate instanceOf(Class _class, String method, Class _test) { + public static Selector instanceOf(Class _class, String method, Class _test) { return PropertySelector.create(_class, method, Predicates.instanceOf(_test)); } - public static Predicate assignableFrom(Class _class, String method, Class _test) { + public static Selector assignableFrom(Class _class, String method, Class _test) { return PropertySelector.create(_class, method, Predicates.assignableFrom(_test)); } - public static Predicate containsPattern(Class _class, String method, Pattern pattern) { + public static Selector containsPattern(Class _class, String method, Pattern pattern) { return PropertySelector.create(_class, method, Predicates.contains(pattern)); } - public static Predicate containsPattern(Class _class, String method, String pattern) { + public static Selector containsPattern(Class _class, String method, String pattern) { return containsPattern(_class,method,Pattern.compile(pattern)); } - public static Predicate matches(Class _class, String method, CodepointMatcher matcher) { + public static Selector matches(Class _class, String method, CodepointMatcher matcher) { return PropertySelector.create(_class, method, matcher); } - public static Predicate equalTo(Class _class, String method, Object obj) { + public static Selector equalTo(Class _class, String method, Object obj) { return PropertySelector.create(_class, method, Predicates.equalTo(obj)); } - public static Predicate in(Class _class, String method, Collection items) { + public static Selector in(Class _class, String method, Collection items) { return PropertySelector.create(_class, method, Predicates.in(items)); } - public static Predicate in(Class _class, String method, T... items) { + public static Selector in(Class _class, String method, T... items) { return in(_class,method,Arrays.asList(items)); } + public static Selector longNotNegativeOrNull = + new AbstractSelector() { + public boolean select(Object item) { + if (item == null) return false; + checkArgument(item instanceof Long); + Long i = (Long)item; + return i >= 0; + } + }; + + public static Selector intNotNegativeOrNull = + new AbstractSelector() { + public boolean select(Object item) { + if (item == null) return false; + checkArgument(item instanceof Integer); + Integer i = (Integer)item; + return i >= 0; + } + }; + + public static Selector shortNotNegativeOrNull = + new AbstractSelector() { + public boolean select(Object item) { + if (item == null) return false; + checkArgument(item instanceof Short); + Short i = (Short)item; + return i >= 0; + } + }; + } Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/Codec.java URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/Codec.java?rev=1195721&r1=1195720&r2=1195721&view=diff ============================================================================== --- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/Codec.java (original) +++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/Codec.java Mon Oct 31 23:43:57 2011 @@ -206,6 +206,7 @@ public enum Codec { private static class DecodeFunction implements Function { public String apply(String input) { + if (input == null) return null; return decode(input); } } Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/UrlEncoding.java URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/UrlEncoding.java?rev=1195721&r1=1195720&r2=1195721&view=diff ============================================================================== --- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/UrlEncoding.java (original) +++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/UrlEncoding.java Mon Oct 31 23:43:57 2011 @@ -577,6 +577,7 @@ public final class UrlEncoding { return new Function() { public String apply(String input) { try { + if (input == null) return null; return decode(input,charset); } catch (Throwable t) { throw ExceptionHelper.propogate(t);