Skip to Content.
Sympa Menu

perfsonar-dev - [pS-dev] [GEANT/SA2/ps-java-services] r6088 - in trunk/psBase3/perfsonar-base: . 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/handlers src/main/java/net/geant/perfsonar/handlers/selftest src/main/java/net/geant/perfsonar/nmwg src/main/java/net/geant/perfsonar/nmwg/response src/main/java/net/geant/perfsonar/xpath src/main/resources src/main/resources/net src/main/resources/net/geant src/main/resources/net/geant/perfsonar src/main/resources/net/geant/perfsonar/nmwg src/main/resources/net/geant/perfsonar/nmwg/response 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/configuration src/test/java/net/geant/perfsonar/helpers src/test/java/net/geant/perfsonar/mp src/test/java/net/geant/perfsonar/mp/sshtelnet src/test/java/net/geant/perfsonar/xpath src/test/resources src/test/resources/net src/test/resources/net/geant src/test/resources/net/geant/perfsonar src/test/resources/net/geant/perfsonar/mp src/test/resources/net/geant/perfsonar/mp/sshtelnet

Subject: perfsonar development work

List archive

[pS-dev] [GEANT/SA2/ps-java-services] r6088 - in trunk/psBase3/perfsonar-base: . 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/handlers src/main/java/net/geant/perfsonar/handlers/selftest src/main/java/net/geant/perfsonar/nmwg src/main/java/net/geant/perfsonar/nmwg/response src/main/java/net/geant/perfsonar/xpath src/main/resources src/main/resources/net src/main/resources/net/geant src/main/resources/net/geant/perfsonar src/main/resources/net/geant/perfsonar/nmwg src/main/resources/net/geant/perfsonar/nmwg/response 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/configuration src/test/java/net/geant/perfsonar/helpers src/test/java/net/geant/perfsonar/mp src/test/java/net/geant/perfsonar/mp/sshtelnet src/test/java/net/geant/perfsonar/xpath src/test/resources src/test/resources/net src/test/resources/net/geant src/test/resources/net/geant/perfsonar src/test/resources/net/geant/perfsonar/mp src/test/resources/net/geant/perfsonar/mp/sshtelnet


Chronological Thread 
  • From:
  • To:
  • Subject: [pS-dev] [GEANT/SA2/ps-java-services] r6088 - in trunk/psBase3/perfsonar-base: . 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/handlers src/main/java/net/geant/perfsonar/handlers/selftest src/main/java/net/geant/perfsonar/nmwg src/main/java/net/geant/perfsonar/nmwg/response src/main/java/net/geant/perfsonar/xpath src/main/resources src/main/resources/net src/main/resources/net/geant src/main/resources/net/geant/perfsonar src/main/resources/net/geant/perfsonar/nmwg src/main/resources/net/geant/perfsonar/nmwg/response 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/configuration src/test/java/net/geant/perfsonar/helpers src/test/java/net/geant/perfsonar/mp src/test/java/net/geant/perfsonar/mp/sshtelnet src/test/java/net/geant/perfsonar/xpath src/test/resources src/test/resources/net src/test/resources/net/geant src/test/resources/net/geant/perfsonar src/test/resources/net/geant/perfsonar/mp src/test/resources/net/geant/perfsonar/mp/sshtelnet
  • Date: Wed, 9 Jan 2013 22:53:48 +0000 (GMT)

Author: psnc.pietrzak
Date: 2013-01-09 22:53:48 +0000 (Wed, 09 Jan 2013)
New Revision: 6088

Added:
trunk/psBase3/perfsonar-base/pom.xml
trunk/psBase3/perfsonar-base/src/
trunk/psBase3/perfsonar-base/src/main/
trunk/psBase3/perfsonar-base/src/main/java/
trunk/psBase3/perfsonar-base/src/main/java/net/
trunk/psBase3/perfsonar-base/src/main/java/net/geant/
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/Configuration.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/HandlerConfiguration.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/NMWGMessage.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/PerfSONAR.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/ServiceType.java
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/Every.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/LookupServiceRegister.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/OnApplicationStart.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/ThreadPer.java
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/handlers/

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/handlers/selftest/

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/handlers/selftest/InvalidSelfTestException.java
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/EchoResponse.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/SelfTestResponse.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/TemplateEngine.java
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/Helper.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/ReferenceInterceptor.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathConfiguration.java

trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathDeserializer.java
trunk/psBase3/perfsonar-base/src/main/resources/
trunk/psBase3/perfsonar-base/src/main/resources/net/
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/

trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/

trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/EchoResponse.template

trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_failure.template

trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_footer.template

trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_header.template

trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_success.template
trunk/psBase3/perfsonar-base/src/test/
trunk/psBase3/perfsonar-base/src/test/java/
trunk/psBase3/perfsonar-base/src/test/java/net/
trunk/psBase3/perfsonar-base/src/test/java/net/geant/
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/PerfSONARTest.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/SelfTestRunnerImpl.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/configuration/

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/configuration/ConfigurationTest.java
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/NMWG.groovy

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARClient.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARServiceClient.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/Response.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/SelfTestResult.java
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Command.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Router.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/SSHTelnetMPService.java

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/ServiceController.java
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/xpath/

trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/xpath/XPathDeserializerTest.java
trunk/psBase3/perfsonar-base/src/test/resources/
trunk/psBase3/perfsonar-base/src/test/resources/net/
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/

trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/

trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/MetadataKeyResponse.template

trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/SetupDataResponse.template
Log:
Moved perfSONAR Base3 related projects.

