You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2011/11/01 00:44:43 UTC
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/
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>T extend(
+ Class<T> type,
+ Class<? extends ASObject> 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>T extend(Class<T> 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 <T>boolean testBoth(T t1, T t2, Predicate<T> p1, Predicate<T> p2) {
+ return testBoth(p1,p2).apply(t1,t2);
+ }
+
public static final Comparison<Object> bothAreNull =
bothAreNull();
@@ -113,6 +117,17 @@ public class Comparisons {
}
/**
+ * Returns true if predicate1.apply(r1) && predicate2.apply(r2)
+ */
+ public static <T>Comparison<T> testBoth(final Predicate<T> predicate1, final Predicate<T> predicate2) {
+ return new Comparison<T>() {
+ 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 <T>Comparison<T> bothApply(final Predicate<T> 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<String> equalsIgnoreCase(final String val) {
- return new Predicate<String>() {
- public boolean apply(String input) {
+ public static Selector<String> equalsIgnoreCase(final String val) {
+ return new AbstractSelector<String>() {
+ public boolean select(Object input) {
checkNotNull(input);
checkNotNull(val);
- return input.equalsIgnoreCase(val);
+ return input.toString().equalsIgnoreCase(val);
}
};
}
- public static Predicate<String> notNullOrEmpty() {
- return new Predicate<String>() {
- public boolean apply(String input) {
- return input != null && input.length() > 0;
+ public static Selector<String> notNullOrEmpty() {
+ return new AbstractSelector<String>() {
+ 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 <T>Predicate<T> isNull(Class<T> _class, String method) {
+ public static <T>Selector<T> isNull(Class<T> _class, String method) {
return PropertySelector.<T>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 <T>Predicate<T> isNotNull(Class<T> _class, String method) {
+ public static <T>Selector<T> isNotNull(Class<T> _class, String method) {
return PropertySelector.<T>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 <T>Predicate<T> instanceOf(Class<T> _class, String method, Class<?> _test) {
+ public static <T>Selector<T> instanceOf(Class<T> _class, String method, Class<?> _test) {
return PropertySelector.<T>create(_class, method, Predicates.instanceOf(_test));
}
- public static <T>Predicate<T> assignableFrom(Class<T> _class, String method, Class<?> _test) {
+ public static <T>Selector<T> assignableFrom(Class<T> _class, String method, Class<?> _test) {
return PropertySelector.<T>create(_class, method, Predicates.assignableFrom(_test));
}
- public static <T>Predicate<T> containsPattern(Class<T> _class, String method, Pattern pattern) {
+ public static <T>Selector<T> containsPattern(Class<T> _class, String method, Pattern pattern) {
return PropertySelector.<T>create(_class, method, Predicates.contains(pattern));
}
- public static <T>Predicate<T> containsPattern(Class<T> _class, String method, String pattern) {
+ public static <T>Selector<T> containsPattern(Class<T> _class, String method, String pattern) {
return containsPattern(_class,method,Pattern.compile(pattern));
}
- public static <T>Predicate<T> matches(Class<T> _class, String method, CodepointMatcher matcher) {
+ public static <T>Selector<T> matches(Class<T> _class, String method, CodepointMatcher matcher) {
return PropertySelector.<T>create(_class, method, matcher);
}
- public static <T>Predicate<T> equalTo(Class<T> _class, String method, Object obj) {
+ public static <T>Selector<T> equalTo(Class<T> _class, String method, Object obj) {
return PropertySelector.<T>create(_class, method, Predicates.equalTo(obj));
}
- public static <T>Predicate<T> in(Class<T> _class, String method, Collection<T> items) {
+ public static <T>Selector<T> in(Class<T> _class, String method, Collection<T> items) {
return PropertySelector.<T>create(_class, method, Predicates.in(items));
}
- public static <T>Predicate<T> in(Class<T> _class, String method, T... items) {
+ public static <T>Selector<T> in(Class<T> _class, String method, T... items) {
return in(_class,method,Arrays.asList(items));
}
+ public static Selector<Long> longNotNegativeOrNull =
+ new AbstractSelector<Long>() {
+ public boolean select(Object item) {
+ if (item == null) return false;
+ checkArgument(item instanceof Long);
+ Long i = (Long)item;
+ return i >= 0;
+ }
+ };
+
+ public static Selector<Integer> intNotNegativeOrNull =
+ new AbstractSelector<Integer>() {
+ public boolean select(Object item) {
+ if (item == null) return false;
+ checkArgument(item instanceof Integer);
+ Integer i = (Integer)item;
+ return i >= 0;
+ }
+ };
+
+ public static Selector<Short> shortNotNegativeOrNull =
+ new AbstractSelector<Short>() {
+ 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<String,String> {
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<String,String>() {
public String apply(String input) {
try {
+ if (input == null) return null;
return decode(input,charset);
} catch (Throwable t) {
throw ExceptionHelper.propogate(t);