Accessing PTV xServer internet via WSDL generated classes

While xServer internet uses HTTP basic authentication with <user>/<password>, it is highly recommended to work with the token assigned to your subscription using the combination “xtok”/<token>. Using the token is a safer way than using your far more sensible account data.

Prerequisites

For this sample you will need the following:

  • A JDK 6 (or newer) installation
  • A Maven2 or Maven3 installation

Create a Maven project

First of all, create a new directory and set up a Maven project file named "pom.xml" with this content:

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.ptvag.xserver.xroute</groupId>
	<artifactId>xRouteJAXWSClient</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>xRouteJAXWSClient</name>
	<url>http://maven.apache.org</url>
<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
		<scope>test</scope>
	</dependency>
</dependencies>
<build>
	<plugins>
		<plugin>
			<artifactId>maven-antrun-plugin</artifactId>
			<executions>
				<execution>
					<id>wsimport</id>
					<phase>generate-sources</phase>
					<configuration>
						<tasks>
							<mkdir dir="${basedir}/target/classes" />
							<mkdir dir="${basedir}/target/generated-sources" />
							<exec executable="wsimport" failonerror="true" dir="${basedir}">
								<arg value="-quiet" />
								<arg value="-d" />
								<arg value="${basedir}/target/classes" />
								<arg value="-s" />
								<arg value="${basedir}/target/generated-sources" />
								<arg value="https://xroute-eu-n-test.cloud.ptvgroup.com/xroute/ws/XRoute?WSDL" />
							</exec>
						</tasks>
					</configuration>
					<goals>
						<goal>run</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
		<plugin>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.6</source>
				<target>1.6</target>
			</configuration>
		</plugin>
	</plugins>
</build>
</project>

Run Maven in the new directory with:

mvn clean install

Maven will now generate client classes for xRoute based on its WSDL. You can find the client classes in the directory "/target/generated-sources".

Set up a simple test case

The "pom.xml" has one dependency on JUnit which we can use to build a simple test.

Create a new Java source file in "src/test/java" named "JAXWSTest.java". Make sure you set up the folder structure like this because Maven will look for test classes in this directory.

The test class creates a simple request and calculates a route.

import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import junit.framework.TestCase;

import org.junit.Test;

import com.ptvag.jabba.service.baseservices.ArrayOfCallerContextProperty;
import com.ptvag.jabba.service.baseservices.CallerContext;
import com.ptvag.jabba.service.baseservices.CallerContextProperty;
import com.ptvag.xserver.common.ArrayOfPoint;
import com.ptvag.xserver.common.PlainPoint;
import com.ptvag.xserver.common.Point;
import com.ptvag.xserver.xroute.ArrayOfWaypointDesc;
import com.ptvag.xserver.xroute.LinkType;
import com.ptvag.xserver.xroute.ResultListOptions;
import com.ptvag.xserver.xroute.Route;
import com.ptvag.xserver.xroute.WaypointDesc;
import com.ptvag.xserver.xroute.jwsdp.XRouteWS;
 
public class JAXWSTest extends TestCase {
 
	private static final String XROUTE_WSDL_LOCATION = "https://xroute-eu-n-test.cloud.ptvgroup.com/xroute/ws/XRoute?WSDL";
 
	public JAXWSTest(String name) {super(name);}
 
	@Test
	public void testSimpleCall() throws Exception {
		WaypointDesc[] waypoints = new WaypointDesc[2];
		waypoints[0] = new WaypointDesc();
		waypoints[0].setLinkType(LinkType.NEXT_SEGMENT);
		PlainPoint pp = new PlainPoint();
		pp.setX(685903);
		pp.setY(6372958);
		Point point = new Point();
		point = new Point();
		QName _plainPoint_QNAME = new QName("http://common.xserver.ptvag.com","point");
		point.setPoint(new JAXBElement(_plainPoint_QNAME, PlainPoint.class, pp));
		ArrayOfPoint arrayOfPoint = new ArrayOfPoint();
		arrayOfPoint.getPoint().add(point);
		waypoints[0].setWrappedCoords(arrayOfPoint);
		waypoints[1] = new WaypointDesc();
		waypoints[1].setLinkType(LinkType.NEXT_SEGMENT);
		PlainPoint pp1 = new PlainPoint();
		pp1.setX(681013);
		pp1.setY(6371680);
		Point point1 = new Point();
		point1 = new Point();
		point1.setPoint(new JAXBElement(_plainPoint_QNAME, PlainPoint.class, pp1));
		ArrayOfPoint arrayOfPoint1 = new ArrayOfPoint();
		arrayOfPoint1.getPoint().add(point1);
		waypoints[1].setWrappedCoords(arrayOfPoint1);
		ResultListOptions details = new ResultListOptions();
		details.setBinaryPathDesc(false);
		details.setPolygon(true);
		CallerContext cc = new CallerContext();
		CallerContextProperty prop = new CallerContextProperty();
		prop.setKey("CoordFormat");
		prop.setValue("PTV_MERCATOR");
		CallerContextProperty prop1 = new CallerContextProperty();
		prop1.setKey("Profile");
		prop1.setValue("carfast");
		ArrayOfCallerContextProperty arrayOfCallerContextProperty = new ArrayOfCallerContextProperty();
		arrayOfCallerContextProperty.getCallerContextProperty().add(prop);
		arrayOfCallerContextProperty.getCallerContextProperty().add(prop1);
		cc.setWrappedProperties(arrayOfCallerContextProperty);
		ArrayOfWaypointDesc arrayOfWayPoints = new ArrayOfWaypointDesc();
		arrayOfWayPoints.getWaypointDesc().add(waypoints[0]);
		arrayOfWayPoints.getWaypointDesc().add(waypoints[1]);


		//Set your credentials using the Authenticator
		Authenticator.setDefault(new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(
					"xtok",
					"<INSERT-YOUR-TOKEN-HERE>".toCharArray()
				);
			}
		});

		URL url = new URL(XROUTE_WSDL_LOCATION);
		QName qname = new QName("http://jwsdp.xroute.xserver.ptvag.com", "XRouteWSService");
		QName xRouteWSPort = new QName("http://jwsdp.xroute.xserver.ptvag.com", "XRouteWSPort");
	
		Service service = Service.create(url, qname);
		XRouteWS xroute = service.getPort(xRouteWSPort, XRouteWS.class);

		Route route = xroute.calculateRoute(arrayOfWayPoints, null, null, details, cc);
		int distance = route.getInfo().getValue().getDistance();
		assertEquals(4129, distance);
	} 
}

To run the test, run "maven test" in the project directory using the command prompt:

mvn test