Added: trunk/psBase3/perfsonar-base/pom.xml
===================================================================
--- trunk/psBase3/perfsonar-base/pom.xml (rev
0)
+++ trunk/psBase3/perfsonar-base/pom.xml 2013-01-09 22:53:48 UTC (rev
6088)
@@ -0,0 +1,139 @@
+<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>
+
+ <parent>
+ <groupId>net.geant.perfsonar</groupId>
+ <artifactId>perfsonar-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <relativePath>../perfsonar-parent/</relativePath>
+ </parent>
+
+ <artifactId>perfsonar-base</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <packaging>bundle</packaging>
+
+ <name>perfsonar-base</name>
+
+ <properties>
+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.9</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ <version>1.3</version>
+ <type>jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.groovy</groupId>
+ <artifactId>groovy-all</artifactId>
+ <version>1.8.2</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.velocity</groupId>
+ <artifactId>velocity</artifactId>
+ <version>1.7</version>
+ </dependency>
+ <dependency>
+ <groupId>net.geant.perfsonar</groupId>
+ <artifactId>perfsonar-base-api</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>net.geant.perfsonar</groupId>
+ <artifactId>perfsonar-base-annotations</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>cglib</groupId>
+ <artifactId>cglib</artifactId>
+ <version>2.2.2</version>
+ </dependency>
+ <!-- <dependency> <groupId>nux</groupId>
<artifactId>nux</artifactId> </dependency>
+ <dependency> <groupId>xom</groupId>
<artifactId>xom</artifactId> <version>1.2.5</version>
+ </dependency> <dependency>
<groupId>net.sf.saxon</groupId> <artifactId>saxon</artifactId>
+ <version>8.7</version> </dependency> -->
+
+ <dependency>
+ <groupId>jlibs</groupId>
+ <artifactId>jlibs-xmldog</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+
<groupId>org.apache.maven.plugins</groupId>
+
<artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <proc>none</proc>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+
<artifactId>maven-bundle-plugin</artifactId>
+ <version>2.3.5</version>
+ <extensions>true</extensions>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <configuration>
+ <instructions>
+
<Export-Package>net.geant.perfsonar.*</Export-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+
<compilerId>groovy-eclipse-compiler</compilerId>
+ <!-- set verbose to be true if you
want lots of uninteresting messages -->
+ <!-- <verbose>true</verbose> -->
+ </configuration>
+ <dependencies>
+ <dependency>
+
<groupId>org.codehaus.groovy</groupId>
+
<artifactId>groovy-eclipse-compiler</artifactId>
+ <version>2.7.0-01</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
+
+ <distributionManagement>
+ <repository>
+ <id>geant-developers-repository</id>
+ <name>perfSONAR repository</name>
+
<url>scpexe:///repo</url>
+ <uniqueVersion>false</uniqueVersion>
+ </repository>
+ <snapshotRepository>
+ <id>geant-developers-repository</id>
+ <name>perfSONAR snapshots repository</name>
+
<url>scpexe:///snapshots-repo</url>
+ <uniqueVersion>false</uniqueVersion>
+ </snapshotRepository>
+ </distributionManagement>
+</project>

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/Configuration.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/Configuration.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/Configuration.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,38 @@
+package net.geant.perfsonar;
+
+import java.lang.reflect.Method;
+import java.util.Hashtable;
+import java.util.Map;
+
+public class Configuration {
+ private static Method method;
+ private static String type;
+ private static Map<String, Method> handlers = new Hashtable<String,
Method>();
+
+ public static <T> void configure(T executeMethod) {
+ handlers.put(type, method);
+ }
+
+ public static HandlerConfiguration when(String messageType) {
+ return new HandlerConfiguration(messageType);
+ }
+
+ public static <T> T any(Class<T> type) {
+ return null;
+ }
+
+ public static Method getHandler(String type) {
+ return handlers.get(type);
+ }
+
+ public static void setTemp(String type, Method method) {
+ Configuration.type = type;
+ Configuration.method = method;
+ }
+
+ public static void reset() {
+ type = null;
+ method = null;
+ handlers.clear();
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/HandlerConfiguration.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/HandlerConfiguration.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/HandlerConfiguration.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,31 @@
+package net.geant.perfsonar;
+
+import java.lang.reflect.Method;
+
+import net.geant.perfsonar.xpath.Helper;
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+public class HandlerConfiguration implements MethodInterceptor {
+
+ private String type;
+
+ protected HandlerConfiguration(String type) {
+ this.type = type;
+ }
+
+ public <T> T then(Class<T> controller) throws InstantiationException,
IllegalAccessException {
+ return Helper.createMock(controller, this);
+ }
+
+ public Object intercept(Object obj, Method method, Object[] args,
+ MethodProxy proxy) throws Throwable {
+
+ if (method.getName().equals("toString") ||
method.getName().equals("hashCode")) {
+ return proxy.invokeSuper(obj, args);
+ }
+
+ Configuration.setTemp(type, method);
+ return null;
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/NMWGMessage.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/NMWGMessage.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/NMWGMessage.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,35 @@
+package net.geant.perfsonar;
+
+public class NMWGMessage {
+ private String type;
+ private String eventType;
+ private String id;
+
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public boolean isEchoRequest() {
+ return type.equals("EchoRequest") &&
eventType.equals("http://schemas.perfsonar.net/tools/admin/echo/2.0";);
+ }
+ public boolean isSelfTestRequest() {
+ return type.equals("EchoRequest") &&
eventType.equals("http://schemas.perfsonar.net/tools/admin/selftest/1.0";);
+ }
+
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getEventType() {
+ return eventType;
+ }
+ public void setEventType(String eventType) {
+ this.eventType = eventType;
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/PerfSONAR.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/PerfSONAR.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/PerfSONAR.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,172 @@
+package net.geant.perfsonar;
+
+import static net.geant.perfsonar.xpath.XPathDeserializer.any;
+import static net.geant.perfsonar.xpath.XPathDeserializer.declarePrefix;
+import static net.geant.perfsonar.xpath.XPathDeserializer.whenXPath;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.Provider;
+
+import net.geant.perfsonar.base.Scheduler;
+import net.geant.perfsonar.nmwg.response.EchoResponse;
+import net.geant.perfsonar.nmwg.response.SelfTestResponse;
+import net.geant.perfsonar.nmwg.response.TemplateEngine;
+import net.geant.perfsonar.selftest.SelfTestRunner;
+import net.geant.perfsonar.xpath.XPathDeserializer;
+
+import org.xml.sax.InputSource;
+
+//@WebServiceProvider(targetNamespace = "http://base3.perfsonar.geant.net/";,
+// portName = "PerfSONARPort", serviceName = "PerfSONARService")
+/**
+ * Base class for all web service classes.
+ *
+ * @author <a
href="mailto:">Blazej
Pietrzak</a>
+ */
+// @WebServiceProvider(portName="SSHTelnetPort",
serviceName="PerfSONARService",
+// targetNamespace = "http://base3.perfsonar.geant.net/";)
+public abstract class PerfSONAR implements Provider<SAXSource> {
+ public static final Object ANY = null;
+
+ static {
+ try {
+ declarePrefix("nmwg",
"http://ggf.org/ns/nmwg/base/2.0/";);
+ declarePrefix("nmwgr",
"http://ggf.org/ns/nmwg/result/2.0/";);
+ declarePrefix("nmwgtopo",
"http://ggf.org/ns/nmwg/topology/2.0/";);
+
whenXPath("nmwg:message/@type").then(NMWGMessage.class).setType(any(String.class));
+
whenXPath("nmwg:message/@id").then(NMWGMessage.class).setId(any(String.class));
+
whenXPath("nmwg:message/nmwg:metadata[@id='meta']/nmwg:eventType/text()").then(NMWGMessage.class).setEventType(any(String.class));
+ } catch (Exception ex) { }
+ }
+
+ private static SelfTestResponse response;
+
+ private Scheduler scheduler = new Scheduler() {
+
+ public void runInParallel(Runnable task) {
+ task.run();
+ }
+
+ };
+
+ protected SelfTestRunner newSelfTestRunner() throws
InstantiationException,
+ IllegalAccessException, ClassNotFoundException {
+ return (SelfTestRunner) Class.forName(
+
"net.geant.perfsonar.SelfTestRunnerImpl").newInstance();
+ }
+
+ protected abstract ServiceType getServiceType();
+
+ protected abstract String getServiceName();
+
+ /**
+ * Processes the incoming xml message.
+ *
+ * @see javax.xml.ws.Provider#invoke(java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public SAXSource invoke(SAXSource request) {
+ final XPathDeserializer deserializer = new
XPathDeserializer();
+ final List<Object> objects;
+ try {
+ objects = (List<Object>)
deserializer.deserialize(request.getInputSource().getCharacterStream());
+ } catch (Exception e1) {
+ return null;
+ }
+
+ final NMWGMessage msg = getObjects(NMWGMessage.class,
objects).get(0);
+
+ final StringWriter writer = new StringWriter();
+ if (msg.isEchoRequest()) {
+ return handleEcho(msg, writer);
+ } else if (msg.isSelfTestRequest()) {
+ return handleSelfTest(msg, writer);
+ } else {
+ try {
+ final Method m =
Configuration.getHandler(msg.getType());
+ if (m.getParameterTypes().length > 1)
+ throw new RuntimeException(m + ":
Controller methods can have zero or one argument.");
+
+ TemplateEngine.put("requestId", msg.getId());
+
+ if (m.getParameterTypes().length < 1) {
+ TemplateEngine.put("result",
m.invoke(m.getDeclaringClass().newInstance()));
+ } else {
+ final List<Object> result = new
ArrayList<Object>();
+ for (Object obj :
getObjects(m.getParameterTypes()[0], objects)) {
+
result.add(m.invoke(m.getDeclaringClass().newInstance(), obj));
+ }
+ TemplateEngine.put("result", result);
+ }
+ try {
+ TemplateEngine.evaluate(writer,
m.getDeclaringClass(), msg.getType().replace("Request", "Response.template"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (Exception ex) {
+ return null;
+ }
+
+ return new SAXSource(toInputSource(new StringReader(
+ writer.toString())));
+ }
+ }
+
+ private SAXSource handleSelfTest(final NMWGMessage msg,
+ final StringWriter writer) {
+ try {
+ response = new SelfTestResponse(getServiceType(),
+ getServiceName());
+ } catch (Exception ex) {
+ }
+ try {
+ response.begin(writer, msg.getId());
+ newSelfTestRunner().runSuite(scheduler, response);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ response.end();
+ } catch (IOException ex) {
+ }
+ }
+
+ return new SAXSource(toInputSource(new StringReader(
+ writer.toString())));
+ }
+
+ private SAXSource handleEcho(final NMWGMessage msg, final
StringWriter writer) {
+ try {
+ EchoResponse.writeEcho(writer, msg.getId());
+ } catch (IOException e) {
+ return new SAXSource(toInputSource(new StringReader(
+ e.toString())));
+ }
+ return new SAXSource(toInputSource(new StringReader(
+ writer.toString())));
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> List<T> getObjects(Class<T> type, List<Object> objects) {
+ final List<T> result = new ArrayList<T>();
+ for (Object obj : objects) {
+ if (obj.getClass().equals(type)) {
+ result.add((T) obj);
+ }
+ }
+ return result;
+ }
+
+ private InputSource toInputSource(Reader reader) {
+ return SAXSource.sourceToInputSource(new
StreamSource(reader));
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/ServiceType.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/ServiceType.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/ServiceType.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,65 @@
+package net.geant.perfsonar;
+
+/**
+ * Types of perfSONAR services.
+ *
+ * @author <a
href="mailto:">Blazej
Pietrzak</a>
+ *
+ */
+public enum ServiceType {
+
+ /**
+ * Measurement Point service.
+ *
+ * The Measurement Point (MP) service is in charge of providing
measurement
+ * data; if the measurements are currently being stored in an
archive, it
+ * retrieves them. If they are not already being collected, the MP
"creates"
+ * the measurement data either by initiating active measurement tests
or
+ * querying passive measurement devices. An MP is a standard interface
+ * “wrapper” around one or more measurement tool/capabilities. An MP
is,
+ * basically, a place where some data are being metered. It can be,
for
+ * example, a piece of hardware located in the core of the network to
get
+ * precise data and deterministic behaviour of the network, but also
can be
+ * software installed at the edge of the network on the hosts to
perform
+ * end-to-end measurements.
+ */
+ MP,
+
+ /**
+ * Measurement Archive service.
+ *
+ * A Measurement Archive (MA) service is used to publish historical
+ * monitoring data which are stored in an archive. It acts as a
wrapper
+ * around an existing data archive to provide data to the outside
world. The
+ * archive can be, for example, a network’s Round Robin Database (RRD
MA),
+ * relational database (SQL MA) or a proprietary database of a Network
+ * Management System. Additionally, an MA can publish information
produced
+ * by MP services. It does not create (generate new raw data) or
transform
+ * (i.e. aggregate/correlate/filter) any data.
+ */
+ MA,
+
+ /**
+ * Lookup service.
+ *
+ * Currently, it is difficult to discover and cumbersome to use the
tests
+ * and measurement capabilities of multiple networks, even if they
have been
+ * made publicly available. The Lookup Service (LS) enables users to
+ * discover other services (MP, MA, Authentication service, etc.)
and, in
+ * particular, the tools, capabilities, or data offered by those
services.
+ * The LS gives the requestor all the information required to find and
+ * contact the necessary services. In essence, the LS acts as a
service
+ * directory, where services can advertise themselves (provide their
lookup
+ * information) and requestors are able to find any service they
need. Some
+ * information about services can be hidden, but high-level
information
+ * should be exposed, so unauthorized users can determine if it is
+ * “interesting” (i.e. worth seeking authorization to access) or not.
The LS
+ * is a key element of the perfSONAR measurement framework because it
allows
+ * every independent service to be a visible part of the system. New
+ * services identify themselves to the community by registering with
an LS
+ * and tender their capabilities, subject to locally-determined
policies, or
+ * are withdrawn from the community without disrupting the interaction
+ * between other services.
+ */
+ LS
+}
\ No newline at end of file

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/Every.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/Every.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/Every.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,8 @@
+package net.geant.perfsonar.annotations;
+
+public @interface Every {
+ byte seconds() default 1;
+ byte minutes() default 0;
+ byte hours() default 0;
+ long days() default 0;
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/LookupServiceRegister.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/LookupServiceRegister.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/LookupServiceRegister.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,12 @@
+package net.geant.perfsonar.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LookupServiceRegister {
+
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/OnApplicationStart.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/OnApplicationStart.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/OnApplicationStart.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,5 @@
+package net.geant.perfsonar.annotations;
+
+public @interface OnApplicationStart {
+
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/ThreadPer.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/ThreadPer.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/annotations/ThreadPer.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,13 @@
+package net.geant.perfsonar.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ThreadPer {
+
+ Class<?> value() default Void.class;
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/handlers/selftest/InvalidSelfTestException.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/handlers/selftest/InvalidSelfTestException.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/handlers/selftest/InvalidSelfTestException.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,10 @@
+package net.geant.perfsonar.handlers.selftest;
+
+public class InvalidSelfTestException extends RuntimeException {
+ private static final long serialVersionUID = 2565636900626966116L;
+
+ public InvalidSelfTestException(String message) {
+ super(message);
+ }
+
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/EchoResponse.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/EchoResponse.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/EchoResponse.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,11 @@
+package net.geant.perfsonar.nmwg.response;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public class EchoResponse {
+ public static void writeEcho(Writer writer, String requestId) throws
IOException {
+ TemplateEngine.put("requestId", requestId);
+ TemplateEngine.evaluate(writer, EchoResponse.class,
"EchoResponse.template");
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/SelfTestResponse.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/SelfTestResponse.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/SelfTestResponse.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,48 @@
+package net.geant.perfsonar.nmwg.response;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import net.geant.perfsonar.ServiceType;
+import net.geant.perfsonar.selftest.SelfTestLogger;
+
+public class SelfTestResponse implements SelfTestLogger {
+ private Writer writer;
+
+ public SelfTestResponse(ServiceType serviceType, String serviceName)
throws Exception {
+ TemplateEngine.put("serviceType", serviceType);
+ TemplateEngine.put("serviceName", serviceName);
+ }
+
+ public void begin(Writer writer, String requestId) throws IOException
{
+ this.writer = writer;
+ TemplateEngine.put("requestId", requestId);
+ TemplateEngine.evaluate(writer, SelfTestResponse.class,
"SelfTest_header.template");
+ }
+
+ public void end() throws IOException {
+ TemplateEngine.evaluate(writer, SelfTestResponse.class,
"SelfTest_footer.template");
+ writer = null;
+ }
+
+ public void success(String name, String successMessage) {
+ TemplateEngine.put("name", name);
+ TemplateEngine.put("message", successMessage);
+ try {
+ TemplateEngine.evaluate(writer,
SelfTestResponse.class, "SelfTest_success.template");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void failure(String name, String message) {
+ TemplateEngine.put("name", name);
+ TemplateEngine.put("message", message);
+ try {
+ TemplateEngine.evaluate(writer,
SelfTestResponse.class, "SelfTest_failure.template");
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/TemplateEngine.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/TemplateEngine.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/nmwg/response/TemplateEngine.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,47 @@
+package net.geant.perfsonar.nmwg.response;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+
+public class TemplateEngine {
+ private final static VelocityEngine templateEngine = new
VelocityEngine();
+ private final static VelocityContext context = new VelocityContext();
+
+ static {
+ try {
+ templateEngine.init();
+ } catch (Exception ex) {
+ // TODO Auto-generated catch block
+ ex.printStackTrace();
+ }
+ }
+
+ private static InputStream getTemplate(Class<?> homeDir, String name)
throws IOException {
+ final InputStream in =
homeDir.getClassLoader().getResourceAsStream(
+ getFullPath(homeDir, name));
+
+ if (in == null)
+ throw new IOException("Template " + name + " cannot
be found.");
+ return in;
+ }
+
+ private static String getFullPath(Class<?> homeDir, String name) {
+ String result = homeDir.getPackage().getName();
+ for (; result.indexOf(".") != -1; result =
result.replace(".", File.separator));
+ return result + File.separator + name;
+ }
+
+ public static void evaluate(Writer writer, Class<?> homeDir, String
name) throws IOException {
+ //TODO change to not deprecated
+ templateEngine.evaluate(context, writer, "successMessage",
getTemplate(homeDir, name));
+ }
+
+ public static void put(String name, Object value) {
+ context.put(name, value);
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/Helper.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/Helper.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/Helper.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,16 @@
+package net.geant.perfsonar.xpath;
+
+import net.sf.cglib.proxy.Callback;
+import net.sf.cglib.proxy.Enhancer;
+
+public class Helper {
+
+ public static <T> T createMock(Class<T> controller, Callback
callback) {
+ final Enhancer e = new Enhancer();
+ e.setSuperclass(controller);
+ e.setCallback(callback);
+ @SuppressWarnings("unchecked")
+ T result = (T) e.create();
+ return result;
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/ReferenceInterceptor.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/ReferenceInterceptor.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/ReferenceInterceptor.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,23 @@
+package net.geant.perfsonar.xpath;
+
+import java.lang.reflect.Method;
+
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+public class ReferenceInterceptor implements MethodInterceptor {
+
+ public Object intercept(Object obj, Method method, Object[] args,
+ MethodProxy proxy) throws Throwable {
+
+ if (method.getName().equals("toString") ||
method.getName().equals("hashCode") || method.getName().equals("finalize")) {
+ return proxy.invokeSuper(obj, args);
+ }
+
+ if (args.length != 0)
+ throw new IllegalArgumentException(method + "
identifier method must have zero arguments.");
+
+ XPathDeserializer.putIdentifier(method.getDeclaringClass(),
method);
+ return null;
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathConfiguration.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathConfiguration.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathConfiguration.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,33 @@
+package net.geant.perfsonar.xpath;
+
+import java.lang.reflect.Method;
+
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+public class XPathConfiguration implements MethodInterceptor {
+
+ private String xpath;
+
+ public XPathConfiguration(String xpath) {
+ this.xpath = xpath;
+ }
+
+ public <T> T then(Class<T> controller) throws InstantiationException,
IllegalAccessException {
+ return Helper.createMock(controller, this);
+ }
+
+ public Object intercept(Object obj, Method method, Object[] args,
+ MethodProxy proxy) throws Throwable {
+
+ if (method.getName().equals("toString") ||
method.getName().equals("hashCode") || method.getName().equals("finalize")) {
+ return proxy.invokeSuper(obj, args);
+ }
+
+ if (args.length != 1)
+ throw new IllegalArgumentException("Setter method
must have exactly one argument of type String.");
+
+ XPathDeserializer.putXPath(xpath, method);
+ return null;
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathDeserializer.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathDeserializer.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/java/net/geant/perfsonar/xpath/XPathDeserializer.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,166 @@
+package net.geant.perfsonar.xpath;
+
+import java.io.Reader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.xpath.XPathException;
+
+import jlibs.xml.DefaultNamespaceContext;
+import jlibs.xml.sax.dog.NodeItem;
+import jlibs.xml.sax.dog.XMLDog;
+import jlibs.xml.sax.dog.XPathResults;
+import jlibs.xml.sax.dog.expr.Expression;
+
+import org.jaxen.saxpath.SAXPathException;
+import org.xml.sax.InputSource;
+
+public class XPathDeserializer {
+
+ private final static DefaultNamespaceContext context = new
DefaultNamespaceContext();
+ private Map<Class<?>, List<Object>> instances = new
Hashtable<Class<?>, List<Object>>();
+
+ private static Map<String, Method> xpaths = new Hashtable<String,
Method>();
+ private static Map<Class<?>, Method> identifiers = new
Hashtable<Class<?>, Method>();
+
+ public static void declarePrefix(String prefix, String uri) {
+ context.declarePrefix(prefix, uri);
+ }
+
+ public static XPathConfiguration whenXPath(String xpath) {
+ return new XPathConfiguration(xpath);
+ }
+
+ public static <T> T getReference(Class<T> type, String id) throws
InstantiationException, IllegalAccessException {
+ return type.newInstance();
+ }
+
+ public static <T> T identifier(Class<T> type) {
+ return Helper.createMock(type, new ReferenceInterceptor());
+ }
+
+ public static <T> T any(Class<T> type) {
+ return null;
+ }
+
+ public static void putXPath(String xpath, Method method) {
+ xpaths.put(xpath, method);
+ }
+
+ public static void clearConfiguration() {
+ xpaths.clear();
+ }
+
+ private static Set<String> getXPaths() {
+ return xpaths.keySet();
+ }
+
+ private static Method getXPathMethod(String xpath) {
+ return xpaths.get(xpath);
+ }
+
+ public XPathDeserializer() {
+ }
+
+ public List<?> deserialize(Reader reader) throws SAXPathException,
XPathException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException, InstantiationException {
+ final XMLDog dog = new XMLDog(context);
+ final List<Expression> expressions = new
ArrayList<Expression>();
+ for (String xpath : XPathDeserializer.getXPaths()) {
+ expressions.add(dog.addXPath(xpath));
+ }
+
+ final XPathResults results = dog.sniff(new
InputSource(reader));
+
+ for (Expression expr : sort(expressions)) {
+ @SuppressWarnings("unchecked")
+ final Collection<NodeItem> temp =
(Collection<NodeItem>) results.getResult(expr);
+ if (temp.size() <= 0) continue;
+ final Method method =
XPathDeserializer.getXPathMethod(expr.getXPath());
+
+ for (NodeItem item : temp) {
+ if
(method.getParameterTypes()[0].equals(String.class)) {
+ method.invoke(getInstance(method),
item.value);
+ } else {
+ final Object reference =
getReference(item.value, identifiers.get(method.getParameterTypes()[0]));
+ if (reference == null) continue;
+ method.invoke(getInstance(method),
reference);
+ }
+
+ increment(method);
+ }
+ }
+
+ final List<Object> result = new ArrayList<Object>();
+ for (List<Object> temp : instances.values())
+ result.addAll(temp);
+ return result;
+
+ }
+
+ private List<Expression> sort(List<Expression> expressions) {
+ final List<Expression> result = new ArrayList<Expression>();
+ final Iterator<Expression> iter = expressions.iterator();
+
+ for (Expression expr = iter.next(); iter.hasNext(); expr =
iter.next()) {
+ Method method =
XPathDeserializer.getXPathMethod(expr.getXPath());
+ if (method == null)
+ throw new RuntimeException("Cannot find
method for xpath " + expr.getXPath());
+ if
(method.getParameterTypes()[0].equals(String.class)) {
+ result.add(expr);
+ iter.remove();
+ }
+ }
+
+ result.addAll(expressions);
+
+ return result;
+ }
+
+ private Object getReference(String value, Method identifierMethod)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
+ if (instances.get(identifierMethod.getDeclaringClass()) ==
null)
+ return null;
+
+ for (Object instance :
instances.get(identifierMethod.getDeclaringClass())) {
+ if (identifierMethod.invoke(instance).equals(value))
+ return instance;
+ }
+ return null;
+ }
+
+ private void increment(Method method) {
+ if (counts.get(method) == null)
+ counts.put(method, 0);
+
+ counts.put(method, counts.get(method) + 1);
+ }
+
+ private Map<Method, Integer> counts = new Hashtable<Method,
Integer>();
+
+ private int getCount(Method method) {
+ if (counts.get(method) == null)
+ counts.put(method, 0);
+
+ return counts.get(method);
+ }
+
+ private Object getInstance(Method method) throws
InstantiationException, IllegalAccessException {
+ if (instances.get(method.getDeclaringClass()) == null) {
+ instances.put(method.getDeclaringClass(), new
ArrayList<Object>());
+ }
+ if (instances.get(method.getDeclaringClass()).size() <
getCount(method) + 1)
+
instances.get(method.getDeclaringClass()).add(method.getDeclaringClass().newInstance());
+
+ return
instances.get(method.getDeclaringClass()).get(getCount(method));
+ }
+
+ protected static void putIdentifier(Class<?> declaringClass, Method
method) {
+ XPathDeserializer.identifiers.put(declaringClass, method);
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/EchoResponse.template
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/EchoResponse.template
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/EchoResponse.template
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nmwg:message xmlns:nmwg="http://ggf.org/ns/nmwg/base/2.0/";
id="Resp_${requestId}" messageIdRef="${requestId}" type="EchoResponse">
+ <nmwg:metadata id="result-code">
+ <nmwg:eventType>echo/success</nmwg:eventType>
+ </nmwg:metadata>
+ <nmwg:data id="result-code-description" metadataIdRef="result-code">
+ <nmwgr:datum xmlns:nmwgr="http://ggf.org/ns/nmwg/result/2.0/";>This is
the success echo response from the service.</nmwgr:datum>
+ </nmwg:data>
+</nmwg:message>
\ No newline at end of file

Added:
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_failure.template
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_failure.template
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_failure.template
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,6 @@
+ <nmwg:metadata id="${name}">
+
<nmwg:eventType>http://schemas.perfsonar.net/tools/admin/selftest/${serviceType}/${serviceName}/${name}/failure/1.0</nmwg:eventType>
+ </nmwg:metadata>
+ <nmwg:data id="data_${name}" metadataIdRef="${name}">
+ <nmwg:datum>${message}</nmwg:datum>
+ </nmwg:data>

Added:
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_footer.template
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_footer.template
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_footer.template
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,2 @@
+ </nmwg:data>
+</nmwg:message>
\ No newline at end of file

Added:
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_header.template
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_header.template
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_header.template
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nmwg:message id="Resp_${requestId}" messageIdRef="${requestId}"
type="EchoResponse" xmlns:nmwg="http://ggf.org/ns/nmwg/base/2.0/";>
+ <nmwg:metadata id="meta">
+
<nmwg:eventType>http://schemas.perfsonar.net/tools/admin/selftest/1.0</nmwg:eventType>
+ </nmwg:metadata>
+ <nmwg:data id="data" metadataIdRef="meta">

Added:
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_success.template
===================================================================
---
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_success.template
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/main/resources/net/geant/perfsonar/nmwg/response/SelfTest_success.template
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,6 @@
+ <nmwg:metadata id="${name}">
+
<nmwg:eventType>http://schemas.perfsonar.net/tools/admin/selftest/${serviceType}/${serviceName}/${name}/success/1.0</nmwg:eventType>
+ </nmwg:metadata>
+ <nmwg:data id="data_${name}" metadataIdRef="${name}">
+ <nmwg:datum>${message}</nmwg:datum>
+ </nmwg:data>

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/PerfSONARTest.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/PerfSONARTest.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/PerfSONARTest.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,66 @@
+package net.geant.perfsonar;
+
+import static net.geant.perfsonar.helpers.SelfTestResult.failure;
+import static net.geant.perfsonar.helpers.SelfTestResult.success;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.Reader;
+
+import net.geant.perfsonar.helpers.NMWG;
+import net.geant.perfsonar.helpers.PerfSONARClient;
+import net.geant.perfsonar.helpers.SelfTestResult;
+import net.geant.perfsonar.mp.sshtelnet.Command;
+import net.geant.perfsonar.mp.sshtelnet.SSHTelnetMPService;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.xml.sax.SAXException;
+
+public class PerfSONARTest {
+
+ static final String REQUEST_ID = "request1";
+
+ private PerfSONARClient client;
+
+ @Before
+ public void givenPerfSONARClient() {
+ client = new PerfSONARClient(new SSHTelnetMPService());
+ }
+
+ @Test
+ public void checkEcho() throws SAXException {
+ assertEquals(NMWG.toEchoResponse(REQUEST_ID),
client.echo(REQUEST_ID));
+ }
+
+ @Test
+ public void checkSelfTest() throws SAXException {
+ assertEquals(
+ NMWG.toSelfTestResponse(
+ REQUEST_ID,
+ new SelfTestResult[] {
+
success("test1", "Test passed."),
+
failure("test2", "Test failed."), }),
+ client.selfTest(REQUEST_ID));
+ }
+
+ @Ignore @Test
+ public void checkMetadataKey() throws SAXException, IOException {
+ print(client.listAvailableCommands(REQUEST_ID).getReader());

+ }
+
+ @Test
+ public void checkSetupDataRequest() throws Exception {
+ final Command command1 = (Command)
Command.SHOW_ENVIRONMENT.newInstance();
+ command1.setRouterName("host1");
+ final Command command2 = (Command)
Command.PING_IPV6.newInstance();
+ command2.setRouterName("host2");
+ print(client.executeCommands(REQUEST_ID, command1,
command2).getReader());
+ }
+
+ private void print(Reader reader) throws IOException {
+ for (int i = reader.read(); i != -1; i = reader.read())
+ System.out.print((char) i);
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/SelfTestRunnerImpl.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/SelfTestRunnerImpl.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/SelfTestRunnerImpl.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,12 @@
+package net.geant.perfsonar;
+
+import net.geant.perfsonar.base.Scheduler;
+import net.geant.perfsonar.selftest.SelfTestLogger;
+import net.geant.perfsonar.selftest.SelfTestRunner;
+
+public class SelfTestRunnerImpl implements SelfTestRunner {
+ public void runSuite(Scheduler scheduler, SelfTestLogger logger) {
+ logger.success("test1", "Test passed.");
+ logger.failure("test2", "Test failed.");
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/configuration/ConfigurationTest.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/configuration/ConfigurationTest.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/configuration/ConfigurationTest.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,42 @@
+package net.geant.perfsonar.configuration;
+
+import static org.junit.Assert.*;
+
+import net.geant.perfsonar.Configuration;
+import net.geant.perfsonar.mp.sshtelnet.Command;
+import net.geant.perfsonar.mp.sshtelnet.ServiceController;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static net.geant.perfsonar.Configuration.any;
+import static net.geant.perfsonar.Configuration.configure;
+import static net.geant.perfsonar.Configuration.when;
+
+public class ConfigurationTest {
+
+ @Before
+ public void setUp() throws Exception {
+ Configuration.reset();
+ }
+
+ @Test
+ public void shouldListAvailableCommands() throws Exception {
+ configure(when("MetadataKeyRequest")
+
.then(ServiceController.class).listAvailableRoutersAndCommands());
+
+ assertEquals(
+
ServiceController.class.getMethod("listAvailableRoutersAndCommands"),
+
Configuration.getHandler("MetadataKeyRequest"));
+ }
+
+ @Test
+ public void shouldExecuteCommand() throws Exception {
+
configure(when("SetupDataRequest").then(ServiceController.class)
+ .execute(any(Command.class)));
+
+ assertEquals(
+ ServiceController.class.getMethod("execute",
Command.class),
+ Configuration.getHandler("SetupDataRequest"));
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/NMWG.groovy
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/NMWG.groovy
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/NMWG.groovy
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,199 @@
+package net.geant.perfsonar.helpers
+
+import net.geant.perfsonar.mp.sshtelnet.Command;
+import net.geant.perfsonar.mp.sshtelnet.Router;
+
+
+import java.io.Reader;
+
+import groovy.xml.MarkupBuilder
+
+class NMWG {
+ private static Reader createRequest(id, eventType, version) {
+ def writer = new StringWriter()
+ MarkupBuilder xml = new MarkupBuilder(writer)
+
xml.'nmwg:message'('xmlns:nmwg':'http://ggf.org/ns/nmwg/base/2.0/', id:id,
type:"EchoRequest") {
+ 'nmwg:metadata'(id:"meta") {
+ 'nmwg:eventType'
"http://schemas.perfsonar.net/tools/admin/${eventType}/${version}";
+ }
+ 'nmwg:data'(id:"data", metadataIdRef:"meta")
+ }
+
+ new StringReader(writer.toString())
+ }
+
+ static Reader toEchoRequest(String id) {
+ createRequest(id, "echo", "2.0")
+ }
+
+ static Reader toSelfTestRequest(String id) {
+ createRequest(id, "selftest", "1.0")
+ }
+
+ static Reader toMetadataKeyRequest(String id) {
+ def writer = new StringWriter()
+ MarkupBuilder xml = new MarkupBuilder(writer)
+
xml.'nmwg:message'('xmlns:nmwg':'http://ggf.org/ns/nmwg/base/2.0/', id:id,
type:"MetadataKeyRequest") {
+ 'nmwg:metadata'(id:"meta") {
+ 'nmwg:subject'(id:"server") {
+ 'nmwg:parameters'(id:"params") {
+
'nmwg:parameter'(name:"param", "SES")
+ }
+ }
+ }
+ 'nmwg:data'(id:"data", metadataIdRef:"meta")
+ }
+
+ new StringReader(writer.toString())
+ }
+
+ static Reader toSetupDataRequest(String id, Command... commands) {
+ def idx = 0;
+ final def writer = new StringWriter()
+ final MarkupBuilder xml = new MarkupBuilder(writer)
+ xml.mkp.xmlDeclaration(version:"1.0", encoding:"UTF-8")
+
xml.'nmwg:message'('xmlns:nmwg':'http://ggf.org/ns/nmwg/base/2.0/',
'xmlns:nmwgtopo':'http://ggf.org/ns/nmwg/topology/2.0/', id:id,
type:"SetupDataRequest") {
+ commands.each { command ->
+ 'nmwg:metadata'(id:"meta${idx}") {
+ 'nmwg:subject'(id:"subject${idx}") {
+
'nmwgtopo:endPoint'(type:"hostname", command.routerName)
+ }
+ 'nmwg:parameters'(id:"params${idx}") {
+
'nmwg:parameter'(name:"command", value:command.name)
+
'nmwg:parameter'(name:"description", value:command.description)
+
'nmwg:parameter'(name:"syntax", value:command.syntax)
+ }
+ 'nmwg:eventType' command.eventType
+ }
+ 'nmwg:data'(id:"data${idx}",
metadataIdRef:"meta${idx}")
+ }
+ }
+ new StringReader(writer.toString())
+ }
+
+ static Response toSelfTestResponse(requestId, SelfTestResult...
tests) {
+ createResponse(requestId) {
+ 'nmwg:metadata'(id:"meta") {
+ 'nmwg:eventType'
"http://schemas.perfsonar.net/tools/admin/selftest/1.0";
+ }
+ 'nmwg:data'(id:"data", metadataIdRef:"meta") {
+ tests.each { test ->
+ 'nmwg:metadata'(id:"${test.name}") {
+ 'nmwg:eventType'
"http://schemas.perfsonar.net/tools/admin/selftest/MP/SSHTELNET/${test.name}/${test.status}/1.0";
+ }
+ 'nmwg:data'(id:"data_${test.name}",
metadataIdRef:"${test.name}") {
+ 'nmwg:datum' test.message
+ }
+ }
+ }
+ }
+ }
+
+ static Response toEchoResponse(requestId) {
+ createResponse(requestId) {
+ 'nmwg:metadata'(id:"result-code") {
+ 'nmwg:eventType' "echo/success"
+ }
+ 'nmwg:data'(id:"result-code-description",
metadataIdRef:"result-code") {
+
'nmwgr:datum'('xmlns:nmwgr':"http://ggf.org/ns/nmwg/result/2.0/";,
+ "This is the success echo response
from the service.")
+ }
+ }
+ }
+
+ private static Response createResponse(requestId, body) {
+ final def writer = new StringWriter()
+ final MarkupBuilder xml = new MarkupBuilder(writer)
+ xml.mkp.xmlDeclaration(version:"1.0", encoding:"UTF-8")
+
xml.'nmwg:message'('xmlns:nmwg':"http://ggf.org/ns/nmwg/base/2.0/";,
+ id:"Resp_${requestId}", messageIdRef:"${requestId}",
type:"EchoResponse", body)
+
+ new Response(new StringReader(writer.toString()))
+ }
+
+ public static Response toMetadataKeyResponse(String requestId,
Router... routers) {
+ def idx = 0;
+ final def writer = new StringWriter()
+ final MarkupBuilder xml = new MarkupBuilder(writer)
+ xml.mkp.xmlDeclaration(version:"1.0", encoding:"UTF-8")
+
xml.'nmwg:message'('xmlns:nmwg':"http://ggf.org/ns/nmwg/base/2.0/";,
+ id:"${requestId}_resp", messageIdRef:"${requestId}",
type:"MetadataKeyResponse") {
+
+ routers.each { router ->
+ 'nmwg:metadata'(id:"metadata${idx}") {
+ 'nmwg:subject'(id:"subject${idx}",
router.name)
+
'nmwg:parameters'(id:"metaParams${idx}") {
+ 'nmwg:parameter'(name:"url",
value:router.address.hostAddress)
+ }
+ }
+ idx++
+ }
+
+ idx = 0
+ routers.each { router ->
+ 'nmwg:metadata'(id:"resultCodeMeta_${idx}") {
+
'nmwg:subject'(id:"resultCodeSubj_${idx}", metadataIdRef:"metadata${idx}")
+
'nmwg:eventType'("success.mp.sshtelnet")
+ }
+ 'nmwg:data'(id:"resultCodeMeta_${idx}",
metadataIdRef:"resultCodeMeta_${idx}") {
+
'nmwgr:datum'('xmlns:nmwgr':"http://ggf.org/ns/nmwg/result/2.0/";,
"Successfully executed MetaDataKeyRequest")
+ }
+ idx++
+ }
+
+ idx = 0
+ routers.each { router ->
+ 'nmwg:data'(id:"data${idx}",
metadataIdRef:"metadata${idx}") {
+ router.commands.each { command ->
+
'nmwgr:datum'('xmlns:nmwgr':"http://ggf.org/ns/nmwg/result/2.0/";) {
+
'nmwg:parameters'(id:"params${idx}") {

+
'nmwg:parameter'(name:"command", value:command.name)
+
'nmwg:parameter'(name:"description", value:command.description)
+ if
(command.syntax == null)
+
'nmwg:parameter'(name:"syntax")
+ else
+
'nmwg:parameter'(name:"syntax", value:command.syntax)
+ }
+
'nmwg:eventType'(command.eventType)
+ }
+ }
+ }
+ idx++
+ }
+ }
+
+ new Response(new StringReader(writer.toString()))
+ }
+
+ public static Response toSetupDataResponse(String requestId,
Command... commands) {
+ def idx = 0;
+ final def writer = new StringWriter()
+ final MarkupBuilder xml = new MarkupBuilder(writer)
+ xml.mkp.xmlDeclaration(version:"1.0", encoding:"UTF-8")
+
xml.'nmwg:message'('xmlns:nmwg':"http://ggf.org/ns/nmwg/base/2.0/";,
id:"${requestId}_resp", messageIdRef:"${requestId}",
type:"SetupDataResponse") {
+ commands.each { command ->
+ 'nmwg:metadata'(id:"meta${idx}") {
+ 'nmwg:subject'(id:"subject${idx}") {
+
'nmwgtopo:endPoint'('xmlns:nmwgtopo':"http://ggf.org/ns/nmwg/topology/2.0/";,
type:"hostname", command.routerName)
+ }
+ 'nmwg:parameters'(id:"params${idx}")
+ 'nmwg:eventType'(command.eventType)
+ }
+
+ 'nmwg:data'(id:"data${idx}",
metadataIdRef:"meta${idx}") {
+ 'nmwg:datum'(command.result)
+ }
+
'nmwg:metadata'(id:"resultCodeMeta_meta${idx}") {
+
'nmwg:subject'(id:"resultCodeSubj_meta${idx}", metadataIdRef:"meta${idx}")
+ 'nmwg:eventType'("success.mp.sshtelnet")
+ }
+ 'nmwg:data'(id:"resultCodeData_meta${idx}",
metadataIdRef:"resultCodeMeta_meta${idx}") {
+
'nmwgr:datum'('xmlns:nmwgr':"http://ggf.org/ns/nmwg/result/2.0/";,
"Successfully executed request")
+ }
+
+ idx++
+ }
+ }
+ new Response(new StringReader(writer.toString()))
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARClient.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARClient.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARClient.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,41 @@
+package net.geant.perfsonar.helpers;
+
+import java.io.Reader;
+
+import javax.xml.transform.sax.SAXSource;
+
+import net.geant.perfsonar.PerfSONAR;
+import net.geant.perfsonar.mp.sshtelnet.Command;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+
+public class PerfSONARClient {
+ private PerfSONAR service;
+
+ public PerfSONARClient(PerfSONAR service) {
+ this.service = service;
+ }
+
+ public Response echo(String id) throws SAXException {
+ return new Response(invoke(NMWG.toEchoRequest(id)));
+ }
+
+ public Response selfTest(String id) throws SAXException {
+ return new Response(invoke(NMWG.toSelfTestRequest(id)));
+ }
+
+ private Reader invoke(Reader request) throws SAXException {
+ return service.invoke(new
SAXSource(XMLReaderFactory.createXMLReader(), new
InputSource(request))).getInputSource().getCharacterStream();
+ }
+
+ public Response listAvailableCommands(String id) throws SAXException {
+ return new Response(invoke(NMWG.toMetadataKeyRequest(id)));
+ }
+
+ public Response executeCommands(String id, Command... commands)
throws SAXException {
+ return new Response(invoke(NMWG.toSetupDataRequest(id,
commands)));
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARServiceClient.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARServiceClient.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/PerfSONARServiceClient.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,38 @@
+package net.geant.perfsonar.helpers;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.Dispatch;
+import javax.xml.ws.Service;
+import javax.xml.ws.soap.SOAPBinding;
+
+import org.xml.sax.SAXException;
+
+
+public class PerfSONARServiceClient {
+ private Dispatch<StreamSource> client;
+
+ public PerfSONARServiceClient(String url) {
+ final String NAMESPACE = "http://base3.perfsonar.geant.net/";;
+ final QName PORT = new QName(NAMESPACE, "PerfSONARPort");
+ final Service service = Service.create(new QName(NAMESPACE,
+ "PerfSONARService"));
+ service.addPort(PORT, SOAPBinding.SOAP11HTTP_BINDING, url);
+ client = service.createDispatch(PORT, StreamSource.class,
Service.Mode.PAYLOAD);
+ }
+
+ public Response echo(String id) throws SAXException {
+ return new Response(invoke(NMWG.toEchoRequest(id)));
+ }
+
+ public Response selfTest(String id) throws SAXException {
+ return new Response(invoke(NMWG.toSelfTestRequest(id)));
+ }
+
+ private InputStream invoke(Reader request) throws SAXException {
+ return client.invoke(new
StreamSource(request)).getInputStream();
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/Response.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/Response.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/Response.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,50 @@
+package net.geant.perfsonar.helpers;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import org.custommonkey.xmlunit.Diff;
+
+public class Response {
+ private final Reader input;
+
+ protected Response(InputStream input) {
+ this.input = new InputStreamReader(input);
+ }
+
+ protected Response(Reader input) {
+ this.input = input;
+ }
+
+ public boolean equals(Object obj) {
+ if (obj instanceof Response)
+ return equals(((Response) obj).input);
+
+ if (!(obj instanceof Reader))
+ return false;
+
+ try {
+ return new Diff((Reader) obj, input).identical();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return false;
+ }
+ }
+
+ public Reader getReader() {
+ return this.input;
+ }
+
+ public String toString() {
+ final StringBuffer buffer = new StringBuffer();
+ try {
+ for (int ch = input.read(); ch != -1; ch =
input.read())
+ buffer.append((char) ch);
+ } catch (IOException e) {
+ return null;
+ }
+ return buffer.toString();
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/SelfTestResult.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/SelfTestResult.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/helpers/SelfTestResult.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,21 @@
+package net.geant.perfsonar.helpers;
+
+public class SelfTestResult {
+ protected String name;
+ protected String message;
+ protected String status;
+
+ private SelfTestResult(String name, String message, String status) {
+ this.name = name;
+ this.message = message;
+ this.status = status;
+ }
+
+ public static SelfTestResult failure(String name, String message) {
+ return new SelfTestResult(name, message, "failure");
+ }
+
+ public static SelfTestResult success(String name, String message) {
+ return new SelfTestResult(name, message, "success");
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Command.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Command.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Command.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,163 @@
+package net.geant.perfsonar.mp.sshtelnet;
+
+import java.io.IOException;
+
+public class Command {
+
+ public static final Command PING = new Command("ping", "ping an [ip
address]", "[ip address]", "IP_PING");
+
+ public static Command SHOW_ENVIRONMENT = new Command("show
environment", "show chassis environment", "",
"http://schemas.perfsonar.net/tools/sshtelnet/STATUS_SHOW_ENVIRONMENT/1.0";);
+
+ public static final Command TRACE_IPV4 = new Command("trace", "trace
the IPv4 path to [ip address]", "[ip address]",
"http://schemas.perfsonar.net/tools/sshtelnet/IP_TRACEROUTE/1.0";);
+
+ public static final Command TRACE_IPV6 = new Command("trace ipv6",
"trace the ipv6 path to [IPv6 address]", "[IPv6 address]",
"http://schemas.perfsonar.net/tools/sshtelnet/IPv6_TRACEROUTE/1.0";);
+
+ public static final Command SHOW_INTERFACES_FILTERS = new
Command("show interfaces filters", "display ip access lists", "",
"http://schemas.perfsonar.net/tools/sshtelnet/IP_ACCESS_LIST/1.0";);
+
+ //public static final Command SHOW_IPV6_INTERFACES_FILTERS = new
Command("show interfaces filters", "display IPv6 access lists");
+
+ public static final Command SHOW_IPV6_INTERFACES = new Command("show
interfaces", "display the interfaces which are configured for IPv6",
"[interface] extensive",
"http://schemas.perfsonar.net/tools/sshtelnet/IPv6_INTERFACES/1.0";);
+
+ public static final Command PING_IPV6 = new Command("ping inet6",
"ping an [IPv6 address]", "[IPv6 address]",
"http://schemas.perfsonar.net/tools/sshtelnet/IPv6_PING/1.0";);
+
+ public static final Command TRACEROUTER_IPV6 = new
Command("traceroute inet6", "trace the ipv6 path to [ipv6 address]", "[IPv6
address]",
"http://schemas.perfsonar.net/tools/sshtelnet/IPv6_TRACEROUTE/1.0";);
+
+ private static Router currentRouter;
+
+ private String routerName;
+
+ private String name;
+ private String description;
+ private String syntax;
+
+ private Router router;
+
+ private String eventType;
+
+ private Command(String name, String description, String syntax,
String eventType) {
+ this(currentRouter, name, description, syntax, eventType);
+ }
+
+ private Command(Router router, String name, String description,
String syntax, String eventType) {
+ this.router = router;
+ this.name = name;
+ this.description = description;
+ this.syntax = syntax;
+ this.eventType = eventType;
+ }
+
+ public Command() {
+ this(currentRouter, null, null, null, null);
+ }
+
+ public String getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(String eventType) {
+ this.eventType = eventType;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getSyntax() {
+ return syntax;
+ }
+
+ public void execute() throws IOException {
+ //router.execute(this);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((description == null) ? 0 :
description.hashCode());
+ result = prime * result + ((name == null) ? 0 :
name.hashCode());
+ result = prime * result + ((syntax == null) ? 0 :
syntax.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Command other = (Command) obj;
+ if (description == null) {
+ if (other.description != null)
+ return false;
+ } else if (!description.equals(other.description))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (syntax == null) {
+ if (other.syntax != null)
+ return false;
+ } else if (!syntax.equals(other.syntax))
+ return false;
+ return true;
+ }
+
+ public void setCurrentRouter(Router router) {
+ Command.currentRouter = router;
+ this.router = router;
+ }
+
+ public void setRouter(Router router) {
+ this.router = router;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setSyntax(String syntax) {
+ this.syntax = syntax;
+ }
+
+ @Override
+ public String toString() {
+ return "Command [name=" + name + ", description=" +
description
+ + ", syntax=" + syntax + ", router=" +
(router != null ? router.getName() : routerName) + "]";
+ }
+
+ public String getResult() {
+ return "For address family: IPv4 Unicast@@@@@@For address
family: IPv6 Unicast@@@@@@For address family: VPNv4 Unicast@@@@@@For address
family: IPv4 Multicast@@@@@@For address family: IPv6 Multicast@@@@@@For
address family: NSAP Unicast@@@---END---";
+ }
+
+ public String getRouterName() {
+ return routerName;
+ }
+
+ public void setRouterName(String routerName) {
+ this.routerName = routerName;
+ }
+
+ public Command newInstance() {
+ final Command result = new Command();
+ result.setDescription(this.description);
+ result.setEventType(this.eventType);
+ result.setName(this.name);
+ result.setRouterName(this.routerName);
+ result.setSyntax(this.syntax);
+ return result;
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Router.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Router.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/Router.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,148 @@
+package net.geant.perfsonar.mp.sshtelnet;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Router {
+
+ private static final int PORT_UNDEFINED = -1;
+
+ public String name;
+
+ public InetAddress address;
+
+ public int port;
+
+ private String id;
+
+ private List<Command> commands = new ArrayList<Command>();
+
+ public Router() {
+
+ }
+
+ public Router(String id, String name, InetAddress address, Command...
commands) {
+ this(id, name, address, PORT_UNDEFINED, commands);
+ }
+
+ public Router(String id, String name, InetAddress address, int port,
Command... commands) {
+ this.id = id;
+ this.name = name;
+ this.address = address;
+ this.port = port;
+ for (Command c : commands) {
+ c.setRouter(this);
+ addCommand(c);
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public InetAddress getAddress() {
+ return address;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void addCommand(Command command) {
+ commands.add(command);
+ }
+
+ public List<Command> getCommands() {
+ return Collections.unmodifiableList(commands);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((address == null) ? 0 :
address.hashCode());
+ result = prime * result
+ + ((commands == null) ? 0 :
commands.hashCode());
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ result = prime * result + ((name == null) ? 0 :
name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Router other = (Router) obj;
+ if (address == null) {
+ if (other.address != null)
+ return false;
+ } else if (!address.equals(other.address))
+ return false;
+ if (commands == null) {
+ if (other.commands != null)
+ return false;
+ } else if (!commands.equals(other.commands))
+ return false;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
+// public RouterConnection connect() throws IOException {
+// //return connectionManager.connect(url, port);
+// return null;
+// }
+
+ @Override
+ public String toString() {
+ return "Router [name=" + name + ", address=" + address + ",
id=" + id
+ + ", commands=" + commands + "]";
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setAddress(String address) throws UnknownHostException {
+ this.address = InetAddress.getAllByName(address)[0];
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void startAddingCommands(String routerId) {
+ // TODO Auto-generated method stub
+
+ }
+
+// public void execute(Command command) throws IOException {
+// RouterConnection conn = null;
+// try {
+// conn = connect();
+// //command.result =
device.filter(conn.execute(device.toCommand(command)));
+// } finally {
+// if (conn != null)
+// conn.close();
+// }
+// }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/SSHTelnetMPService.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/SSHTelnetMPService.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/SSHTelnetMPService.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,57 @@
+package net.geant.perfsonar.mp.sshtelnet;
+
+import static net.geant.perfsonar.Configuration.configure;
+import static net.geant.perfsonar.Configuration.when;
+import static net.geant.perfsonar.xpath.XPathDeserializer.any;
+import static net.geant.perfsonar.xpath.XPathDeserializer.whenXPath;
+
+import javax.xml.ws.WebServiceProvider;
+
+import net.geant.perfsonar.PerfSONAR;
+import net.geant.perfsonar.ServiceType;
+
+@WebServiceProvider(targetNamespace
= "http://base3.perfsonar.geant.net/";,
+portName = "PerfSONARPort", serviceName = "PerfSONARService")
+public class SSHTelnetMPService extends PerfSONAR {
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.MP;
+ }
+
+ @Override
+ protected String getServiceName() {
+ return "SSHTELNET";
+ }
+
+ static {
+ try {
+ configure(
+
when("MetadataKeyRequest").then(ServiceController.class).listAvailableRoutersAndCommands());
+
+ configure(
+
when("SetupDataRequest").then(ServiceController.class).execute(any(Command.class)));
+
+ whenXPath(
+
"nmwg:message/nmwg:metadata/nmwg:subject/nmwgtopo:endPoint/text()")
+
.then(Command.class).setRouterName(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:metadata/nmwg:eventType/text()")
+
.then(Command.class).setEventType(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:metadata/nmwg:parameters/nmwg:parameter[@name='command']/@value")
+
.then(Command.class).setName(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:metadata/nmwg:parameters/nmwg:parameter[@name='description']/@value")
+
.then(Command.class).setDescription(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:metadata/nmwg:parameters/nmwg:parameter[@name='syntax']/@value")
+
.then(Command.class).setSyntax(any(String.class));
+ } catch (Exception ex) {
+ }
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/ServiceController.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/ServiceController.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/mp/sshtelnet/ServiceController.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,24 @@
+package net.geant.perfsonar.mp.sshtelnet;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.List;
+
+public class ServiceController {
+ public ServiceController() { }
+
+ public List<Router> listAvailableRoutersAndCommands() throws
UnknownHostException {
+ return Arrays.asList(
+ new Router("metadata0", "Cisco",
InetAddress.getAllByName("10.10.14.4")[0],
+ Command.SHOW_ENVIRONMENT, Command.PING),
+ new Router("metadata1", "JuniperGeantAmsterdam",
InetAddress.getAllByName("rt1.ams.nl.geant2.net")[0],
+ Command.SHOW_INTERFACES_FILTERS));
+ }
+
+ public Command execute(Command command) throws IOException {
+ command.execute();
+ return command;
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/xpath/XPathDeserializerTest.java
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/xpath/XPathDeserializerTest.java
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/java/net/geant/perfsonar/xpath/XPathDeserializerTest.java
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,94 @@
+package net.geant.perfsonar.xpath;
+
+import static net.geant.perfsonar.xpath.XPathDeserializer.any;
+import static net.geant.perfsonar.xpath.XPathDeserializer.declarePrefix;
+import static net.geant.perfsonar.xpath.XPathDeserializer.getReference;
+import static net.geant.perfsonar.xpath.XPathDeserializer.identifier;
+import static net.geant.perfsonar.xpath.XPathDeserializer.whenXPath;
+import static org.junit.Assert.assertEquals;
+
+import java.io.Reader;
+import java.net.InetAddress;
+import java.util.Arrays;
+
+import net.geant.perfsonar.helpers.NMWG;
+import net.geant.perfsonar.mp.sshtelnet.Command;
+import net.geant.perfsonar.mp.sshtelnet.Router;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class XPathDeserializerTest {
+ private static final String REQUEST_ID = "1";
+
+ private Router[] routers;
+ private Reader reader;
+ private XPathDeserializer deserializer;
+
+ @Before
+ public void givenMessageAndDeserializationConfigured() throws
Exception {
+
+ routers = new Router[] {
+ new Router("metadata0", "test1",
+
InetAddress.getAllByName("192.168.1.1")[0],
+ Command.PING_IPV6),
+ new Router("metadata1", "test2",
+
InetAddress.getAllByName("192.168.1.2")[0],
+ Command.SHOW_ENVIRONMENT) };
+
+ reader = NMWG.toMetadataKeyResponse(REQUEST_ID,
routers).getReader();
+
+ declarePrefix("nmwg", "http://ggf.org/ns/nmwg/base/2.0/";);
+ declarePrefix("nmwgr", "http://ggf.org/ns/nmwg/result/2.0/";);
+
+
whenXPath("nmwg:message/nmwg:metadata[starts-with(@id,'metadata')]/@id")
+ .then(Router.class).setId(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:metadata/nmwg:subject[starts-with(@id, 'subject')]/text()")
+
.then(Router.class).setName(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:metadata[starts-with(nmwg:subject/@id,
'subject')]/nmwg:parameters/nmwg:parameter[@name='url']/@value")
+
.then(Router.class).setAddress(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:data[starts-with(@metadataIdRef,
'metadata')]/@metadataIdRef")
+ .then(Command.class).setCurrentRouter(
+ getReference(Router.class,
identifier(Router.class).getId()));
+
+ whenXPath(
+
"nmwg:message/nmwg:data[starts-with(@metadataIdRef,
'metadata')]/nmwgr:datum/nmwg:parameters/nmwg:parameter[@name='command']/@value")
+
.then(Command.class).setName(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:data[starts-with(@metadataIdRef,
'metadata')]/nmwgr:datum/nmwg:parameters/nmwg:parameter[@name='description']/@value")
+
.then(Command.class).setDescription(any(String.class));
+
+ whenXPath(
+
"nmwg:message/nmwg:data[starts-with(@metadataIdRef,
'metadata')]/nmwgr:datum/nmwg:parameters/nmwg:parameter[@name='syntax']/@value")
+
.then(Command.class).setSyntax(any(String.class));
+
+ deserializer = new XPathDeserializer();
+ }
+
+ @After
+ public void clearConfiguration() {
+ XPathDeserializer.clearConfiguration();
+ }
+
+ @Test @Ignore
+ public void shouldReturnRouters() throws Exception {
+
+ assertEquals(Arrays.asList(
+ Command.PING_IPV6,
+ Command.SHOW_ENVIRONMENT,
+ new Router("metadata0", "test1", InetAddress
+
.getAllByName("192.168.1.1")[0]),
+ new Router("metadata1", "test2", InetAddress
+
.getAllByName("192.168.1.2")[0])),
+ deserializer.deserialize(reader));
+ }
+}

Added:
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/MetadataKeyResponse.template
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/MetadataKeyResponse.template
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/MetadataKeyResponse.template
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<nmwg:message id="${requestId}_resp" messageIdRef="${requestId}"
type="MetadataKeyResponse" xmlns:nmwg="http://ggf.org/ns/nmwg/base/2.0/";>
+#set( $idx = 0 )
+#foreach ($router in $result)
+ <nmwg:metadata id="metadata${idx}">
+ <nmwg:subject id="subject${idx}">${router.name}</nmwg:subject>
+ <nmwg:parameters id="metaParams${idx}">
+ <nmwg:parameter name="url" value="${router.address.hostAddress}"
/>
+ </nmwg:parameters>
+ </nmwg:metadata>
+ <nmwg:metadata id="resultCodeMeta_${idx}">
+ <nmwg:subject id="resultCodeSubj_${idx}"
metadataIdRef="metadata${idx}" />
+ <nmwg:eventType>success.mp.sshtelnet</nmwg:eventType>
+ </nmwg:metadata>
+ <nmwg:data id="resultCodeData_${idx}"
metadataIdRef="resultCodeMeta_${idx}">
+ <nmwgr:datum
xmlns:nmwgr="http://ggf.org/ns/nmwg/result/2.0/";>Successfully executed
MetaDataKeyRequest</nmwgr:datum>
+ </nmwg:data>
+#set( $idx = $idx + 1 )
+#end
+#set( $idx = 0 )
+#foreach ($router in $result)
+ <nmwg:data id="data${idx}" metadataIdRef="metadata${idx}">
+#foreach ($command in $router.commands)
+ <nmwgr:datum xmlns:nmwgr="http://ggf.org/ns/nmwg/result/2.0/";>
+ <nmwg:parameters id="params${idx}">
+ <nmwg:parameter name="command" value="${command.name}" />
+ <nmwg:parameter name="description"
value="${command.description}" />
+#if (${command.syntax})
+ <nmwg:parameter name="syntax" />
+#else
+ <nmwg:parameter name="syntax" value="${command.syntax} />
+#end
+ </nmwg:parameters>
+ <nmwg:eventType>${command.eventType}</nmwg:eventType>
+ </nmwgr:datum>
+#end
+ </nmwg:data>
+#set( $idx = $idx + 1 )
+#end
+</nmwg:message>
\ No newline at end of file

Added:
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/SetupDataResponse.template
===================================================================
---
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/SetupDataResponse.template
(rev 0)
+++
trunk/psBase3/perfsonar-base/src/test/resources/net/geant/perfsonar/mp/sshtelnet/SetupDataResponse.template
2013-01-09 22:53:48 UTC (rev 6088)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<nmwg:message xmlns:nmwg="http://ggf.org/ns/nmwg/base/2.0/";
id="${requestId}_resp" messageIdRef="${requestId}" type="SetupDataResponse">
+#set ($idx = 0)
+#foreach ($command in $result)
+ <nmwg:metadata id="meta${idx}">
+ <nmwg:subject id="subject${idx}">
+ <nmwgtopo:endPoint
xmlns:nmwgtopo="http://ggf.org/ns/nmwg/topology/2.0/";
type="hostname">${command.routerName}</nmwgtopo:endPoint>
+ </nmwg:subject>
+ <nmwg:parameters id="params${idx}" />
+ <nmwg:eventType>${command.eventType}</nmwg:eventType>
+ </nmwg:metadata>
+ <nmwg:data id="data${idx}" metadataIdRef="meta${idx}">
+ <nmwg:datum>${command.result}</nmwg:datum>
+ </nmwg:data>
+ <nmwg:metadata id="resultCodeMeta_meta${idx}">
+ <nmwg:subject id="resultCodeSubj_meta${idx}"
metadataIdRef="meta${idx}" />
+ <nmwg:eventType>success.mp.sshtelnet</nmwg:eventType>
+ </nmwg:metadata>
+ <nmwg:data id="resultCodeData_meta${idx}"
metadataIdRef="resultCodeMeta_meta${idx}">
+ <nmwgr:datum
xmlns:nmwgr="http://ggf.org/ns/nmwg/result/2.0/";>Successfully executed
request</nmwgr:datum>
+ </nmwg:data>
+#set ($idx = $idx + 1)
+#end
+</nmwg:message>



  • [pS-dev] [GEANT/SA2/ps-java-services] r6088 - in trunk/psBase3/perfsonar-base: . 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/handlers src/main/java/net/geant/perfsonar/handlers/selftest src/main/java/net/geant/perfsonar/nmwg src/main/java/net/geant/perfsonar/nmwg/response src/main/java/net/geant/perfsonar/xpath src/main/resources src/main/resources/net src/main/resources/net/geant src/main/resources/net/geant/perfsonar src/main/resources/net/geant/perfsonar/nmwg src/main/resources/net/geant/perfsonar/nmwg/response 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/configuration src/test/java/net/geant/perfsonar/helpers src/test/java/net/geant/perfsonar/mp src/test/java/net/geant/perfsonar/mp/sshtelnet src/test/java/net/geant/perfsonar/xpath src/test/resources src/test/resources/net src/test/resources/net/geant src/test/resources/net/geant/perfsonar src/test/resources/net/geant/perfsonar/mp src/test/resources/net/geant/perfsonar/mp/sshtelnet, svn-noreply, 01/09/2013

Archive powered by MHonArc 2.6.16.

Top of Page