|
|
@@ -0,0 +1,184 @@
|
|
|
+/*
|
|
|
+ * @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.annotation.Annotation;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.function.Predicate;
|
|
|
+import java.util.stream.Collector;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
+import net.ranides.assira.reflection.IAnnotations;
|
|
|
+import net.ranides.assira.reflection.IArguments;
|
|
|
+import net.ranides.assira.reflection.IAttribute;
|
|
|
+import net.ranides.assira.reflection.IClass;
|
|
|
+import net.ranides.assira.reflection.IClasses;
|
|
|
+import net.ranides.assira.reflection.IElement;
|
|
|
+import net.ranides.assira.reflection.IMethod;
|
|
|
+import net.ranides.assira.reflection.IMethods;
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ * @author Ranides Atterwim <ranides@gmail.com>
|
|
|
+ */
|
|
|
+public class RMethods implements IMethods {
|
|
|
+
|
|
|
+ private Stream<IMethod> stream;
|
|
|
+
|
|
|
+ public RMethods(Stream<IMethod> stream) {
|
|
|
+ this.stream = stream;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods require(Predicate<? super IMethod> predicate) {
|
|
|
+ stream = stream.filter(predicate);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods require(IAnnotations req) {
|
|
|
+ return require(m -> {
|
|
|
+ Set<Annotation> set = m.annotations().stream().collect(Collectors.toSet());
|
|
|
+ return req.stream().allMatch(set::contains);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods require(Class<? extends Annotation> annotation) {
|
|
|
+ return require(m -> m.annotations().require(annotation).first().isPresent());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods require(IAttribute attribute) {
|
|
|
+ return require(m -> m.attributes().contains(attribute));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods require(IClass req) {
|
|
|
+ return require(m -> m.returns().issubclass(req));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods require(IArguments args) {
|
|
|
+ IClasses req = args.types();
|
|
|
+ return require(m -> m.arguments().types().issuper(req));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods require(IClasses req) {
|
|
|
+ return require(m -> m.arguments().types().equals(req));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods discard(Predicate<? super IMethod> predicate) {
|
|
|
+ return require(predicate.negate());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods discard(IAnnotations annotations) {
|
|
|
+ Set<Annotation> req = annotations.stream().collect(Collectors.toSet());
|
|
|
+ return require(m -> !m.annotations().stream().anyMatch(req::contains));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods discard(Class<? extends Annotation> annotation) {
|
|
|
+ return require(m -> !m.annotations().first(annotation).isPresent());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods discard(IAttribute attribute) {
|
|
|
+ return require(m -> !m.attributes().contains(attribute));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods discard(IClass returns) {
|
|
|
+ return require(m -> !m.returns().issubclass(returns));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods discard(IArguments args) {
|
|
|
+ IClasses req = args.types();
|
|
|
+ return require(m -> !m.arguments().types().issuper(req));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods discard(IClasses args) {
|
|
|
+ return require(m -> m.arguments().types().equals(args));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethods match(Object[] args) {
|
|
|
+ IClasses types = IClasses.typeinfo(objects2class(args));
|
|
|
+ return require(m -> types.issubclass(m.arguments().types()));
|
|
|
+ }
|
|
|
+
|
|
|
+ static Class<?>[] objects2class(Object... objects) {
|
|
|
+ Class<?>[] array = new Class<?>[objects.length];
|
|
|
+ for(int i=0; i<array.length; i++) {
|
|
|
+ Object o = objects[i];
|
|
|
+ array[i] = null == o ? null : objects[i].getClass();
|
|
|
+ }
|
|
|
+ return array;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IClasses returns() {
|
|
|
+// return new RClasses(stream().map(m ->returns()));
|
|
|
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IClasses parent() {
|
|
|
+// new RClasses(stream().map(m ->parent()));
|
|
|
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int count() {
|
|
|
+ return (int)stream.count();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public <R> Stream<R> stream(Function<? super IMethod, ? extends R> mapper) {
|
|
|
+ return stream.map(mapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Stream<IMethod> stream() {
|
|
|
+ return stream;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public <R> List<R> list(Function<? super IMethod, ? extends R> mapper) {
|
|
|
+ return stream.map(mapper).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<IMethod> list() {
|
|
|
+ return stream.collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public <R, A> R collect(Collector<? super IMethod, A, R> collector) {
|
|
|
+ return stream.collect(collector);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Optional<IMethod> first() {
|
|
|
+ return stream.findFirst();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<String> names() {
|
|
|
+ return stream.map(IElement::name).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+}
|