Преглед изворни кода

Merge branch 'master' of https://repo1.mydevil.net/git/priv/ranides/assira

Ranides Atterwim пре 10 година
родитељ
комит
5501a5c631

+ 19 - 13
assira/src/main/java/net/ranides/assira/events/EventLock.java

@@ -52,6 +52,8 @@ import org.slf4j.Logger;
  */
 public abstract class EventLock<E extends Event> {
     
+    private static final long NS_PER_MS = 1_000_000;
+    
     private static final int LOG_BATCH = 100;
     
     /**
@@ -228,6 +230,10 @@ public abstract class EventLock<E extends Event> {
         router.addEventListener(event, lock);
         return lock;
     }
+    
+    protected void waitNS(long ns) throws InterruptedException {
+        this.wait(ns/NS_PER_MS, (int)(ns%NS_PER_MS));
+    }
 
     private static class UnsafeEventLock<EE extends Event> extends EventLock<EE> implements EventListener<EE> {
 
@@ -261,12 +267,12 @@ public abstract class EventLock<E extends Event> {
 
         @Override
         public EE waitForEvent(long timeout) throws InterruptedException {
-            long end = System.currentTimeMillis() + timeout;
-            long rem = timeout;
+            long rem = TimeUnit.NANOSECONDS.convert(timeout, TimeUnit.MILLISECONDS);
+            long end = System.nanoTime()+ rem;
             synchronized (this) {
                 while (hit==null && rem>0) {
-                    this.wait(rem);
-                    rem = end - System.currentTimeMillis();
+                    this.waitNS(rem);
+                    rem = end - System.nanoTime();
                 }
                 EE result = hit;
                 hit = null;
@@ -283,15 +289,15 @@ public abstract class EventLock<E extends Event> {
                 return event.cast(ret);
             }
         }
-
+        
         @Override
         public <T extends EE> T waitForEvent(Class<T> event, long timeout) throws InterruptedException {
-            long end = System.currentTimeMillis() + timeout;
-            long rem = timeout;
+            long rem = TimeUnit.NANOSECONDS.convert(timeout, TimeUnit.MILLISECONDS);
+            long end = System.nanoTime()+ rem;
             synchronized (this) {
                 while( !event.isInstance(hit) && rem>0) {
-                    this.wait(rem);
-                    rem = end - System.currentTimeMillis();
+                    this.waitNS(rem);
+                    rem = end - System.nanoTime();
                 }
                 EE ret = hit;
                 hit = null;
@@ -351,14 +357,14 @@ public abstract class EventLock<E extends Event> {
 
         @Override
         public <T extends EE> T waitForEvent(Class<T> event, long timeout) throws InterruptedException {
-            long end = System.currentTimeMillis() + timeout;
-            long rem = timeout;
+            long rem = TimeUnit.NANOSECONDS.convert(timeout, TimeUnit.MILLISECONDS);
+            long end = System.nanoTime()+ rem;
             while(rem > 0) {
-                EE recent = events.poll(rem, TimeUnit.MILLISECONDS);
+                EE recent = events.poll(rem, TimeUnit.NANOSECONDS);
                 if( event.isInstance(recent) ) {
                     return event.cast(recent);
                 }
-                rem = end - System.currentTimeMillis();
+                rem = end - System.nanoTime();
             }
             return null;
         }

+ 3 - 1
assira/src/main/java/net/ranides/assira/generic/HashUtils.java

@@ -84,7 +84,9 @@ public final class HashUtils {
     }
     
     public static int hashPair(Object value1, Object value2) {
-        return (value1 == null ? 0 : value1.hashCode()) ^ (value2 == null ? 0 : value2.hashCode());
+        int a = value1 == null ? 0 : value1.hashCode();
+        int b = value2 == null ? 0 : value2.hashCode();
+        return murmurHash3(a) ^ murmurHash3(b);
     }
     
     /**

+ 1 - 1
assira/src/main/java/net/ranides/assira/generic/TypeToken.java

@@ -62,7 +62,7 @@ import net.ranides.assira.reflection.impl.RCompareUtils;
  * 
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public abstract class TypeToken<T> extends AClass implements IClass {
+public abstract class TypeToken<T> extends AClass {
     
     private final IClass type;
 

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

@@ -17,7 +17,7 @@ import net.ranides.assira.reflection.impl.RMethod;
 /**
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IMethod extends IElement, Comparable<IMethod> {
+public interface IMethod extends IElement {
     
     /**
      * Collect information using java.reflection API

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

@@ -8,7 +8,6 @@ package net.ranides.assira.reflection.impl;
 
 import java.util.Iterator;
 import java.util.List;
-import java.util.Objects;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -91,12 +90,12 @@ public abstract class AElements<T> implements IElements<T> {
     }
 
     @Override
-    public int hashCode() {
+    public final int hashCode() {
         return 0;
     }
 
     @Override
-    public boolean equals(Object object) {
+    public final boolean equals(Object object) {
         if(object instanceof IElements<?>) {
             IElements<?> that = (IElements<?>)object;
             return this.list().equals(that.list());

+ 18 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/AHints.java

@@ -10,6 +10,7 @@ import java.util.AbstractSet;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
+import net.ranides.assira.generic.HashUtils;
 import net.ranides.assira.reflection.*;
 
 /**
@@ -79,6 +80,23 @@ public class AHints implements IHints {
         return require.contains(IAttribute.DECLARED);
     }
 
+    @Override
+    public int hashCode() {
+        return HashUtils.hashPair(require,discard);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof IHints)) {
+            return false;
+        }
+        AHints that = (AHints) object;
+        return this.require().equals(that.require()) && this.discard().equals(that.discard());
+    }
+    
     @Override
     public String toString() {
         return "AHints{" + "require=" + require + ", discard=" + discard + '}';

+ 11 - 22
assira/src/main/java/net/ranides/assira/reflection/impl/AMethod.java

@@ -48,34 +48,23 @@ public abstract class AMethod implements IMethod {
         };
 	}
     
-	
-	@Override
-	public final int compareTo(IMethod that) {
-        int a = this.name().compareTo(that.name());
-        if(a != 0) {
-            return a;
-        }
-        // @todo (assira #0) reflective: compareTo
-        // sprawdzić porównanie wszystkich IElements oraz class / method / field / params / etc
-        int b = ListUtils.compare(
-                this.arguments().types().list(),
-                that.arguments().types().list(),
-                RCompareUtils::compare
-        );
-        if(b != 0) {
-            return b;
-        }
-        return RCompareUtils.compare(this.returns(), that.returns());
-	}
-
     @Override
     public final int hashCode() {
         return name().hashCode();
     }
 
     @Override
-    public final boolean equals(Object that) {
-        return (that instanceof IMethod) && 0 == compareTo((IMethod)that);
+    public final boolean equals(Object object) {
+        if(object == this) {
+            return true;
+        }
+        if(!(object instanceof IMethod)) {
+            return false;
+        }
+        IMethod that = (IMethod)object;
+        return this.name().equals(that.name())
+            && this.arguments().equals(that.arguments())
+            && this.returns().equals(that.returns());
     }
     
     @Override

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

@@ -87,4 +87,14 @@ public class CArgument implements IArgument {
         return AAnnotations.EMPTY;
     }
 
+    @Override
+    public final int hashCode() {
+        return this.type().hashCode();
+    }
+
+    @Override
+    public final boolean equals(Object object) {
+        return (object instanceof IArgument) && ((IArgument)object).type().equals(type());
+    }
+    
 }

+ 6 - 12
assira/src/main/java/net/ranides/assira/reflection/impl/RArgument.java

@@ -65,24 +65,18 @@ public class RArgument implements IArgument {
     }
 
     @Override
-    public boolean equals(Object object) {
-        if(!(object instanceof IArgument)) {
-            return false;
-        }
-        IArgument that = (IArgument)object;
-        return this.type().equals(that.type()) && this.name().equals(that.name());
+    public final boolean equals(Object object) {
+        return (object instanceof IArgument) && ((IArgument)object).type().equals(type());
     }
-
+    
     @Override
-    public int hashCode() {
-        return super.hashCode(); //To change body of generated methods, choose Tools | Templates.
+    public final int hashCode() {
+        return this.type().hashCode();
     }
-    
+
     @Override
     public String toString() {
         return type() + " " + param.getName();
     }
     
-    
-    
 }

+ 10 - 22
assira/src/main/java/net/ranides/assira/reflection/impl/RClass.java

@@ -64,12 +64,15 @@ public class RClass extends AClass {
     
     @Override
     public List<IClass> params() {
-        Type gtype = type.getGenericSuperclass();
-        if(gtype instanceof ParameterizedType) {
-            return new RPClass(type, (ParameterizedType)gtype).params();
-        } else {
-            return ListUtils.map(Arrays.asList(type.getTypeParameters()), IClass::typeinfo);
-        }
+//        try {
+            Type gtype = type.getGenericSuperclass();
+            if(gtype instanceof ParameterizedType) {
+                return new RPClass(type, (ParameterizedType)gtype).params();
+            } 
+//        } catch(MalformedParameterizedTypeException | GenericSignatureFormatError | TypeNotPresentException e) {
+//            // do nothing... ?
+//        }
+        return ListUtils.map(Arrays.asList(type.getTypeParameters()), IClass::typeinfo);
     }
 
     @Override
@@ -108,7 +111,7 @@ public class RClass extends AClass {
     }
 
     @Override
-    public final IClass outer() {
+    public IClass outer() {
         return IClass.typeinfo(type.getDeclaringClass());
     }
 
@@ -266,21 +269,6 @@ public class RClass extends AClass {
         }
     }
     
-    private static class RPClass extends RClass {
-
-        private final ParameterizedType ptype;
-
-        public RPClass(Class<?> type, ParameterizedType ptype) {
-            super(type);
-            this.ptype = ptype;
-        }
-
-        @Override
-        public List<IClass> params() {
-            return ListUtils.map(Arrays.asList(ptype.getActualTypeArguments()), IClass::typeinfo);
-        }
-
-    }
     
     private static class RawParents extends ForwardIterator<Class<?>> {
 

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

@@ -27,7 +27,7 @@ import net.ranides.assira.collection.query.CQueryBuilder;
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public final class RConstructor extends AMethod implements IMethod {
+public final class RConstructor extends AMethod {
     	
 	private final Constructor<?> method;
     private final Supplier<MethodHandle> handle;

+ 55 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/RPClass.java

@@ -0,0 +1,55 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+
+package net.ranides.assira.reflection.impl;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.Arrays;
+import java.util.List;
+import net.ranides.assira.collection.lists.ListUtils;
+import net.ranides.assira.reflection.IClass;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+class RPClass extends RClass {
+
+    private final ParameterizedType ptype;
+    private final TypeVariable<?>[] keys;
+    private final Type[] vars;
+
+    public RPClass(Class<?> type, ParameterizedType ptype) {
+        super(type);
+        this.ptype = ptype;
+        this.keys = ((Class<?>)ptype.getRawType()).getTypeParameters();
+        this.vars = ptype.getActualTypeArguments();
+
+        System.out.printf("%n");
+        System.out.printf("RP.keys %s = %s%n", type, Arrays.toString(keys) );
+        System.out.printf("RP.vars %s = %s%n", type, Arrays.toString(vars));
+        
+        if(null != ptype.getOwnerType()) {
+            System.out.printf("RP.outs %s = %s%n", type, ptype.getOwnerType());
+            IClass.typeinfo(ptype.getOwnerType());
+        }
+        
+    }
+
+    @Override
+    public List<IClass> params() {
+        return ListUtils.map(Arrays.asList(ptype.getActualTypeArguments()), IClass::typeinfo);
+    }
+    
+    @Override
+    public IClass outer() {
+        return IClass.typeinfo(ptype.getOwnerType());
+    }
+
+}

+ 10 - 5
assira/src/test/java/net/ranides/assira/generic/HashUtilsTest.java

@@ -48,11 +48,16 @@ public class HashUtilsTest {
 	
 	@Test
 	public void testHashPair() {
-		assertEquals(0 ^ 11, HashUtils.hashPair(0, 11));
-		assertEquals(0 ^ 11, HashUtils.hashPair(null, 11));
-		assertEquals(99 ^ 1037, HashUtils.hashPair(99, 1037));
-		assertEquals(99 ^ 0, HashUtils.hashPair(99, 0));
-		assertEquals(99 ^ 0, HashUtils.hashPair(99, null));
+		assertEquals(-1818165756, HashUtils.hashPair(0, 11));
+		assertEquals(-1818165756, HashUtils.hashPair(null, 11));
+		assertEquals(-1818165756, HashUtils.hashPair(11, 0));
+		assertEquals(-1818165756, HashUtils.hashPair(11, null));
+        
+		assertEquals(1755047892, HashUtils.hashPair(99, 1037));
+		assertEquals(1755047892, HashUtils.hashPair(1037, 99));
+        
+		assertEquals(-1672646182, HashUtils.hashPair(99, 0));
+		assertEquals(-1672646182, HashUtils.hashPair(99, null));
 	}
 	
 	

+ 10 - 4
assira/src/test/java/net/ranides/assira/reflection/impl/RMethodTest.java

@@ -19,7 +19,9 @@ public class RMethodTest {
 
     @Test
     public void testMethodReturs() {
-        Object o = new ForRMethod<Float>(){};
+//        ForRMethod<? super Float> p = new ForRMethod<Float>(){};
+        ForRMethod<Float> p = new ForRMethod<Float>(){};
+        Object o = p.new Record<Double>(){};
         IClass ic = IClass.typefor(o);
         
         System.out.printf("---------%n");
@@ -32,9 +34,13 @@ public class RMethodTest {
         // tak naprawdę *wiadomo* że lepsza by była opcja (1) bo opcja (2) to nas zbliża z powrotem
         // do rzeźbienia w stylu klasycznego Reflection API.
         
-        System.out.printf("param(T) = %s%n", ic.params().get(0));
-        System.out.printf("returns  = %s%n", ic.methods().require("m1").returns().first());
-        System.out.printf("returns  = %s%n", ic.methods().require("m1").returns().first().params().get(0));
+        System.out.printf("param(T)       = %s%n", ic.params().get(0));
+        
+        System.out.printf("%n");
+        
+        System.out.printf("m1.returns     = %s%n", ic.methods().require("map1").first().returns());
+        
+        System.out.printf("%n");
     }
     
 }

+ 15 - 1
assira/src/test/java/net/ranides/assira/reflection/mockup/ForRMethod.java

@@ -8,6 +8,7 @@
 package net.ranides.assira.reflection.mockup;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  *
@@ -23,6 +24,19 @@ public class ForRMethod<T> {
     
     public List<? extends T> m3() { throw new UnsupportedOperationException(); }
     
-    
+    public class Record<Q> {
+        
+        public <R> Map<T,Map<Q,Map<R, Integer>>> map1(R a,T b,Q c,Integer d) { throw new UnsupportedOperationException(); }
+        
+        public <R> Map<T,Map<Q,Map<R, Integer>>> map2(
+            List<R> a,
+            List<T> b,
+            List<Q> c,
+            List<Integer> d
+        ) { 
+            throw new UnsupportedOperationException(); 
+        }
+        
+    }
     
 }