Skip to Content.
Sympa Menu

perfsonar-dev - perfsonar: r4722 - in trunk/ps-mdm-lsclient-impl: . src/main/java/org/perfsonar/ri/lsclient src/main/java/org/perfsonar/ri/lsclient/level0 src/main/java/org/perfsonar/ri/lsclient/level1 src/main/java/org/perfsonar/ri/lsclient/level1/jaxb src/resources/org/perfsonar/ri/lsclient/level1/jaxb src/test/java/org/perfsonar/ri/lsclient/level0/test src/test/java/org/perfsonar/ri/lsclient/level1/test

Subject: perfsonar development work

List archive

perfsonar: r4722 - in trunk/ps-mdm-lsclient-impl: . src/main/java/org/perfsonar/ri/lsclient src/main/java/org/perfsonar/ri/lsclient/level0 src/main/java/org/perfsonar/ri/lsclient/level1 src/main/java/org/perfsonar/ri/lsclient/level1/jaxb src/resources/org/perfsonar/ri/lsclient/level1/jaxb src/test/java/org/perfsonar/ri/lsclient/level0/test src/test/java/org/perfsonar/ri/lsclient/level1/test


Chronological Thread 
  • From:
  • To:
  • Subject: perfsonar: r4722 - in trunk/ps-mdm-lsclient-impl: . src/main/java/org/perfsonar/ri/lsclient src/main/java/org/perfsonar/ri/lsclient/level0 src/main/java/org/perfsonar/ri/lsclient/level1 src/main/java/org/perfsonar/ri/lsclient/level1/jaxb src/resources/org/perfsonar/ri/lsclient/level1/jaxb src/test/java/org/perfsonar/ri/lsclient/level0/test src/test/java/org/perfsonar/ri/lsclient/level1/test
  • Date: Fri, 28 Nov 2008 13:28:03 -0500

Author: michael.bischoff
Date: 2008-11-28 13:28:03 -0500 (Fri, 28 Nov 2008)
New Revision: 4722

Added:

trunk/ps-mdm-lsclient-impl/src/test/java/org/perfsonar/ri/lsclient/level0/test/SoapEndpointTest.java

trunk/ps-mdm-lsclient-impl/src/test/java/org/perfsonar/ri/lsclient/level1/test/TestJaxbTools.java
Modified:
trunk/ps-mdm-lsclient-impl/pom.xml

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/LsClientImpl.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/Level0Impl.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/SOAPEndpoint.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryProcessImpl.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryQuery.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryStepImpl.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/Level1Impl.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/RootHintsFileDownloader.java

trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/jaxb/JaxbTools.java

trunk/ps-mdm-lsclient-impl/src/resources/org/perfsonar/ri/lsclient/level1/jaxb/jaxb.index
Log:
Improved overall robustness
Added topology selection to discovery messages

Modified: trunk/ps-mdm-lsclient-impl/pom.xml
===================================================================
--- trunk/ps-mdm-lsclient-impl/pom.xml 2008-11-28 18:26:13 UTC (rev 4721)
+++ trunk/ps-mdm-lsclient-impl/pom.xml 2008-11-28 18:28:03 UTC (rev 4722)
@@ -73,6 +73,19 @@
<version>1.0RC1</version>
<optional>false</optional>
</dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.5.5</version>
+ <optional>false</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <version>1.5.5</version>
+ <scope>test</scope>
+ <optional>false</optional>
+ </dependency>
</dependencies>

<reporting>

Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/LsClientImpl.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/LsClientImpl.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/LsClientImpl.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -1,6 +1,5 @@
package org.perfsonar.ri.lsclient;

-
import org.perfsonar.lsclient.Level0LsClientInterface;
import org.perfsonar.lsclient.Level1LsClientInterface;
import org.perfsonar.lsclient.Level2LsClientInterface;
@@ -9,6 +8,8 @@
import org.perfsonar.ri.lsclient.level0.Level0Impl;
import org.perfsonar.ri.lsclient.level1.Level1Impl;
import org.perfsonar.ri.lsclient.level2.Level2Impl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;


