/*******************************************************************************
* Copyright (c) 2007, 2010 The Planets Project Partners.
*
* All rights reserved. This program and the accompanying
* materials are made available under the terms of the
* Apache License, Version 2.0 which accompanies
* this distribution, and is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
/**
*
*/
package eu.planets_project.tb.impl.services.util;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import eu.planets_project.services.PlanetsService;
import eu.planets_project.services.characterise.Characterise;
import eu.planets_project.services.datatypes.ServiceDescription;
import eu.planets_project.services.identify.Identify;
import eu.planets_project.services.migrate.Migrate;
import eu.planets_project.services.validate.Validate;
import eu.planets_project.services.view.CreateView;
/**
* This class provides some utilities for those who wish to consume Planets Service.
*
* @author <a href="mailto:Andrew.Jackson@bl.uk">Andy Jackson</a>
*
*/
public class DiscoveryUtils {
/** */
private static final Log log = LogFactory.getLog(DiscoveryUtils.class);
/**
* Attempts to determine the service description for the given WSDL.
*
* @param wsdlLocation
* @return
*/
public static ServiceDescription getServiceDescription( URL wsdlLocation ) {
try {
PlanetsServiceExplorer se = new PlanetsServiceExplorer(wsdlLocation);
PlanetsService s = (PlanetsService) createServiceObject(se.getServiceClass(), wsdlLocation);
if( s == null ) return null;
ServiceDescription sd = s.describe();
return sd;
} catch( Exception e ) {
log.error("Runtime exception while inspecting WSDL: "+wsdlLocation+" : "+e);
return null;
}
}
/**
* A generic method that can be used as a short-cut for instanciating Planets services.
*
* e.g. Migrate m = DiscoveryUtils.createServiceClass( Migrate.class, wsdlLocation);
*
* If the given WSDL points to one of the older 'Basic' service forms, it will be wrapped up
* to present the new API and hide the old one.
*
* @param <T> Any recognised service class (extends PlanetsService).
* @param serviceClass The class of the Planets service to instanciate, e.g. Identify.class
* @param wsdlLocation The location of the WSDL.
* @return A new instance of the the given class, wrapping the referenced service.
*/
public static <T> T createServiceObject( Class<T> serviceClass, URL wsdlLocation ) {
PlanetsServiceExplorer se = new PlanetsServiceExplorer(wsdlLocation);
Service service;
if( serviceClass == null || wsdlLocation == null ) return null;
service = Service.create(wsdlLocation, se.getQName());
return (T) service.getPort(serviceClass);
}
/**
* Determine the high-level service class for this service type.
* e.g. the Basic forms are wrapped up in higher level forms.
* @return
*/
public static Class<? extends PlanetsService> getServiceWrapperClass( QName qName ) {
// Unqualified services cannot be dealt with:
if (qName == null)
return null;
// Determine class of service:
if (qName.equals(Migrate.QNAME)) {
return Migrate.class;
} else if (qName.equals(Identify.QNAME)) {
return Identify.class;
} else if (qName.equals(Validate.QNAME)) {
return Validate.class;
} else if (qName.equals(Characterise.QNAME) ) {
return Characterise.class;
} else if (qName.equals(CreateView.QNAME) ) {
return CreateView.class;
}
// Otherwise, this is and unrecognised service:
return null;
}
/**
*
* @param args
* @throws MalformedURLException
*/
public static void main(String [] args) throws MalformedURLException {
// If called from the command line, parse the argument as a WSDL URL.
if( args.length == 1 ) {
URL wsdl = new URL(args[0]);
ServiceDescription sd = DiscoveryUtils.getServiceDescription(wsdl);
System.out.print(sd.toXmlFormatted());
return;
}
// Otherwise, do a simple test:
URL wsdls[] = new URL[] {
new URL("http://127.0.0.1:8080/pserv-if-simple/AlwaysSaysValidService?wsdl"),
new URL("http://127.0.0.1:8080/pserv-if-simple/PassThruMigrationService?wsdl"),
new URL("http://127.0.0.1:8080/pserv-pa-sanselan/SanselanMigrate?wsdl")
};
for( URL wsdl : wsdls ) {
ServiceDescription sd = DiscoveryUtils.getServiceDescription(wsdl);
System.out.println(" Description: "+sd.toXmlFormatted());
}
}
}