Explorar el Código

IClass traits, CQuery filtering cast

Ranides Atterwim hace 5 años
padre
commit
1531e25e80

+ 6 - 1
assira/src/main/java/net/ranides/assira/collection/query/CQuery.java

@@ -13,6 +13,7 @@ import java.util.stream.Stream;
 import net.ranides.assira.collection.HashFunction;
 import net.ranides.assira.functional.Consumers.EachConsumer;
 import net.ranides.assira.functional.Functions.EachFunction;
+import net.ranides.assira.reflection.*;
 
 /**
  *
@@ -55,7 +56,11 @@ public interface CQuery<T> extends Iterable<T> {
     CQuery<T> slice(int begin, int end);
 
     CQuery<T> filter(Predicate<? super T> p);
-    
+
+    <R> CQuery<R> filter(Class<R> p);
+
+    <R> CQuery<R> filter(IClass<R> p);
+
     <R> CQuery<R> map(Function<? super T,? extends R> f);
     
     <R> CQuery<R> map(EachFunction<? super T,? extends R> f);

+ 11 - 0
assira/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -24,6 +24,7 @@ import net.ranides.assira.functional.Consumers.EachConsumer;
 import net.ranides.assira.functional.Functions.EachFunction;
 import net.ranides.assira.functional.special.Fold;
 import net.ranides.assira.generic.CompareUtils;
+import net.ranides.assira.reflection.*;
 
 /**
  *
@@ -106,6 +107,16 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         return new CQIterable<>(() -> IteratorUtils.filter(iterator(), p));
     }
 
+    @Override
+    public <R> CQuery<R> filter(Class<R> p) {
+        return filter(p::isInstance).map(p::cast);
+    }
+
+    @Override
+    public <R> CQuery<R> filter(IClass<R> p) {
+        return filter(p::isInstance).map(p::cast);
+    }
+
     @Override
     public final <R> CQuery<R> map(Function<? super T, ? extends R> f) {
         return new CQIterable<>(() -> IteratorUtils.map(iterator(), f));

+ 56 - 0
assira/src/main/java/net/ranides/assira/reflection/IClass.java

@@ -23,6 +23,10 @@ import net.ranides.assira.reflection.util.ClassUtils;
 @SuppressWarnings("PMD.TooManyDifferentMethods")
 public interface IClass<T> extends IElement, Comparable<IClass<?>> {
 
+    // @todo (assira #1) better exception handling
+    // @todo (assira #1) optional results for *really* exceptional cases (security exceptions etc)
+    // @todo (assira #2) more fluent helper methods
+
     @SuppressWarnings({"raw", "unchecked"})
     IClass NULL = new AClass(IContext.DEFAULT) { };
 
@@ -141,4 +145,56 @@ public interface IClass<T> extends IElement, Comparable<IClass<?>> {
     
     T cast(Object value);
 
+    default boolean isInterface() {
+        return attribute(IAttribute.INTERFACE);
+    }
+
+    default boolean isAbstract() {
+        return attribute(IAttribute.ABSTRACT);
+    }
+
+    default boolean isAnnotation() {
+        return attribute(IAttribute.ANNOTATION);
+    }
+
+    default boolean isEnum() {
+        return attribute(IAttribute.ENUM);
+    }
+
+    default boolean isParameterized() {
+        return attribute(IAttribute.PARAMETERIZED);
+    }
+
+    default boolean isArray() {
+        return attribute(IAttribute.ARRAY);
+    }
+
+    default boolean isPrimitiveArray() {
+        return isArray() && component().isPrimitive();
+    }
+
+    default boolean isPrimitive() {
+        return attribute(IAttribute.PRIMITIVE);
+    }
+
+    default boolean isNumber() {
+        return attribute(IAttribute.NUMBER);
+    }
+
+    default boolean isInteger() {
+        return attribute(IAttribute.INTEGER);
+    }
+
+    default boolean isBoxed() {
+        return attribute(IAttribute.BOXED);
+    }
+
+    default boolean isVoid() {
+        return attribute(IAttribute.VOID);
+    }
+
+    default boolean isBoolean() {
+        return attribute(IAttribute.BOOLEAN);
+    }
+
 }

+ 36 - 0
assira/src/main/java/net/ranides/assira/reflection/IElement.java

@@ -32,4 +32,40 @@ public interface IElement {
 
     IElement parent();
 
+    default boolean isPublic() {
+        return attribute(IAttribute.PUBLIC);
+    }
+
+    default boolean isPackage() {
+        return attribute(IAttribute.PACKAGE);
+    }
+
+    default boolean isPrivate() {
+        return attribute(IAttribute.PRIVATE);
+    }
+
+    default boolean isProtected() {
+        return attribute(IAttribute.PROTECTED);
+    }
+
+    default boolean isDeclared() {
+        return attribute(IAttribute.DECLARED);
+    }
+
+    default boolean isParamaterized() {
+        return attribute(IAttribute.PARAMETERIZED);
+    }
+
+    default boolean isFinal() {
+        return attribute(IAttribute.FINAL);
+    }
+
+    default boolean isStatic() {
+        return attribute(IAttribute.STATIC);
+    }
+
+    default boolean isSynthetic() {
+        return attribute(IAttribute.SYNTHETIC);
+    }
+
 }

+ 21 - 1
assira/src/main/java/net/ranides/assira/reflection/IExecutable.java

@@ -98,5 +98,25 @@ public interface IExecutable extends IElement {
     <F> F handle(IClass<F> functor);
 
     IExecutable accessible();
-    
+
+    default boolean isAbstract() {
+        return attribute(IAttribute.ABSTRACT);
+    }
+
+    default boolean isSynchronized() {
+        return attribute(IAttribute.SYNCHRONIZED);
+    }
+
+    default boolean isBridge() {
+        return attribute(IAttribute.BRIDGE);
+    }
+
+    default boolean isNative() {
+        return attribute(IAttribute.NATIVE);
+    }
+
+    default boolean isLambda() {
+        return attribute(IAttribute.LAMBDA);
+    }
+
 }

+ 15 - 0
assira/src/main/java/net/ranides/assira/reflection/IField.java

@@ -30,6 +30,13 @@ public interface IField extends IElement {
     IClass<?> parent();
     
     Object get(Object that);
+
+    default Object getStatic() {
+        if(!isStatic()) {
+            throw new IllegalArgumentException("Field is not static: " + this);
+        }
+        return get(null);
+    }
     
     void set(Object that, Object value);
     
@@ -47,4 +54,12 @@ public interface IField extends IElement {
 
     MethodHandle setter();
 
+    default boolean isVolatile() {
+        return attribute(IAttribute.VOLATILE);
+    }
+
+    default boolean isTransient() {
+        return attribute(IAttribute.TRANSIENT);
+    }
+
 }