/**
@@ -18,7 +19,9 @@
* @see AbstractLsClient
*/
public class LsClientImpl extends AbstractLsClient implements LsClient {
-
+
+ protected final Logger logger = LoggerFactory.getLogger(getClass());
+
private final Level0LsClientInterface level0 = new Level0Impl();
private final Level1LsClientInterface level1 = new Level1Impl(level0);
private final Level2LsClientInterface level2 = new Level2Impl(level0,
level1);
@@ -26,7 +29,17 @@
/**
* default no-arg constructor
*/
- public LsClientImpl() { /* no arg constructor */}
+ public LsClientImpl() {
+ if(logger.isDebugEnabled()) {
+ StackTraceElement[] trace =
Thread.currentThread().getStackTrace();
+ if(trace.length > 0) {
+ StackTraceElement element =
trace[trace.length-1];
+ logger.info("Creating LSClient.
("+element.getClassName()+"#"+element.getMethodName()+" in file
"+element.getFileName()+":"+element.getLineNumber()+")");
+ }
+ } else {
+ logger.info("Creating LSClient.");
+ }
+ }

@Override
protected Level0LsClientInterface getLevel0() {

Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/Level0Impl.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/Level0Impl.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/Level0Impl.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -1,13 +1,11 @@
package org.perfsonar.ri.lsclient.level0;

-import static java.util.logging.Level.SEVERE;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.net.MalformedURLException;
+import java.net.SocketTimeoutException;
import java.net.URL;
-import java.util.logging.Logger;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -19,13 +17,15 @@
import org.perfsonar.lsclient.Level0LsClientInterface;
import org.perfsonar.lsclient.LsQueryException;
import org.perfsonar.lsclient.data.LookupService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class Level0Impl implements Level0LsClientInterface {

+ protected final Logger logger = LoggerFactory.getLogger(getClass());
private static final String QUERY_EVENTTYPE =
"service.lookup.xquery";//"http://ogf.org/ns/nmwg/tools/org/perfsonar/service/lookup/query/xquery/2.0/";;
- private final Logger logger =
Logger.getLogger(Level0Impl.class.getName());
private final MessageFactory messageFactory;

public Level0Impl() {
@@ -33,7 +33,7 @@
try {
factory =
MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
} catch (SOAPException e) {
- logger.log(SEVERE,"LSClientImpl#LSClientImpl() -
couldn't create MessageFactory");
+ logger.error("couldn't create MessageFactory", e);
}
messageFactory = factory;
}
@@ -43,15 +43,23 @@
*/
public InputStream getRawQueryResult(LookupService lookupService,
String xquery) throws LsQueryException, IllegalArgumentException {
String xml = makeXml("<xquery:subject id=\"sub1\">", xquery,
"</xquery:subject>", QUERY_EVENTTYPE);
- InputStream inputStream = send(createMessage(xml),
lookupService);
+ SOAPMessage message = createMessage(xml);
+ logger.debug("Executing raw xquery ["+xml+"]");
+ InputStream inputStream = send(message, lookupService);
return new BufferedSoapStrippingStream(inputStream);
}

private SOAPMessage createMessage(String bodyXml) throws
LsQueryException {
+ if(messageFactory == null) {
+ logger.error("messageFactory is null most likely it
could not be created please check earlier logs");
+ throw new LsQueryException("messageFactory is null");
+ }
+
SOAPMessage message;
try {
message = messageFactory.createMessage();
} catch (SOAPException e) {
+ logger.error("Can't create a message", e);
throw new LsQueryException(e);
}

@@ -60,6 +68,7 @@
try {
message.getSOAPBody().addDocument(document);
} catch (SOAPException e) {
+ logger.error("Can't create a message", e);
new LsQueryException(e);
}

@@ -73,6 +82,7 @@
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new InputSource(new
StringReader(xml)));
} catch (Exception e) {
+ logger.error("Mailformed xml passed["+xml+"] to
method Level0Impl.getDocumentFromString() -> this is very likely a bug", e);
throw new LsQueryException("Can't create a document
from String",e);
}
}
@@ -82,9 +92,15 @@
try {
return endpoint.send(message);
} catch (SOAPException e) {
+ logger.warn("SOAP exception occoured during sending
message", e);
throw new LsQueryException(e);
- } catch (IOException e) {
+ } catch (SocketTimeoutException e) {
+ //stack trace is useless.
+ logger.warn("IOException occoured during sending
message - SocketTimeoutException connecting to "+target.getEndPoint());
throw new LsQueryException(e);
+ } catch (IOException e) {
+ logger.warn("IOException occoured during sending
message", e);
+ throw new LsQueryException(e);
}
}

@@ -92,6 +108,7 @@
try {
return lookupService.getEndPoint().toURL();
} catch (MalformedURLException e) {
+ logger.warn("The lookup service demotes a URI that
this implementation doesn't know how to contact. (it's not a http(s)
address)", e);
throw new UnsupportedOperationException("the
lookupservice contains a URI that this implementation doesn't
understand(expecting http/https URL)");
}
}
@@ -121,8 +138,10 @@
}

public InputStream getRawDiscoveryResponse(LookupService
lookupService, String summaryDescription) throws LsQueryException {
- String xml = makeDiscoveryXml(summaryDescription);
- InputStream inputStream = send(createMessage(xml),
lookupService);
+ String xml = makeDiscoveryXml(summaryDescription);
+ SOAPMessage message = createMessage(xml);
+ logger.debug("Executing raw discovery query ["+xml+"]");
+ InputStream inputStream = send(message, lookupService);
return new BufferedSoapStrippingStream(inputStream);
}


Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/SOAPEndpoint.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/SOAPEndpoint.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level0/SOAPEndpoint.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -3,6 +3,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.StringBufferInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
@@ -12,7 +13,11 @@
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;

+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public class SOAPEndpoint {
+ protected final Logger logger = LoggerFactory.getLogger(getClass());

private URL endPoint;

@@ -48,6 +53,12 @@
boolean success = checkResponse(httpConnection);
InputStream httpIn = (success ? httpConnection.getInputStream() :
httpConnection.getErrorStream());

+ StringBuilder builder = new StringBuilder();
+ int i;
+ while((i = httpIn.read())!=-1) builder.append((char)i);
+ System.out.println(builder.toString());
+ httpIn = new StringBufferInputStream(builder.toString());
+
return httpIn;
}

@@ -66,14 +77,16 @@
protected void sendMessage(SOAPMessage message, HttpURLConnection
httpConnection) throws IOException, SOAPException {
OutputStream out = httpConnection.getOutputStream();
httpConnection.connect();
- message.writeTo(out);
+ message.writeTo(out);
out.flush();
out.close();
}

private boolean checkResponse(HttpURLConnection httpConnection)
throws SOAPException, IOException {
+ logger.trace("cheching result code of request
(connection["+httpConnection+"])");
int responseCode = httpConnection.getResponseCode();

+ logger.trace("Responsecode for connection["+httpConnection+"]
is "+responseCode);
// let HTTP_INTERNAL_ERROR (500) through because it is used for SOAP
faults
if (responseCode == HttpURLConnection.HTTP_INTERNAL_ERROR) {
return false;
@@ -149,6 +162,7 @@
}

protected HttpURLConnection prepareConnection() throws IOException {
+ logger.trace("Setting connection settings[ Method:POST
allowUserInteraction:false DoOutput:true DoInput:true UserCaches:false
Timeout:5000msec FollowRedirects:true ]");
HttpURLConnection httpConnection = (HttpURLConnection)
endPoint.openConnection();
httpConnection.setRequestMethod("POST");
httpConnection.setAllowUserInteraction(false);

Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryProcessImpl.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryProcessImpl.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryProcessImpl.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -5,7 +5,6 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
@@ -20,19 +19,23 @@
import org.perfsonar.lsclient.data.LookupService;
import org.perfsonar.lsclient.data.ServiceType;
import org.perfsonar.lsclient.data.TopologyElement;
+import org.perfsonar.ri.lsclient.level1.Level1Impl.RootGlses;
import org.perfsonar.ri.lsclient.level1.jaxb.JaxbTools;
import org.perfsonar.ri.lsclient.level1.jaxb.ServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

public class DiscoveryProcessImpl implements DiscoveryProcess {

+ protected final Logger logger = LoggerFactory.getLogger(getClass());

private final Level0LsClientInterface level0;
- private final ConcurrentLinkedQueue<LookupService> rootServices;
+ private final RootGlses rootServices;
private final Set<TopologyElement> elements;
private final Set<EventType> eventTypes;
private final Set<ServiceType> type;
private final JAXBContext context;

- public DiscoveryProcessImpl(Level0LsClientInterface level0,
JAXBContext context, ConcurrentLinkedQueue<LookupService> rootGlses,
Set<TopologyElement> elements, Set<EventType> eventTypes, Set<ServiceType>
type) {
+ public DiscoveryProcessImpl(Level0LsClientInterface level0,
JAXBContext context, RootGlses rootGlses, Set<TopologyElement> elements,
Set<EventType> eventTypes, Set<ServiceType> type) {
if(rootGlses==null || rootGlses.isEmpty()) throw new
IllegalArgumentException("rootServices must be a non-null non-empty set.");
this.level0 = level0;
this.context = context;
@@ -68,22 +71,25 @@

protected DiscoveryStep nextStep(Set<LookupService>
referralLookupservices) {
// TODO query all referralLookupservices - only needed for
dLs not gLs
- return null;
+ throw new UnsupportedOperationException("not implemented");
}

protected DiscoveryStep firstStep(Set<LookupService>
referralLookupservices) {
InputStream inputStream = queryRootLs();
-
Collection<ServiceImpl> services;
try {
- services = JaxbTools.unMarshall(context, inputStream,
ServiceImpl.class);
+ services =
JaxbTools.unMarshallPerfsonarMessage(context, inputStream, ServiceImpl.class);
} catch (JAXBException e) {
- e.printStackTrace();
+ logger.warn("Exception while unMarshalling", e);
return new DiscoveryStepImpl(e);
} catch (XMLStreamException e) {
- e.printStackTrace();
+ logger.warn("Exception while unMarshalling", e);
return new DiscoveryStepImpl(e);
+ } catch (LsQueryException e) {
+ logger.warn("Exception while unMarshalling", e);
+ return new DiscoveryStepImpl(e);
}
+ logger.debug("First step succeded without error. Result:
["+services+"]");
return new DiscoveryStepImpl(new
HashSet<AuthorativeLookupservice>(services));
}

@@ -91,25 +97,13 @@
DiscoveryQuery query = new
DiscoveryQuery(elements,eventTypes,type);

for(LookupService service : rootServices) {
- System.out.println("Gls used: " + service);
+ logger.debug("Using Gls: " + service);
try {
return
level0.getRawDiscoveryResponse(service,query.toString());
} catch (LsQueryException e) {
- demoteTopService(service,e);
+ rootServices.demote(service,e);
}
}
throw new RuntimeException("None of the root lookupservices
could be consulted");
}
-
- /**
- * Demotes the service to the end of the queue and promotes the rest.
- * @param service
- * @param e
- */
- private void demoteTopService(LookupService service, LsQueryException
e) {
- e.printStackTrace();
- rootServices.remove(service);
- rootServices.offer(service);
- }
-
}

Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryQuery.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryQuery.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryQuery.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -5,9 +5,12 @@
import org.perfsonar.lsclient.data.EventType;
import org.perfsonar.lsclient.data.ServiceType;
import org.perfsonar.lsclient.data.TopologyElement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

public class DiscoveryQuery {

+ protected final Logger logger = LoggerFactory.getLogger(getClass());

private final String summeryDesciption;

public DiscoveryQuery(Set<TopologyElement> elements, Set<EventType>
eventTypes, Set<ServiceType> type) {
@@ -18,11 +21,9 @@
}

private void addTopologyElement(StringBuilder builder,
Set<TopologyElement> elements) {
-// for(TopologyElement element : elements ) {
-// URI uri = element.getURI();
-// uri.
-// }
-
+ for(TopologyElement element : elements ) {
+
builder.append(TopologyElements.toSummerisedXml(element));
+ }
}

private void addEventTypes(StringBuilder builder, Set<EventType>
eventTypes) {

Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryStepImpl.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryStepImpl.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/DiscoveryStepImpl.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -27,6 +27,7 @@
}

public Set<AuthorativeLookupservice> getServices() {
+ if(hasFailed()) return null;
return Collections.unmodifiableSet(services);
}


Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/Level1Impl.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/Level1Impl.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/Level1Impl.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -5,11 +5,15 @@
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URLConnection;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Set;
import java.util.SortedMap;
+import java.util.Timer;
+import java.util.TimerTask;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentLinkedQueue;

@@ -32,13 +36,96 @@
import org.perfsonar.ri.lsclient.level1.jaxb.Datum;
import org.perfsonar.ri.lsclient.level1.jaxb.JaxbTools;
import org.perfsonar.ri.lsclient.level1.jaxb.ServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

public class Level1Impl extends AbstractLevel1 implements
Level1LsClientInterface {
-
- private final JAXBContext context;
- // We depend on the contract of ConcurrentLinkedQueue, that an
iterator uses a copy of the queue. (And there is no ConcurrentQueue Interface
- private final ConcurrentLinkedQueue<LookupService> rootGlses = new
ConcurrentLinkedQueue<LookupService>();
+
+ protected class RootGlses implements Iterable<LookupService> {
+ private final ConcurrentLinkedQueue<LookupService> data = new
ConcurrentLinkedQueue<LookupService>();
+
+ public boolean isEmpty() {
+ return data.isEmpty();
+ }
+
+ public void replace(Collection<LookupService> values) {
+ synchronized (this) {
+ //TODO speed up by using parallel requests. +
add cutoff points.
+ SortedMap<Long, LookupService> timedServices
= new TreeMap<Long, LookupService>();
+ for(LookupService service : values) {
+ try {
+ URLConnection connection =
service.getEndPoint().toURL().openConnection();
+
connection.setConnectTimeout(2000); // We should be able to be strict here
+
connection.setUseCaches(false);
+ long startTime =
System.nanoTime();
+ connection.connect();
+
timedServices.put(Long.valueOf(System.nanoTime() - startTime), service);
+ } catch (MalformedURLException e) {
+ logger.error("Supplied
service endpoint('"+service.getEndPoint()+"') is not a valid URL, this client
only understands http(s)",e);
+ } catch (IOException e) {
+ logger.warn("Error occoured
while trying to time gls('"+service.getEndPoint()+"')",e);
+ logger.info("Dropping
supplied entry: " + service.getEndPoint());
+ }
+ }
+ if(timedServices.isEmpty()) {
+ logger.error("None of the supplied
root services where accepted. falling back to old values");
+ return;
+ }
+ data.clear();
+ data.addAll(timedServices.values());
+ }
+ }
+
+ public Iterator<LookupService> iterator() {
+ return data.iterator();
+ }
+
+ /**
+ * Demotes the service to the end of the queue and promotes
the rest.
+ * @param service
+ * @param e
+ */
+ public void demote(LookupService service, LsQueryException e)
{
+ synchronized (this) {
+ logger.warn("Demoting serivce", e);
+ if(!data.contains(service)) return;
+ if(data.peek() == service) {
+ data.add(data.poll());
+ }
+ //ignore
+ }
+ }
+
+ public void ensureFilled() {
+ if(rootGlses.isEmpty()) {
+ synchronized (this) {
+ if(rootGlses.isEmpty()) {
+ fill();
+ }
+ }
+ }
+ }
+
+ protected void fill() {
+ timer = new Timer("Ls-GlsList-refresher");
+ replace(getDefaultLookupServices());
+ timer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ synchronized (this) {
+ if(timer==null) return;
+
replace(getDefaultLookupServices());
+ }
+ }
+ }, 600000, 600000);
+ }
+ }

+ protected final Logger logger = LoggerFactory.getLogger(getClass());

+ protected final RootGlses rootGlses = new RootGlses();
+ protected final JAXBContext context;
+ protected Timer timer;
+
public Level1Impl(Level0LsClientInterface level0) {
super(level0);
JAXBContext newContext = null;
@@ -47,7 +134,7 @@

"org.perfsonar.ri.lsclient.level1.jaxb"
);
} catch (JAXBException e) {
- e.printStackTrace(); //TODO fail nicer
+ logger.error("Can't load JAXB context",e);
}
this.context = newContext;
}
@@ -58,11 +145,7 @@
* @see
org.perfsonar.lsclient.Level1LsClientInterface#startDiscovery(java.util.Set,
java.util.Set, java.util.Set)
*/
public DiscoveryProcess startDiscovery(Set<TopologyElement> elements,
Set<EventType> eventTypes, Set<ServiceType> types) {
- if(rootGlses.isEmpty()) {
- synchronized (rootGlses) {
- if(rootGlses.isEmpty())
setKnownLookupServices(getDefaultLookupServices());
- }
- }
+ rootGlses.ensureFilled();
return new DiscoveryProcessImpl(level0, context, rootGlses,
elements, eventTypes, types);
}

@@ -70,6 +153,15 @@
* @see
org.perfsonar.lsclient.Level1LsClientInterface#getLSQueryContent(org.perfsonar.lsclient.data.HomeLookupService,
java.util.Set, java.util.Set, java.util.Set)
*/
public Set<ServiceMeasurementMetadata>
getLSQueryContent(AuthorativeLookupservice hls, Set<TopologyElement>
elements, Set<EventType> eventTypes, Set<ServiceType> type) {
+ if(logger.isDebugEnabled()) {
+ logger.debug(
+ "quering LS for service content from
"+ hls.getEndPoint() +
+ " where"+
+ " topologyElements is any "+ elements
== null ? "" : Arrays.toString(elements.toArray())+
+ " eventypes is any "+ eventTypes ==
null ? "" : Arrays.toString(eventTypes.toArray())+
+ " serviceType is any "+ type == null
? "" : Arrays.toString(type.toArray())
+ );
+ }
LsQuery query = new LsQuery(elements,eventTypes,type) {
@Override
public String toString() {
@@ -80,7 +172,7 @@
Collection<ServiceImpl> services;
try {
InputStream stream =
level0.getRawQueryResult(hls,query.toString());
- services = JaxbTools.unMarshall(context, stream,
ServiceImpl.class);
+ services =
JaxbTools.unMarshallPerfsonarMessage(context, stream, ServiceImpl.class);
for(ServiceImpl service : services)
service.setAuthorativeLookupservice(hls);
return null;
} catch (JAXBException e) {
@@ -89,12 +181,23 @@
return null; //TODO
} catch (LsQueryException e) {
return null; //TODO
- }
+ }
}
/* (non-Javadoc)
* @see
org.perfsonar.lsclient.Level1LsClientInterface#getLSQueryLocation(org.perfsonar.lsclient.data.HomeLookupService,
java.util.Set, java.util.Set, java.util.Set)
*/
public Set<Service> getLSQueryLocation(AuthorativeLookupservice hls,
Set<TopologyElement> elements, Set<EventType> eventTypes, Set<ServiceType>
type) {
+ if(logger.isDebugEnabled()) {
+ logger.debug(
+ "quering LS for service locations
from "+ hls.getEndPoint() +
+ " where"+
+ " topologyElements is any "+
(elements == null ? "" : Arrays.toString(elements.toArray()))+
+ " eventypes is any "+ (eventTypes ==
null ? "" : Arrays.toString(eventTypes.toArray()))+
+ " serviceType is any "+ (type == null
? "" : Arrays.toString(type.toArray()))
+ );
+ }
+// DiscoveryQuery query = new
DiscoveryQuery(elements,eventTypes,type);
+
LsQuery query = new LsQuery(elements,eventTypes,type) {
@Override
public String toString() {
@@ -113,20 +216,21 @@

try {
InputStream stream =
level0.getRawQueryResult(hls,query.toString());
- Collection<Datum> data =
JaxbTools.unMarshall(context, stream, Datum.class);
+// return new
HashSet<Service>(JaxbTools.unMarshallPerfsonarMessage(context, stream,
ServiceImpl.class));
+
+ Collection<Datum> data =
JaxbTools.unMarshallPerfsonarMessage(context, stream, Datum.class);
for(Datum datum : data) {
Set<Service> services = new
HashSet<Service>(JaxbTools.unMarshall(context, new
StringReader("<result>"+datum.getValue()+"</result>"), ServiceImpl.class));
- System.out.println(services);
return services;
}
} catch (JAXBException e) {
- System.out.println(e.getLocalizedMessage());
+ logger.error("JAXB exception occoured while quering
for location", e);
return Collections.emptySet(); //TODO
} catch (XMLStreamException e) {
- System.out.println(e.getLocalizedMessage());
+ logger.error("XMLStream exception occoured while
quering for location", e);
return Collections.emptySet(); //TODO
} catch (LsQueryException e) {
- System.out.println(e.getLocalizedMessage());
+ logger.error("LsQuery exception occoured while
quering for location", e);
return Collections.emptySet(); //TODO
}
return Collections.emptySet();
@@ -135,33 +239,15 @@
public void setKnownLookupServices(Set<LookupService> rootServices) {
if(rootServices==null) throw new
IllegalArgumentException("new rootServices set cannot be null");
if(rootServices.isEmpty()) throw new
IllegalArgumentException("new rootServices set cannot be empty");
-
synchronized (rootGlses) {
- //TODO speed up by using parallel requests. + add
cutoff points.
- SortedMap<Long, LookupService> timedServices = new
TreeMap<Long, LookupService>();
- for(LookupService service : rootServices) {
- try {
- URLConnection connection =
service.getEndPoint().toURL().openConnection();
- connection.setUseCaches(false);
- long startTime = System.nanoTime();
- connection.connect();
-
timedServices.put(Long.valueOf(System.nanoTime() - startTime), service);
- } catch (MalformedURLException e) {
- // TODO log dropping of url
- e.printStackTrace();
- } catch (IOException e) {
- // TODO log
- e.printStackTrace();
- }
- }
- rootGlses.clear();
- rootGlses.addAll(timedServices.values());
+ timer.cancel();
+ timer = null;
}
+ rootGlses.replace(rootServices);
}
-
public Set<LookupService> getDefaultLookupServices() {
+ logger.debug("Getting default lookupservices from
root.hints");
RootHintsFileDownloader downloader = new
RootHintsFileDownloader();
return downloader.getGlobalLookupServices();
}
-
}
\ No newline at end of file

Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/RootHintsFileDownloader.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/RootHintsFileDownloader.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/RootHintsFileDownloader.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -8,61 +8,71 @@
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import org.perfsonar.lsclient.data.LookupService;
import org.perfsonar.ri.lsclient.level1.jaxb.ServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

public class RootHintsFileDownloader {
-
+ protected final Logger logger = LoggerFactory.getLogger(getClass());

+
public Set<LookupService> getGlobalLookupServices() {
+ logger.trace("Starting retrieval of GLS-es from root.hints");
try {
return readFrom(getRootHintUrl().openConnection());
} catch (IOException e) {
- //TODO log
- e.printStackTrace();
- return null;
+ logger.error("Can't retrieve gls-es from root.hints",
e);
+ return Collections.emptySet();
}
}

protected Set<LookupService> readFrom(URLConnection hintFile) throws
UnsupportedEncodingException, IOException {
BufferedReader reader = null;
String encoding = getEncodingOf(hintFile);
+ logger.trace("Encoding of root.hints determined as beeing
"+encoding);
try {
reader = new BufferedReader(new
InputStreamReader(hintFile.getInputStream(), encoding));
return parse(reader);
} finally {
if (reader != null) {
try { reader.close(); } catch (IOException e)
{
- //TODO log
- e.printStackTrace();
+ logger.warn("Exception occoured while
closing reader", e);
}
}
}

}

- private Set<LookupService> parse(BufferedReader reader) throws
IOException {
+ protected Set<LookupService> parse(BufferedReader reader) throws
IOException {
Set<LookupService> lses = new HashSet<LookupService>();

for (String line; (line = reader.readLine()) != null;) {
+ logger.trace("Read line of root.hints: '"+line+"'");
try {
URL glsUrl = new URL(line);
lses.add(new ServiceImpl(glsUrl.toURI()));
} catch (MalformedURLException e) {
- // TODO log dropping of url.
- e.printStackTrace();
+ logger.warn("Dropping malformed
url("+line+")", e);
} catch (URISyntaxException e) {
+ logger.error("Unasserted exception occoured !
this is a bug ! (URL should always be a valid URI, since one is a subset of
the other)", e);
throw new AssertionError("Help: A valid URL
should always be a valid URI.");
}
}
+ if(logger.isDebugEnabled()) {
+ logger.debug("Parsing yielded the following results:
" + Arrays.toString(lses.toArray()));
+ }
return lses;
}

protected URL getRootHintUrl() {
try {
- return new URL("http", "www.perfsonar.net", 80,
"/gls.root.hints");
+ return new URL("http", "www.perfsonar.net", 80,
"/gls.root.hint");
} catch (MalformedURLException e) {
+ logger.error("Programmer specified an malformed URL !
this is a bug !", e);
throw new AssertionError("Programmer specified an
malformed URL, this is a bug.");
}
}

Modified:
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/jaxb/JaxbTools.java
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/jaxb/JaxbTools.java
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/main/java/org/perfsonar/ri/lsclient/level1/jaxb/JaxbTools.java
2008-11-28 18:28:03 UTC (rev 4722)
@@ -4,17 +4,22 @@
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Stack;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.namespace.QName;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

+import org.perfsonar.lsclient.LsQueryException;
+
public class JaxbTools {

public static class ClassBasedfilter implements EventFilter {
@@ -46,28 +51,112 @@
}
}

+ public static <Type> Collection<Type>
unMarshallPerfsonarMessage(JAXBContext context, Reader reader, Class<Type>
clazz) throws XMLStreamException, JAXBException, LsQueryException {
+ XMLInputFactory inputFactory = XMLInputFactory.newInstance();
+ XMLEventReader eventReader =
inputFactory.createXMLEventReader(reader);
+ readMetadatas(eventReader);
+ XMLEventReader filteredReader =
inputFactory.createFilteredReader(eventReader, new ClassBasedfilter(clazz));
+ return unmarshall(context.createUnmarshaller(), filteredReader,
clazz);
+ }
+
+ public static <Type> Collection<Type>
unMarshallPerfsonarMessage(JAXBContext context, InputStream inputStream,
Class<Type> clazz) throws XMLStreamException, JAXBException, LsQueryException
{
+ XMLInputFactory inputFactory = XMLInputFactory.newInstance();
+ XMLEventReader eventReader =
inputFactory.createXMLEventReader(inputStream);
+ readMetadatas(eventReader);
+ XMLEventReader filteredReader =
inputFactory.createFilteredReader(eventReader, new ClassBasedfilter(clazz));
+ return unmarshall(context.createUnmarshaller(),
filteredReader, clazz);
+ }
+
public static <Type> Collection<Type> unMarshall(JAXBContext context,
Reader reader, Class<Type> clazz) throws XMLStreamException, JAXBException {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLEventReader eventReader =
inputFactory.createXMLEventReader(reader);
XMLEventReader filteredReader =
inputFactory.createFilteredReader(eventReader, new ClassBasedfilter(clazz));
- return unmarshall(context.createUnmarshaller(), filteredReader);
+ return unmarshall(context.createUnmarshaller(), filteredReader,
clazz);
}

public static <Type> Collection<Type> unMarshall(JAXBContext context,
InputStream inputStream, Class<Type> clazz) throws XMLStreamException,
JAXBException {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
- XMLEventReader eventReader =
inputFactory.createXMLEventReader(inputStream);
+ XMLEventReader eventReader =
inputFactory.createXMLEventReader(inputStream);
XMLEventReader filteredReader =
inputFactory.createFilteredReader(eventReader, new ClassBasedfilter(clazz));
- return unmarshall(context.createUnmarshaller(),
filteredReader);
+ return unmarshall(context.createUnmarshaller(),
filteredReader, clazz);
}
+
+ private static void readMetadatas(XMLEventReader reader) throws
XMLStreamException, LsQueryException {
+ Stack<QName> stack = new Stack<QName>();
+ while(reader.peek() != null) {
+ XMLEvent event = reader.peek();
+
+ if(event.isStartElement()) {
+ StartElement element = event.asStartElement();
+ if(
+
element.getName().getLocalPart().equalsIgnoreCase("data") &&
+
element.getName().getNamespaceURI().equalsIgnoreCase("http://ggf.org/ns/nmwg/base/2.0/";)
+ ) break;
+ if(!stack.isEmpty() &&
stack.peek().getLocalPart().equalsIgnoreCase("metadata")) {
+
if(element.getName().getLocalPart().equalsIgnoreCase("eventtype")) {
+
checkEventType(reader,element);
+ } else {
+ ignoreTag(reader,element);
+ continue;
+ }
+ }
+ stack.push(element.getName());

+ }
+ if(event.isEndElement()) {
+ stack.pop();
+ }
+
+ if(reader.hasNext()) {
+ reader.nextEvent();
+ } else {
+ break;
+ }
+ }
+ }

- @SuppressWarnings("unchecked")
- private static <Type> Collection<Type> unmarshall(Unmarshaller
unmarshaller, XMLEventReader filteredReader) throws XMLStreamException,
JAXBException {
- unmarshaller.setEventHandler(new
javax.xml.bind.helpers.DefaultValidationEventHandler());
+ private static void checkEventType(XMLEventReader reader,
StartElement element) throws XMLStreamException, LsQueryException {
+ QName name = element.getName();
+
+ while(reader.hasNext()) {
+ XMLEvent event = reader.nextEvent();
+
+ if(event.isCharacters()) {
+
checkEventType(event.asCharacters().getData());
+ }
+
+ if(event.isEndElement() &&
event.asEndElement().getName().equals(name)) {
+ return;
+ }
+ }
+ }
+
+ private static void ignoreTag(XMLEventReader reader, StartElement
element) throws XMLStreamException {
+ QName name = element.getName();
+
+ while(reader.hasNext()) {
+ XMLEvent event = reader.nextEvent();
+ if(event.isEndElement() &&
event.asEndElement().getName().equals(name)) {
+ return;
+ }
+ }
+ }
+
+ private static <Type> Collection<Type> unmarshall(Unmarshaller
unmarshaller, XMLEventReader filteredReader, Class<Type> clazz) throws
XMLStreamException, JAXBException {
Collection<Type> collection = new ArrayList<Type>();
while (filteredReader.peek() != null) {
- collection.add((Type)
unmarshaller.unmarshal(filteredReader));
+
collection.add(unmarshaller.unmarshal(filteredReader,clazz).getValue());
}
return collection;
}

+ private static void checkEventType(String value) throws
LsQueryException {
+ if(
+ value == null ||
+
!value.trim().equalsIgnoreCase("error.ls.query.empty_results") &&
+ !value.trim().equalsIgnoreCase("success.ls.query") &&
+
!value.trim().equalsIgnoreCase("http://ogf.org/ns/nmwg/tools/org/perfsonar/service/lookup/discovery/summary/2.0";)

+ ) {
+ throw new LsQueryException("no success ("+value+")");

+ }
+ }
}

Modified:
trunk/ps-mdm-lsclient-impl/src/resources/org/perfsonar/ri/lsclient/level1/jaxb/jaxb.index
===================================================================
---
trunk/ps-mdm-lsclient-impl/src/resources/org/perfsonar/ri/lsclient/level1/jaxb/jaxb.index
2008-11-28 18:26:13 UTC (rev 4721)
+++
trunk/ps-mdm-lsclient-impl/src/resources/org/perfsonar/ri/lsclient/level1/jaxb/jaxb.index
2008-11-28 18:28:03 UTC (rev 4722)
@@ -1,2 +1,2 @@
-ServiceImpl
-Datum
\ No newline at end of file
+Datum
+ServiceImpl
\ No newline at end of file

Added:
trunk/ps-mdm-lsclient-impl/src/test/java/org/perfsonar/ri/lsclient/level0/test/SoapEndpointTest.java


Property changes on:
trunk/ps-mdm-lsclient-impl/src/test/java/org/perfsonar/ri/lsclient/level0/test/SoapEndpointTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain

Added:
trunk/ps-mdm-lsclient-impl/src/test/java/org/perfsonar/ri/lsclient/level1/test/TestJaxbTools.java


Property changes on:
trunk/ps-mdm-lsclient-impl/src/test/java/org/perfsonar/ri/lsclient/level1/test/TestJaxbTools.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain



  • perfsonar: r4722 - in trunk/ps-mdm-lsclient-impl: . src/main/java/org/perfsonar/ri/lsclient src/main/java/org/perfsonar/ri/lsclient/level0 src/main/java/org/perfsonar/ri/lsclient/level1 src/main/java/org/perfsonar/ri/lsclient/level1/jaxb src/resources/org/perfsonar/ri/lsclient/level1/jaxb src/test/java/org/perfsonar/ri/lsclient/level0/test src/test/java/org/perfsonar/ri/lsclient/level1/test, svnlog, 11/28/2008

Archive powered by MHonArc 2.6.16.

Top of Page