perfsonar-dev - [pS-dev] [GEANT/SA2/ps-java-services] r6100 - in trunk/psBase3/psbase3-apt: . dummyservice dummyservice/net dummyservice/net/geant dummyservice/net/geant/perfsonar dummyservice/net/geant/perfsonar/dummyservice dummyservice/net/geant/perfsonar/dummyservice/selftest net net/geant net/geant/perfsonar src src/main src/main/java src/main/java/net src/main/java/net/geant src/main/java/net/geant/perfsonar src/main/java/net/geant/perfsonar/annotations src/main/java/net/geant/perfsonar/annotations/selftest src/main/resources src/main/resources/META-INF src/main/resources/META-INF/services src/test src/test/java src/test/java/net src/test/java/net/geant src/test/java/net/geant/perfsonar src/test/java/net/geant/perfsonar/annotations src/test/java/net/geant/perfsonar/annotations/selftest src/test/java/net/geant/perfsonar/annotations/selftest/compiler
Subject: perfsonar development work
List archive
[pS-dev] [GEANT/SA2/ps-java-services] r6100 - in trunk/psBase3/psbase3-apt: . dummyservice dummyservice/net dummyservice/net/geant dummyservice/net/geant/perfsonar dummyservice/net/geant/perfsonar/dummyservice dummyservice/net/geant/perfsonar/dummyservice/selftest net net/geant net/geant/perfsonar src src/main src/main/java src/main/java/net src/main/java/net/geant src/main/java/net/geant/perfsonar src/main/java/net/geant/perfsonar/annotations src/main/java/net/geant/perfsonar/annotations/selftest src/main/resources src/main/resources/META-INF src/main/resources/META-INF/services src/test src/test/java src/test/java/net src/test/java/net/geant src/test/java/net/geant/perfsonar src/test/java/net/geant/perfsonar/annotations src/test/java/net/geant/perfsonar/annotations/selftest src/test/java/net/geant/perfsonar/annotations/selftest/compiler
Chronological Thread
- From:
- To:
- Subject: [pS-dev] [GEANT/SA2/ps-java-services] r6100 - in trunk/psBase3/psbase3-apt: . dummyservice dummyservice/net dummyservice/net/geant dummyservice/net/geant/perfsonar dummyservice/net/geant/perfsonar/dummyservice dummyservice/net/geant/perfsonar/dummyservice/selftest net net/geant net/geant/perfsonar src src/main src/main/java src/main/java/net src/main/java/net/geant src/main/java/net/geant/perfsonar src/main/java/net/geant/perfsonar/annotations src/main/java/net/geant/perfsonar/annotations/selftest src/main/resources src/main/resources/META-INF src/main/resources/META-INF/services src/test src/test/java src/test/java/net src/test/java/net/geant src/test/java/net/geant/perfsonar src/test/java/net/geant/perfsonar/annotations src/test/java/net/geant/perfsonar/annotations/selftest src/test/java/net/geant/perfsonar/annotations/selftest/compiler
- Date: Wed, 9 Jan 2013 23:28:50 +0000 (GMT)
Author: psnc.pietrzak
Date: 2013-01-09 23:28:50 +0000 (Wed, 09 Jan 2013)
New Revision: 6100
Added:
trunk/psBase3/psbase3-apt/dummyservice/
trunk/psBase3/psbase3-apt/dummyservice/net/
trunk/psBase3/psbase3-apt/dummyservice/net/geant/
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTests.java
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTestsAbstractClass.java
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/ValidSelfTests.java
trunk/psBase3/psbase3-apt/net/
trunk/psBase3/psbase3-apt/net/geant/
trunk/psBase3/psbase3-apt/net/geant/perfsonar/
trunk/psBase3/psbase3-apt/net/geant/perfsonar/SelfTestRunner.java
trunk/psBase3/psbase3-apt/pom.xml
trunk/psBase3/psbase3-apt/src/
trunk/psBase3/psbase3-apt/src/main/
trunk/psBase3/psbase3-apt/src/main/java/
trunk/psBase3/psbase3-apt/src/main/java/net/
trunk/psBase3/psbase3-apt/src/main/java/net/geant/
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/AbstractClassChecker.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseElementVisitor.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseMethodElementVisitor.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/ReturnTypeVisitor.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTest.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestCollector.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestData.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestDataCollector.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessor.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListener.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListenerImpl.java
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/TemplateEngine.java
trunk/psBase3/psbase3-apt/src/main/resources/
trunk/psBase3/psbase3-apt/src/main/resources/META-INF/
trunk/psBase3/psbase3-apt/src/main/resources/META-INF/services/
trunk/psBase3/psbase3-apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
trunk/psBase3/psbase3-apt/src/test/
trunk/psBase3/psbase3-apt/src/test/java/
trunk/psBase3/psbase3-apt/src/test/java/net/
trunk/psBase3/psbase3-apt/src/test/java/net/geant/
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestLoggerHelper.java
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorTest.java
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/BinaryClassLoader.java
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/CompilerHelper.java
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/DiagnosticImpl.java
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/Diagnostics.java
Log:
Moved perfSONAR Base3 related projects.
Added:
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTests.java
===================================================================
---
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTests.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTests.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,55 @@
+package net.geant.perfsonar.dummyservice.selftest;
+import java.util.Arrays;
+import java.util.List;
+
+import net.geant.perfsonar.annotations.selftest.*;
+
+public abstract class InvalidSelfTests {
+// @SelfTest(name = "return type",
+// successMessage = "Only methods of type void are
valid.")
+// public String toString() {
+// return "Dummy2Class";
+// }
+
+ @SelfTest(name = "abstract method",
+ successMessage = "Abstract method cannot be a self
test.")
+ protected abstract void print();
+
+ @SelfTest(name = "two parameters",
+ successMessage = "Methods can have up to one
parameter.")
+ public void testing(String arg1, int arg2) {
+ System.out.println("parameterized");
+ }
+
+ @SelfTest(name = "private static",
+ successMessage = "Only public non-static methods
are allowed.")
+ private static void error() {
+ System.err.println("Second selftest.");
+ }
+
+ @SelfTest(name = "duplicated", successMessage = "duplicated test
name.")
+ public void duplicatedTest1() {
+ System.out.println("duplicate");
+ }
+
+ @SelfTest(name = "duplicated", successMessage = "duplicated test
name.")
+ public void duplicatedTest2() {
+ System.out.println("duplicate");
+ }
+
+ @SelfTest(name = "without self test data",
+ successMessage = "This method doesn't have a self
test data method provided.")
+ public void invalidParameterizedTest(Integer value) {
+ System.out.println(value);
+ }
+
+ @SelfTestData
+ public List<String> getStringValues() {
+ return Arrays.asList("Parameter1", "Parameter2",
"Parameter3").iterator();
+ }
+
+ @SelfTestData
+ public String getValue() {
+ return "One";
+ }
+}
Added:
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTestsAbstractClass.java
===================================================================
---
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTestsAbstractClass.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTestsAbstractClass.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,11 @@
+package net.geant.perfsonar.dummyservice.selftest;
+
+import net.geant.perfsonar.annotations.selftest.SelfTest;
+
+public abstract class InvalidSelfTestsAbstractClass {
+
+ @SelfTest(name = "abstract", successMessage = "The class containing
self test cannot be abstract.")
+ public void print() {
+
+ }
+}
Added:
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/ValidSelfTests.java
===================================================================
---
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/ValidSelfTests.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/dummyservice/net/geant/perfsonar/dummyservice/selftest/ValidSelfTests.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,52 @@
+package net.geant.perfsonar.dummyservice.selftest;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.List;
+
+import net.geant.perfsonar.annotations.selftest.*;
+
+public class ValidSelfTests {
+ private List<Object> collection = new ArrayList<Object>();
+
+ @SelfTest(name = "constant", successMessage = "Added constant.")
+ public void addConstant() {
+ collection.add("constant");
+ }
+
+ @SelfTest(name = "add string ${index}",
+ successMessage = "Added ${arg}.")
+ public void add(String value) {
+ collection.add(value);
+ }
+
+ @SelfTestData
+ public List<String> getStringValues() {
+ return Arrays.asList("Parameter1", "Parameter2",
"Parameter3");
+ }
+
+ @SelfTest(name = "add integer ${index}",
+ successMessage = "Added ${arg} at ${index}.")
+ public void add(Integer value) {
+ if (value < 0)
+ throw new IllegalArgumentException("Value must be
greater or equal to 0.");
+ collection.add(value);
+ }
+
+ @SelfTestData
+ public List<Integer> getIntegers() {
+ return Arrays.asList(0, 1, 2, -1, 3);
+ }
+
+ @SelfTest(name = "checked exception", successMessage = "Exception was
not thrown.")
+ public void throwCheckedException() throws Exception {
+ throw new Exception("Checked exception was thrown
successfully.");
+ }
+
+ @SelfTest(name = "independent", successMessage = "Self tests are
independent from each other.")
+ public void independent() {
+ if (collection.size() != 0)
+ throw new IllegalArgumentException("Self tests cannot
be dependent.");
+ }
+}
Added: trunk/psBase3/psbase3-apt/net/geant/perfsonar/SelfTestRunner.java
===================================================================
--- trunk/psBase3/psbase3-apt/net/geant/perfsonar/SelfTestRunner.java
(rev 0)
+++ trunk/psBase3/psbase3-apt/net/geant/perfsonar/SelfTestRunner.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,53 @@
+package net.geant.perfsonar;
+
+import java.util.Iterator;
+import javax.annotation.Generated;
+
+import net.geant.perfsonar.SelfTestListener;
+
+@Generated("net.geant.perfsonar.annotations.selftest.TemplateEngine")
+public class SelfTestRunner {
+ private SelfTestListener listener;
+ private Scheduler scheduler;
+ public SelfTestRunner(SelfTestListener listener, Scheduler scheduler) {
+ this.listener = listener;
+ this.scheduler = scheduler;
+ }
+
+ public void runSuite() {
+ final Iterator<java.lang.String> data0 = new
net.geant.perfsonar.dummyservice.selftest.ValidSelfTests().getStringValues();
+ for ( ; data0.hasNext(); )
+ try {
+ new
net.geant.perfsonar.dummyservice.selftest.ValidSelfTests().add(data0.next());
+ listener.success("add string ${index}", "Added ${arg}.");
+ } catch (Throwable t) {
+ listener.failure("add string ${index}", t.getMessage());
+ }
+ try {
+ new
net.geant.perfsonar.dummyservice.selftest.ValidSelfTests().throwCheckedException();
+ listener.success("checked exception", "Exception was not
thrown.");
+ } catch (Throwable t) {
+ listener.failure("checked exception", t.getMessage());
+ }
+ try {
+ new
net.geant.perfsonar.dummyservice.selftest.ValidSelfTests().addConstant();
+ listener.success("constant", "Added constant.");
+ } catch (Throwable t) {
+ listener.failure("constant", t.getMessage());
+ }
+ try {
+ new
net.geant.perfsonar.dummyservice.selftest.ValidSelfTests().dependent();
+ listener.success("dependent", "Executed after constant was
added.");
+ } catch (Throwable t) {
+ listener.failure("dependent", t.getMessage());
+ }
+ final Iterator<java.lang.Integer> data1 = new
net.geant.perfsonar.dummyservice.selftest.ValidSelfTests().getIntegers();
+ for ( ; data1.hasNext(); )
+ try {
+ new
net.geant.perfsonar.dummyservice.selftest.ValidSelfTests().add(data1.next());
+ listener.success("add integer ${index}", "Added ${arg}.");
+ } catch (Throwable t) {
+ listener.failure("add integer ${index}", t.getMessage());
+ }
+ }
+}
Added: trunk/psBase3/psbase3-apt/pom.xml
===================================================================
--- trunk/psBase3/psbase3-apt/pom.xml (rev 0)
+++ trunk/psBase3/psbase3-apt/pom.xml 2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,50 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>jar</packaging>
+
+ <parent>
+ <groupId>net.geant.perfsonar</groupId>
+ <artifactId>perfsonar-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <relativePath>../perfsonar-parent/</relativePath>
+ </parent>
+
+ <artifactId>perfsonar-apt</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>perfSONAR Annotation Processing Tool</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <id>source-compile</id>
+ <goal>compile</goal>
+ <proc>none</proc>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>net.geant.perfsonar</groupId>
+ <artifactId>perfsonar-base-annotations</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>net.geant.perfsonar</groupId>
+ <artifactId>perfsonar-base-api</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
\ No newline at end of file
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/AbstractClassChecker.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/AbstractClassChecker.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/AbstractClassChecker.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,22 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.TypeElement;
+
+public class AbstractClassChecker extends BaseElementVisitor<Boolean,
Object> {
+ private TypeElement type = null;
+ @Override
+ public Boolean visitType(TypeElement type, Object ignored) {
+ this.type = type;
+ return type.getModifiers().contains(Modifier.ABSTRACT);
+ }
+
+ public boolean isEnclosingClassAbstract(ExecutableElement method) {
+ return method.getEnclosingElement().accept(this, null);
+ }
+
+ public TypeElement getEnclosingType(ExecutableElement method) {
+ return type;
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseElementVisitor.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseElementVisitor.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseElementVisitor.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,40 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.PackageElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.TypeParameterElement;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.util.AbstractElementVisitor6;
+
+public class BaseElementVisitor<R, P> extends AbstractElementVisitor6<R, P> {
+ @Override
+ public R visitExecutable(ExecutableElement arg0, P arg1) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public R visitPackage(PackageElement arg0, P arg1) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public R visitType(TypeElement arg0, P arg1) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public R visitTypeParameter(TypeParameterElement arg0, P arg1) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public R visitVariable(VariableElement arg0, P arg1) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseMethodElementVisitor.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseMethodElementVisitor.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/BaseMethodElementVisitor.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,29 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Modifier;
+
+public class BaseMethodElementVisitor<R, P> extends BaseElementVisitor<R, P>
{
+
+ protected boolean isDeclarationViolated(ExecutableElement elem,
+ SelfTestProcessorListener processor) {
+ int errorsCount = 0;
+
+ if (elem.getModifiers().contains(Modifier.ABSTRACT)) {
+ processor.error("The method cannot be abstract",
elem);
+ errorsCount++;
+ }
+
+ if (!elem.getModifiers().contains(Modifier.PUBLIC)) {
+ processor.error("The method must be public.", elem);
+ errorsCount++;
+ }
+
+ if (elem.getModifiers().contains(Modifier.STATIC)) {
+ processor.error("The method cannot be static.", elem);
+ errorsCount++;
+ }
+
+ return (errorsCount > 0);
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/ReturnTypeVisitor.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/ReturnTypeVisitor.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/ReturnTypeVisitor.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,61 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import javax.lang.model.type.ArrayType;
+import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.ErrorType;
+import javax.lang.model.type.ExecutableType;
+import javax.lang.model.type.NoType;
+import javax.lang.model.type.NullType;
+import javax.lang.model.type.PrimitiveType;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.type.TypeVariable;
+import javax.lang.model.type.WildcardType;
+import javax.lang.model.util.AbstractTypeVisitor6;
+
+public class ReturnTypeVisitor extends AbstractTypeVisitor6<TypeMirror,
SelfTestProcessorListener> {
+
+ @Override
+ public TypeMirror visitArray(ArrayType arg0,
SelfTestProcessorListener arg1) {
+ return null;
+ }
+
+ @Override
+ public TypeMirror visitDeclared(DeclaredType type,
SelfTestProcessorListener processor) {
+ return type;
+ }
+
+ @Override
+ public TypeMirror visitError(ErrorType arg0,
SelfTestProcessorListener arg1) {
+ return null;
+ }
+
+ @Override
+ public TypeMirror visitExecutable(ExecutableType arg0,
SelfTestProcessorListener arg1) {
+ return null;
+ }
+
+ @Override
+ public TypeMirror visitNoType(NoType arg0, SelfTestProcessorListener
arg1) {
+ return null;
+ }
+
+ @Override
+ public TypeMirror visitNull(NullType arg0, SelfTestProcessorListener
arg1) {
+ return null;
+ }
+
+ @Override
+ public TypeMirror visitPrimitive(PrimitiveType arg0,
SelfTestProcessorListener arg1) {
+ return null;
+ }
+
+ @Override
+ public TypeMirror visitTypeVariable(TypeVariable arg0,
SelfTestProcessorListener arg1) {
+ return null;
+ }
+
+ @Override
+ public TypeMirror visitWildcard(WildcardType arg0,
SelfTestProcessorListener arg1) {
+ return null;
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTest.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTest.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTest.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,14 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.SOURCE)
+@Target(ElementType.METHOD)
+public @interface SelfTest {
+ String name();
+ String successMessage();
+ //String whenSucceeded() default "";
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestCollector.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestCollector.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestCollector.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,65 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.type.TypeMirror;
+
+public class SelfTestCollector extends BaseMethodElementVisitor<Map<String,
ExecutableElement>, SelfTestProcessorListener> {
+
+ private final Map<String, ExecutableElement> selfTests
+ = new Hashtable<String, ExecutableElement>();
+
+ private final Map<TypeMirror, ExecutableElement> selfTestData
+ = new Hashtable<TypeMirror, ExecutableElement>();
+
+ protected SelfTestCollector(Map<String, ExecutableElement> selfTests,
+ Map<TypeMirror, ExecutableElement> selfTestData) {
+
+ this.selfTests.putAll(selfTests);
+ this.selfTestData.putAll(selfTestData);
+ }
+
+ @Override
+ public Map<String, ExecutableElement>
visitExecutable(ExecutableElement elem, SelfTestProcessorListener listener) {
+ if(isDeclarationViolated(elem, listener))
+ return selfTests;
+
+ if (selfTests.get(elem.getAnnotation(SelfTest.class).name())
!= null) {
+ listener.error("Duplicated name of the self test.",
elem);
+ return selfTests;
+ }
+
+ selfTests.put(elem.getAnnotation(SelfTest.class).name(),
elem);
+
+ return selfTests;
+ }
+
+ protected boolean isDeclarationViolated(ExecutableElement elem,
+ SelfTestProcessorListener listener) {
+ int errorsCount = 0;
+
+ if (super.isDeclarationViolated(elem, listener))
+ errorsCount++;
+
+// if (elem.getReturnType().getKind() != TypeKind.VOID) {
+// listener.error("Type of the method must be void.",
elem);
+// errorsCount++;
+// }
+
+ if (elem.isVarArgs() || (elem.getParameters().size() > 1)) {
+ listener.error("The method cannot have more than one
parameter.", elem);
+ errorsCount++;
+ }
+
+ if (elem.getParameters().size() == 1) {
+ if
(selfTestData.get(elem.getParameters().get(0).asType()) == null) {
+ listener.error("There are no self test data
provided. Add a public method annotatated with @SelfTestData of return type
java.util.List<" + elem.getParameters().get(0).asType() + ">", elem);
+ errorsCount++;
+ }
+ }
+
+ return (errorsCount > 0);
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestData.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestData.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestData.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,12 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.SOURCE)
+@Target(ElementType.METHOD)
+public @interface SelfTestData {
+
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestDataCollector.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestDataCollector.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestDataCollector.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,59 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.TypeMirror;
+
+public class SelfTestDataCollector extends
BaseMethodElementVisitor<Map<TypeMirror, ExecutableElement>,
SelfTestProcessorListener> {
+
+ private final Map<TypeMirror, ExecutableElement> selfTestData
+ = new Hashtable<TypeMirror, ExecutableElement>();
+
+ protected SelfTestDataCollector(Map<TypeMirror, ExecutableElement>
selfTestData) {
+ this.selfTestData.putAll(selfTestData);
+ }
+
+ @Override
+ public Map<TypeMirror, ExecutableElement>
visitExecutable(ExecutableElement method, SelfTestProcessorListener listener)
{
+ int errorCount = 0;
+ if(isDeclarationViolated(method, listener))
+ errorCount++;
+
+ final DeclaredType returnType =
getType(method.getReturnType());
+
+ if (!returnType.toString().startsWith("java.util.List<")) {
+ listener.error("The return type of the method must be
of type java.util.List<E>", method);
+ return selfTestData;
+ }
+
+ if (errorCount > 0)
+ return selfTestData;
+
+ selfTestData.put(returnType.getTypeArguments().get(0),
method);
+ //processor.addSelfTestData(elem,
returnType.getTypeArguments().get(0));
+
+ return selfTestData;
+ }
+
+ private DeclaredType getType(TypeMirror returnType) {
+ return (DeclaredType) returnType.accept(new
ReturnTypeVisitor(), null);
+ }
+
+ protected boolean isDeclarationViolated(ExecutableElement elem,
+ SelfTestProcessorListener listener) {
+ int errorsCount = 0;
+
+ if (super.isDeclarationViolated(elem, listener))
+ errorsCount++;
+
+ if (elem.isVarArgs() || (elem.getParameters().size() > 0)) {
+ listener.error("The method cannot have parameters.",
elem);
+ errorsCount++;
+ }
+
+ return (errorsCount > 0);
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessor.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessor.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessor.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,111 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Filer;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.annotation.processing.SupportedSourceVersion;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.type.TypeMirror;
+import javax.tools.FileObject;
+
+@SupportedAnnotationTypes("net.geant.perfsonar.annotations.selftest.*")
+@SupportedSourceVersion(SourceVersion.RELEASE_6)
+public class SelfTestProcessor extends AbstractProcessor {
+ @Override
+ public boolean process(Set<? extends TypeElement> annotations,
+ RoundEnvironment roundEnv) {
+
+ if (annotations.size() <= 0)
+ return false;
+
+ final SelfTestProcessorListener reporter = new
SelfTestProcessorListenerImpl(processingEnv.getMessager());
+
+ final Map<TypeMirror, ExecutableElement> selfTestData
+ = new Hashtable<TypeMirror, ExecutableElement>();
+
+ for (Element elem : getSelfTestData(roundEnv))
+ selfTestData.putAll(elem.accept(new
SelfTestDataCollector(selfTestData), reporter));
+
+ final Map<String, ExecutableElement> selfTests
+ = new Hashtable<String, ExecutableElement>();
+
+ for (Element method : getSelfTests(roundEnv))
+ selfTests.putAll(method.accept(new
SelfTestCollector(selfTests, selfTestData), reporter));
+
+ Writer writer = null;
+ try {
+ writer = openWriter(getSelfTests(roundEnv));
+ new TemplateEngine().writeSelfTestRunnerClass(writer,
sortByName(createSelfTestDependencyGraph(filter(selfTests, reporter))),
selfTestData);
+ } catch (IOException ex) {
+ reporter.error(ex.toString());
+ } finally {
+ if (writer != null)
+ try {
+ writer.close();
+ } catch (IOException ex) {
+ reporter.error(ex.toString());
+ }
+ }
+
+ return false;
+ }
+
+ private Writer openWriter(Set<? extends Element> elements) throws
IOException {
+ final Filer filer = processingEnv.getFiler();
+ final FileObject out =
filer.createSourceFile("net.geant.perfsonar.SelfTestRunnerImpl",
+ elements.toArray(new Element[0]));
+ return out.openWriter();
+ }
+
+ private Set<? extends Element> getSelfTestData(RoundEnvironment
roundEnv) {
+ return roundEnv.getElementsAnnotatedWith(SelfTestData.class);
+ }
+
+ private Set<? extends Element> getSelfTests(RoundEnvironment
roundEnv) {
+ return roundEnv.getElementsAnnotatedWith(SelfTest.class);
+ }
+
+ private Map<String, ExecutableElement> filter(Map<String,
ExecutableElement> selfTests, SelfTestProcessorListener reporter) {
+ final Map<String, ExecutableElement> result = new
Hashtable<String, ExecutableElement>();
+ final AbstractClassChecker checker = new
AbstractClassChecker();
+ for (String name : selfTests.keySet()) {
+ final ExecutableElement method = selfTests.get(name);
+ if (!checker.isEnclosingClassAbstract(method))
+ result.put(name, method);
+ else
+ reporter.error("The class containing self
test cannot be abstract.", checker.getEnclosingType(method));
+ }
+
+ return result;
+ }
+
+ //FIXME add sorting
+ private List<List<ExecutableElement>>
sortByName(List<List<ExecutableElement>> graph) {
+ return graph;
+ }
+
+ //FIXME add dependency
+ private List<List<ExecutableElement>>
createSelfTestDependencyGraph(Map<String, ExecutableElement> selfTests) {
+ final List<List<ExecutableElement>> result = new
ArrayList<List<ExecutableElement>>();
+
+ for (ExecutableElement method : selfTests.values()) {
+ final List<ExecutableElement> temp = new
ArrayList<ExecutableElement>();
+ temp.add(method);
+ result.add(temp);
+ }
+
+ return result;
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListener.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListener.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListener.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,8 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import javax.lang.model.element.Element;
+
+interface SelfTestProcessorListener {
+ void error(String message);
+ void error(String message, Element element);
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListenerImpl.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListenerImpl.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorListenerImpl.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,24 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import javax.annotation.processing.Messager;
+import javax.lang.model.element.Element;
+import javax.tools.Diagnostic.Kind;
+
+public class SelfTestProcessorListenerImpl implements
SelfTestProcessorListener {
+
+ private Messager messager;
+
+ protected SelfTestProcessorListenerImpl(Messager messager) {
+ this.messager = messager;
+ }
+
+ @Override
+ public void error(String message) {
+ messager.printMessage(Kind.ERROR, message);
+ }
+
+ @Override
+ public void error(String message, Element element) {
+ messager.printMessage(Kind.ERROR, message, element);
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/TemplateEngine.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/TemplateEngine.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/java/net/geant/perfsonar/annotations/selftest/TemplateEngine.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,143 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.type.TypeMirror;
+
+public class TemplateEngine {
+ private Writer writer;
+
+ private void write(String text) throws IOException {
+ writer.write(text);
+ }
+
+ public void writeSelfTestRunnerClass(Writer writer,
List<List<ExecutableElement>> selftestsDG, Map<TypeMirror, ExecutableElement>
selfTestData) throws IOException {
+ this.writer = writer;
+
+ write("package net.geant.perfsonar;\n\n");
+ write("import java.io.IOException;\n");
+ write("import java.text.MessageFormat;\n");
+ write("import java.util.List;\n");
+ write("import javax.annotation.Generated;\n");
+ write("\n");
+ write("import net.geant.perfsonar.base.Scheduler;\n");
+ write("import net.geant.perfsonar.selftest.*;\n");
+ write("\n");
+ write("@Generated(\"" + getClass().getName() + "\")\n");
+ write("public class SelfTestRunnerImpl implements
SelfTestRunner {\n");
+ write("\n");
+ write(" public void runSuite(final Scheduler scheduler,
final SelfTestLogger listener) {\n");
+
+ writeTestsInvocations(selftestsDG, selfTestData);
+
+ write(" }\n");
+ write("}\n");
+ }
+
+ private void writeTestsInvocations(List<List<ExecutableElement>>
selftestsDG,
+ Map<TypeMirror, ExecutableElement> selfTestData)
throws IOException {
+
+ int i = 0;
+ for (List<ExecutableElement> methods : selftestsDG)
+ for (ExecutableElement method : methods) {
+ if (method.getParameters().size() == 1) {
+ write(" int i" + i + " =
0;\n");
+ write(" for (");
+
write(method.getParameters().get(0).asType().toString());
+ write(" data" + i + " : ");
+ write("new " +
method.getEnclosingElement() + "().");
+
write(selfTestData.get(method.getParameters().get(0).asType()).getSimpleName()
+ "()) {\n");
+ }
+
+ executeMethod(i, method);
+
+ if (method.getParameters().size() == 1) {
+ write(" ");
+ write("}\n");
+ i++;
+ }
+ }
+ }
+
+ private void executeMethod(int i, ExecutableElement method)
+ throws IOException {
+
+ if (method.getParameters().size() == 1)
+ write(" scheduler.runInParallel(new
ParameterizedSelfTestTask<" +
method.getParameters().get(0).asType().toString() + ">(data" + i + ", i" + i
+ ") {\n");
+ else
+ write(" scheduler.runInParallel(new Runnable()
{\n");
+
+ write(" public void run() {\n");
+ write(" try {\n");
+
+ write(" ");
+ if (method.getParameters().size() == 1)
+ write(" ");
+
+ write("new " + method.getEnclosingElement() + "()");
+ write("." + method.getSimpleName() + "(");
+ if (method.getParameters().size() == 0)
+ write(");\n");
+ else {
+ write("getData());\n");
+ }
+
+ write(" ");
+ if (method.getParameters().size() == 1)
+ write(" ");
+
+ write("listener.success(");
+
write(parseMessage(method.getAnnotation(SelfTest.class).name(), i) + ", ");
+
write(parseMessage(method.getAnnotation(SelfTest.class).successMessage(), i)
+ ");\n");
+ write(" ");
+
+ if (method.getParameters().size() == 1)
+ write(" ");
+ write("} catch (Throwable t) {\n");
+ write(" ");
+ if (method.getParameters().size() == 1)
+ write(" ");
+ write("listener.failure(" +
parseMessage(method.getAnnotation(SelfTest.class).name(), i) + ",
t.getMessage());\n");
+ write(" ");
+ if (method.getParameters().size() == 1)
+ write(" ");
+ write("}\n");
+ write(" }\n");
+ write(" });\n");
+ if (method.getParameters().size() == 1) {
+ write(" i" + i + "++;\n");
+ }
+ }
+
+ private String parseMessage(String message, int i) {
+ int index = 0;
+ boolean wasIndex = false;
+ boolean wasArg = false;
+
+ if (!message.contains("${index}") &&
!message.contains("${arg}"))
+ return "\"" + message + "\"";
+
+ if (message.contains("${index}")) {
+ message = message.replace("${index}", "{0}");
+ index++;
+ wasIndex = true;
+ }
+ if (message.contains("${arg}")) {
+ message = message.replace("${arg}", "{" + index +
"}");
+ wasArg = true;
+ }
+
+ message = "MessageFormat.format(\"" + message + "\"";
+ if (wasIndex)
+ message += ", getIndex()";
+ if (wasArg)
+ message += ", getData()";
+ message += ")";
+
+ return message;
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
===================================================================
---
trunk/psBase3/psbase3-apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/main/resources/META-INF/services/javax.annotation.processing.Processor
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1 @@
+net.geant.perfsonar.annotations.selftest.SelfTestProcessor
Added:
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestLoggerHelper.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestLoggerHelper.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestLoggerHelper.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,25 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.Map;
+
+import net.geant.perfsonar.selftest.SelfTestLogger;
+
+public class SelfTestLoggerHelper implements SelfTestLogger {
+ private final Map<String, String> result = new Hashtable<String,
String>();
+
+ @Override
+ public void success(String name, String successMessage) {
+ result.put(name, successMessage);
+ }
+
+ @Override
+ public void failure(String name, String message) {
+ result.put(name, message);
+ }
+
+ public Map<String, String> toMap() {
+ return Collections.unmodifiableMap(result);
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorTest.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorTest.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/SelfTestProcessorTest.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,108 @@
+package net.geant.perfsonar.annotations.selftest;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import net.geant.perfsonar.annotations.selftest.compiler.BinaryClassLoader;
+import net.geant.perfsonar.annotations.selftest.compiler.CompilerHelper;
+import net.geant.perfsonar.annotations.selftest.compiler.Diagnostics;
+import net.geant.perfsonar.base.Scheduler;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SelfTestProcessorTest {
+ private static final String SAMPLES_PATH = "dummyservice";
+ final BinaryClassLoader classLoader = new
BinaryClassLoader(getClassPath());
+ private CompilerHelper compiler;
+ private Scheduler scheduler = new Scheduler() {
+ @Override
+ public void runInParallel(Runnable runnable) {
+ runnable.run();
+ }
+ };
+ final SelfTestLoggerHelper logger = new SelfTestLoggerHelper();
+
+ private static String[] getClassPath() {
+ final List<String> result = new ArrayList<String>();
+ for (String path :
System.getProperty("java.class.path").split(File.pathSeparator)) {
+ result.add(path);
+ }
+
+ result.add(CompilerHelper.ANNOTATED_SOURCE_OUTPUT);
+ result.add(SAMPLES_PATH);
+
+ return result.toArray(new String[0]);
+ }
+
+ @Before
+ public void givenCompiler() throws Exception {
+ compiler = new CompilerHelper(SAMPLES_PATH, new
SelfTestProcessor());
+ }
+
+ @After
+ public void finalizeCompiler() throws IOException {
+ compiler.close();
+ compiler = null;
+ }
+
+ @Test
+ public void shouldCompileValidSelfTests() {
+ assertEquals(Diagnostics.EMPTY,
+
compiler.compile("/net/geant/perfsonar/dummyservice/selftest/ValidSelfTests.java"));
+ }
+
+ @Test
+ public void shouldNotCompileAbstractClass() {
+ assertEquals(
+ new Diagnostics()
+ .addAbstractClassViolationAtLine(5),
+
+
compiler.compile("/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTestsAbstractClass.java"));
+ }
+
+ @Test
+ public void shouldNotCompileInvalidSelfTests() {
+ assertEquals(
+ new Diagnostics()
+ .addAbstractClassViolationAtLine(7)
+// .addSelfTestReturnTypeViolation(10)
+ .addAbstractMethodViolationAtLine(16)
+ .addRangeViolationAtLine(16)
+ .addNumberOfParametersViolationAtLine(20)
+ .addStaticMethodViolationAtLine(26)
+ .addRangeViolationAtLine(26)
+ .addDuplicatedSelfTestNameViolationAtLine(36)
+ .addNoSelfTestDataProvidedViolationAtLine(42)
+ .addSelfTestDataReturnTypeViolationAtLine(52),
+
+
compiler.compile("/net/geant/perfsonar/dummyservice/selftest/InvalidSelfTests.java"));
+ }
+
+ @Test
+ public void shouldRunValidSelfTests() throws Exception {
+
compiler.compile("/net/geant/perfsonar/dummyservice/selftest/ValidSelfTests.java");
+ classLoader.newSelfTestRunner().runSuite(scheduler, logger);
+
+ final Map<String, String> expected = new Hashtable<String,
String>();
+ expected.put("constant", "Added constant.");
+ expected.put("add string 0", "Added Parameter1.");
+ expected.put("add string 1", "Added Parameter2.");
+ expected.put("add string 2", "Added Parameter3.");
+ expected.put("add integer 0", "Added 0 at 0.");
+ expected.put("add integer 1", "Added 1 at 1.");
+ expected.put("add integer 2", "Added 2 at 2.");
+ expected.put("add integer 3", "Value must be greater or equal
to 0.");
+ expected.put("add integer 4", "Added 3 at 4.");
+ expected.put("checked exception", "Checked exception was
thrown successfully.");
+ expected.put("independent", "Self tests are independent from
each other.");
+ assertEquals(expected, logger.toMap());
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/BinaryClassLoader.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/BinaryClassLoader.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/BinaryClassLoader.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,65 @@
+package net.geant.perfsonar.annotations.selftest.compiler;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.geant.perfsonar.selftest.SelfTestRunner;
+
+public class BinaryClassLoader extends ClassLoader {
+
+ private String[] paths;
+
+ public BinaryClassLoader(String... paths) {
+ super();
+ this.paths = paths;
+ }
+
+ public SelfTestRunner newSelfTestRunner() throws
InstantiationException, IllegalAccessException, ClassNotFoundException {
+ return (SelfTestRunner)
loadClass("net.geant.perfsonar.SelfTestRunnerImpl").newInstance();
+ }
+
+ public Class<?> findClass(String name) throws ClassNotFoundException {
+ byte[] b;
+ try {
+ b = loadClassData(name);
+ } catch (IOException e) {
+ throw new ClassNotFoundException(e.getMessage());
+ }
+ return defineClass(name, b, 0, b.length);
+ }
+
+ private byte[] loadClassData(String name) throws IOException {
+ final List<Byte> data = new ArrayList<Byte>();
+
+ FileInputStream in = null;
+ try {
+ in = new FileInputStream(getFileName(name));
+ for (int b = in.read(); b != -1; b = in.read())
+ data.add((byte) b);
+ } finally {
+ if (in != null)
+ in.close();
+ }
+
+ final byte[] result = new byte[data.size()];
+ int idx = 0;
+ for (Byte b : data)
+ result[idx++] = b;
+
+ return result;
+ }
+
+ private String getFileName(String className) throws IOException {
+ for (String path : paths) {
+ final String temp = path + "/" + className.replaceAll("[.]",
"/") + ".class";
+ if (new File(temp).exists())
+ return temp;
+ }
+
+ throw new IOException("File for " + className + " class does not
exist.");
+ }
+
+}
Added:
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/CompilerHelper.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/CompilerHelper.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/CompilerHelper.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,91 @@
+package net.geant.perfsonar.annotations.selftest.compiler;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+import javax.annotation.processing.Processor;
+import javax.tools.Diagnostic;
+import javax.tools.DiagnosticCollector;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaCompiler.CompilationTask;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+
+public class CompilerHelper {
+ public static final String ANNOTATED_SOURCE_OUTPUT = "annotated";
+ private final JavaCompiler compiler;
+ private final StandardJavaFileManager fileManager;
+ private final DiagnosticCollector<JavaFileObject> diagnostics;
+ private final String path;
+ private Processor processor;
+
+ public CompilerHelper(String path, Processor processor) throws
IOException {
+ diagnostics = new DiagnosticCollector<JavaFileObject>();
+ compiler = ToolProvider.getSystemJavaCompiler();
+ fileManager = compiler.getStandardFileManager(diagnostics, null,
null);
+ fileManager.setLocation(StandardLocation.SOURCE_OUTPUT,
Arrays.asList(new File(ANNOTATED_SOURCE_OUTPUT)));
+ this.path = path;
+ this.processor = processor;
+ }
+
+ //public List<Diagnostic<? extends JavaFileObject>> compile(Class<?>
clazz) {
+ // return compile(clazz.getSimpleName() + ".java");
+ //}
+
+ public List<Diagnostic<? extends JavaFileObject>> compile(String
fileName) {
+ final Iterable<? extends JavaFileObject> compilationUnits =
+ fileManager.getJavaFileObjectsFromStrings(Arrays.asList(path
+ fileName));
+
+ CompilationTask task =
+ compiler.getTask(null, fileManager, diagnostics, null, null,
compilationUnits);
+
+ task.setProcessors(Arrays.asList(processor));
+
+ task.call();
+ return sortByLineNumberAndMessage(diagnostics.getDiagnostics());
+ }
+
+ public void close() throws IOException {
+ fileManager.close();
+ }
+
+ private List<Diagnostic<? extends JavaFileObject>>
sortByLineNumberAndMessage(
+ List<Diagnostic<? extends JavaFileObject>> toSort) {
+
+ final List<Diagnostic<? extends JavaFileObject>> result = new
ArrayList<Diagnostic<? extends JavaFileObject>>();
+
+ for (Diagnostic<? extends JavaFileObject> d : toSort) {
+ int idx = getIndex(d, result);
+ if (idx == -1)
+ result.add(d);
+ else
+ result.add(idx, d);
+ }
+
+ return result;
+ }
+
+ private int getIndex(Diagnostic<? extends JavaFileObject> d,
+ List<Diagnostic<? extends JavaFileObject>> result) {
+
+ int idx = 0;
+ for (Diagnostic<? extends JavaFileObject> r : result) {
+ if (d.getLineNumber() < r.getLineNumber()) {
+ return idx;
+ } else if (d.getLineNumber() == r.getLineNumber()) {
+ if
(d.getMessage(Locale.getDefault()).compareTo(r.getMessage(Locale.getDefault()))
<= 0)
+ return idx;
+ }
+
+ idx++;
+ }
+
+ return -1;
+ }
+}
Added:
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/DiagnosticImpl.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/DiagnosticImpl.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/DiagnosticImpl.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,89 @@
+package net.geant.perfsonar.annotations.selftest.compiler;
+
+import java.util.Locale;
+
+import javax.tools.Diagnostic;
+import javax.tools.JavaFileObject;
+
+class DiagnosticImpl implements Diagnostic<JavaFileObject> {
+
+ private final long lineNumber;
+ private final String message;
+
+ public DiagnosticImpl(long lineNumber, String message) {
+ this.lineNumber = lineNumber;
+ this.message = message;
+ }
+
+ @Override
+ public String toString() {
+ return lineNumber + ": " + message;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (!(object instanceof Diagnostic<?>))
+ return false;
+
+ final Diagnostic<?> d = (Diagnostic<?>) object;
+
+ return ((d.getLineNumber() == lineNumber) &&
+ getMessage(d).equals(message));
+ }
+
+ private String getMessage(Diagnostic<?> d) {
+ return
d.getMessage(Locale.getDefault()).substring(d.getMessage(Locale.getDefault()).lastIndexOf(":")
+ 1).trim();
+ }
+
+ @Override
+ public javax.tools.Diagnostic.Kind getKind() {
+ return Kind.ERROR;
+ }
+
+ @Override
+ public JavaFileObject getSource() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getPosition() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public long getStartPosition() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public long getEndPosition() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public long getLineNumber() {
+ return lineNumber;
+ }
+
+ @Override
+ public long getColumnNumber() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public String getCode() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getMessage(Locale locale) {
+ return message;
+ }
+
+}
Added:
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/Diagnostics.java
===================================================================
---
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/Diagnostics.java
(rev 0)
+++
trunk/psBase3/psbase3-apt/src/test/java/net/geant/perfsonar/annotations/selftest/compiler/Diagnostics.java
2013-01-09 23:28:50 UTC (rev 6100)
@@ -0,0 +1,66 @@
+package net.geant.perfsonar.annotations.selftest.compiler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.tools.Diagnostic;
+import javax.tools.JavaFileObject;
+
+
+public class Diagnostics {
+
+ public static final Diagnostics EMPTY = new Diagnostics();
+ final List<Diagnostic<? extends JavaFileObject>> diagnostics = new
ArrayList<Diagnostic<? extends JavaFileObject>>();
+
+ public Diagnostics add(int lineNumber, String message) {
+ diagnostics.add(new DiagnosticImpl(lineNumber, message));
+ return this;
+ }
+
+ public boolean equals(Object obj) {
+ if (!(obj instanceof List<?>))
+ return false;
+
+ return diagnostics.equals(obj);
+ }
+
+ public String toString() {
+ return diagnostics.toString();
+ }
+
+ public Diagnostics addAbstractClassViolationAtLine(int lineNumber) {
+ return add(lineNumber, "The class containing self test cannot
be abstract.");
+ }
+
+// public Diagnostics addSelfTestReturnTypeViolation(int lineNumber) {
+// return add(lineNumber, "Type of the method must be void.");
+// }
+
+ public Diagnostics addAbstractMethodViolationAtLine(int lineNumber) {
+ return add(lineNumber, "The method cannot be abstract");
+ }
+
+ public Diagnostics addRangeViolationAtLine(int lineNumber) {
+ return add(lineNumber, "The method must be public.");
+ }
+
+ public Diagnostics addNumberOfParametersViolationAtLine(int
lineNumber) {
+ return add(lineNumber, "The method cannot have more than one
parameter.");
+ }
+
+ public Diagnostics addStaticMethodViolationAtLine(int lineNumber) {
+ return add(lineNumber, "The method cannot be static.");
+ }
+
+ public Diagnostics addDuplicatedSelfTestNameViolationAtLine(int
lineNumber) {
+ return add(lineNumber, "Duplicated name of the self test.");
+ }
+
+ public Diagnostics addNoSelfTestDataProvidedViolationAtLine(int
lineNumber) {
+ return add(lineNumber, "There are no self test data provided.
Add a public method annotatated with @SelfTestData of return type
java.util.List<java.lang.Integer>");
+ }
+
+ public Object addSelfTestDataReturnTypeViolationAtLine(int
lineNumber) {
+ return add(lineNumber, "The return type of the method must be
of type java.util.List<E>");
+ }
+}
- [pS-dev] [GEANT/SA2/ps-java-services] r6100 - in trunk/psBase3/psbase3-apt: . dummyservice dummyservice/net dummyservice/net/geant dummyservice/net/geant/perfsonar dummyservice/net/geant/perfsonar/dummyservice dummyservice/net/geant/perfsonar/dummyservice/selftest net net/geant net/geant/perfsonar src src/main src/main/java src/main/java/net src/main/java/net/geant src/main/java/net/geant/perfsonar src/main/java/net/geant/perfsonar/annotations src/main/java/net/geant/perfsonar/annotations/selftest src/main/resources src/main/resources/META-INF src/main/resources/META-INF/services src/test src/test/java src/test/java/net src/test/java/net/geant src/test/java/net/geant/perfsonar src/test/java/net/geant/perfsonar/annotations src/test/java/net/geant/perfsonar/annotations/selftest src/test/java/net/geant/perfsonar/annotations/selftest/compiler, svn-noreply, 01/09/2013
Archive powered by MHonArc 2.6.16.