Просмотр исходного кода

new: CQuery#single
move: IAttribute#match -> IElement#attribute
fix: IClass#typeof generic
new: IClassLoader
fix: RuntimeUtils#getJavaVersion

Mariusz Sieroń 6 лет назад
Родитель
Сommit
7c5819d15f

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

@@ -7,11 +7,7 @@
 package net.ranides.assira.collection.query;
 
 import java.util.*;
-import java.util.function.BinaryOperator;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.IntFunction;
-import java.util.function.Predicate;
+import java.util.function.*;
 import java.util.stream.Collector;
 import java.util.stream.Stream;
 import net.ranides.assira.collection.HashFunction;
@@ -73,6 +69,10 @@ public interface CQuery<T> extends Iterable<T> {
     
     T max(Comparator<? super T> cmp);
 
+    Optional<T> single();
+
+    <X extends Throwable> Optional<T> single(Supplier<? extends X> ambigous) throws X;
+
     Optional<T> first();
 
     Optional<T> last();

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

@@ -141,6 +141,21 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         return fold((a, b) -> cmp.compare(a, b) > 0 ? a : b);
     }
 
+    @Override
+    public Optional<T> single() {
+        Optional<T> out = first();
+        return (out.isPresent() && size() == 1) ? out : Optional.empty();
+    }
+
+    @Override
+    public <X extends Throwable> Optional<T> single(Supplier<? extends X> ambigous) throws X {
+        Optional<T> out = first();
+        if(size() > 1) {
+            throw ambigous.get();
+        }
+        return out;
+    }
+
     @Override
     public final Optional<T> first() {
         return IteratorUtils.first(iterator());

+ 0 - 4
assira/src/main/java/net/ranides/assira/reflection/IAttribute.java

@@ -95,8 +95,4 @@ public enum IAttribute {
         this.reflective = reflective;
     }
 
-    public boolean match(IElement element) {
-        return element.attributes().has(this);
-    }
-
 }

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

@@ -59,7 +59,7 @@ public interface IClass<T> extends IElement, Comparable<IClass<?>> {
         }
     }
     
-    static IClass<?> typefor(Object object) {
+    static <R> IClass<R> typefor(R object) {
         return IContext.DEFAULT.typefor(object);
     }
     

+ 17 - 0
assira/src/main/java/net/ranides/assira/reflection/IClassLoader.java

@@ -0,0 +1,17 @@
+package net.ranides.assira.reflection;
+
+import net.ranides.assira.reflection.impl.BCLoader;
+
+public interface IClassLoader {
+
+    IClass<?> defineClass(String name, byte[] bytecode);
+
+    static IClassLoader system() {
+        return BCLoader.system();
+    }
+
+    static IClassLoader loader(ClassLoader parent) {
+        return new BCLoader(parent);
+    }
+
+}

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

@@ -24,7 +24,7 @@ public interface IContext {
     
     IClass<?> typeinfo(Type type);
     
-    IClass<?> typefor(Object object);
+    <R> IClass<R> typefor(R object);
     
     IClasses typesinfo(Type... types);
     

+ 6 - 4
assira/src/main/java/net/ranides/assira/reflection/IElement.java

@@ -21,13 +21,15 @@ public interface IElement {
     IElements<? extends IElement> collect();
     
     String name();
-    
+
     IAttributes attributes();
-    
+
+    boolean attribute(IAttribute attr);
+
     IAnnotations annotations();
 
     <A extends Annotation> Optional<A> annotation(Class<A> type);
-    
+
     IElement parent();
-    
+
 }

+ 5 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/AClass.java

@@ -176,6 +176,11 @@ public abstract class AClass<T> implements IClass<T> {
         return ATTRS;
     }
 
+    @Override
+    public final boolean attribute(IAttribute attr) {
+        return attributes().has(attr);
+    }
+
     @Override
     public IAnnotations annotations() {
         return AAnnotations.EMPTY;

+ 3 - 2
assira/src/main/java/net/ranides/assira/reflection/impl/AContext.java

@@ -48,9 +48,10 @@ public class AContext implements IContext {
         return FElements.newClasses(AHints.EMPTY, CQueryBuilder.fromArray(objects).map(this::typefor));
     }
 
+    @SuppressWarnings("unchecked")
     @Override
-    public final IClass<?> typefor(Object object) {
-        return (null == object) ? AClass.NULL : typeinfo(object.getClass());
+    public final <R> IClass<R> typefor(R object) {
+        return (null == object) ? AClass.NULL : itypeinfo(object.getClass());
     }
 
     @SuppressWarnings("unchecked")

+ 5 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/AExecutable.java

@@ -89,6 +89,11 @@ public abstract class AExecutable implements IExecutable {
     public final boolean matches() {
         return matches(IClasses.EMPTY);
     }
+
+    @Override
+    public final boolean attribute(IAttribute attr) {
+        return attributes().has(attr);
+    }
     
     @Override
     public final boolean accepts(Object... arguments) {

+ 31 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/BCLoader.java

@@ -0,0 +1,31 @@
+package net.ranides.assira.reflection.impl;
+
+import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.IClassLoader;
+
+public class BCLoader extends ClassLoader implements IClassLoader{
+
+    private static class Li {
+
+        public static final BCLoader SYSTEM = new BCLoader();
+
+    }
+
+    protected BCLoader() {
+        super();
+    }
+
+    public BCLoader(ClassLoader parent) {
+        super(parent);
+    }
+
+    public static IClassLoader system() {
+        return Li.SYSTEM;
+    }
+
+    @Override
+    public IClass<?> defineClass(String name, byte[] bytecode) {
+        return IClass.typeinfo(defineClass(name, bytecode, 0, bytecode.length));
+    }
+
+}

+ 5 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/CArgument.java

@@ -72,6 +72,11 @@ public class CArgument implements IArgument {
         return type.attributes().contains(IAttribute.PARAMETERIZED) ? GENERIC : NORMAL;
     }
 
+    @Override
+    public final boolean attribute(IAttribute attr) {
+        return attributes().has(attr);
+    }
+
     @Override
     public IAnnotations annotations() {
         return AAnnotations.EMPTY;

+ 5 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/RArgument.java

@@ -77,6 +77,11 @@ public class RArgument implements IArgument {
         return IAttributes.of(param);
     }
 
+    @Override
+    public final boolean attribute(IAttribute attr) {
+        return attributes().has(attr);
+    }
+
     @Override
     public IAnnotations annotations() {
         return FElements.newAnnotations(AHints.EMPTY, CQueryBuilder.fromArray(param.getAnnotations()));

+ 5 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/RField.java

@@ -148,6 +148,11 @@ public class RField implements IField {
         return attr;
     }
 
+    @Override
+    public final boolean attribute(IAttribute attr) {
+        return attributes().has(attr);
+    }
+
     @Override
     public IAnnotations annotations() {
         return FElements.newAnnotations(AHints.EMPTY, CQueryBuilder.fromArray(field.getAnnotations()));

+ 1 - 1
assira/src/main/java/net/ranides/assira/system/RuntimeUtils.java

@@ -98,7 +98,7 @@ public final class RuntimeUtils {
     }
 
     public static double getJavaVersion() {
-        return Double.parseDouble(System.getProperty("java.specification.version", "0"));
+        return Double.parseDouble(getProperty("java.specification.version", "0"));
     }
 
 }