diff --git a/product/modules/agents/windows/jax-rs/build.xml b/product/modules/agents/windows/jax-rs/build.xml
new file mode 100644
index 000000000..fe8e11092
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/build.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/product/modules/agents/windows/jax-rs/pom.xml b/product/modules/agents/windows/jax-rs/pom.xml
new file mode 100644
index 000000000..1b3963e4b
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/pom.xml
@@ -0,0 +1,195 @@
+
+
+
+
+
+ org.wso2.cdmserver
+ wso2cdmserver-product
+ 2.0.0-SNAPSHOT
+ ../../../../pom.xml
+
+
+ 4.0.0
+ org.wso2.carbon
+ cdm-windows-api
+ 1.0.0-SNAPSHOT
+ JAX-RS Windows API
+ JAX-RS Windows API
+ war
+
+
+
+
+ maven-compiler-plugin
+
+
+ 1.5
+
+ 2.3.2
+
+
+ maven-war-plugin
+ 2.2
+
+ WEB-INF/lib/*cxf*.jar
+ ${project.artifactId}
+
+
+
+
+
+
+
+ deploy
+
+ compile
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 1.7
+
+
+ compile
+
+ run
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ client
+
+ test
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.2.1
+
+
+ test
+
+ java
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.cxf
+ cxf-rt-frontend-jaxws
+ ${cxf.version}
+
+
+ org.apache.cxf
+ cxf-rt-frontend-jaxrs
+ ${cxf.version}
+
+
+ org.apache.cxf
+ cxf-rt-transports-http
+ ${cxf.version}
+
+
+ junit
+ junit
+ test
+ ${junit.version}
+
+
+ commons-httpclient
+ commons-httpclient
+ 3.1
+ provided
+
+
+ javax.ws.rs
+ jsr311-api
+ 1.1.1
+ provided
+
+
+ com.google.code.gson
+ gson
+ 2.2.4
+
+
+ org.wso2.carbon
+ org.wso2.carbon.utils
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.device.mgt.common
+ 2.0.0-SNAPSHOT
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.device.mgt.core
+ 2.0.0-SNAPSHOT
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.logging
+ provided
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
+ org.bouncycastle
+ bcpkix-jdk15on
+ 1.49
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ 1.49
+
+
+
+ 2.6.1
+ 4.8.2
+
+
+
diff --git a/product/modules/agents/windows/jax-rs/run-client.bat b/product/modules/agents/windows/jax-rs/run-client.bat
new file mode 100644
index 000000000..9bd370256
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/run-client.bat
@@ -0,0 +1,81 @@
+@echo off
+REM ---------------------------------------------------------------------------
+REM Copyright 2005,2006 WSO2, Inc. http://www.wso2.org
+REM
+REM Licensed under the Apache License, Version 2.0 (the "License");
+REM you may not use this file except in compliance with the License.
+REM You may obtain a copy of the License at
+REM
+REM http://www.apache.org/licenses/LICENSE-2.0
+REM
+REM Unless required by applicable law or agreed to in writing, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Client script for the Jaxws-Jaxrs/jaxrs_basic Sample
+rem
+rem Environment Variable Prequisites
+rem
+rem WSO2AppServer_HOME Must point at your WSO2 AppServer directory
+rem
+rem JAVA_HOME Must point at your Java Development Kit installation.
+rem
+rem JAVA_OPTS (Optional) Java runtime options
+rem ---------------------------------------------------------------------------
+set CURRENT_DIR=%cd%
+
+rem Make sure prerequisite environment variables are set
+if not "%JAVA_HOME%" == "" goto gotJavaHome
+echo The JAVA_HOME environment variable is not defined
+echo This environment variable is needed to run this program
+goto end
+:gotJavaHome
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+goto okJavaHome
+:noJavaHome
+echo The JAVA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+echo NB: JAVA_HOME should point to a JDK/JRE
+goto end
+:okJavaHome
+
+rem check the WSO2AppServer_HOME environment variable
+if not "%WSO2AppServer_HOME%" == "" goto gotHome
+set WSO2AppServer_HOME=%CURRENT_DIR%
+if exist "%WSO2AppServer_HOME\bin\version.txt" goto okHome
+
+rem guess the home. Jump two directories up to check if that is the home
+cd ..\..\..
+set WSO2AppServer_HOME=%cd%
+cd %CURRENT_DIR%
+
+:gotHome
+if exist "%WSO2AppServer_HOME%\bin\version.txt" goto okHome
+
+set WSO2AppServer_HOME=%~dp0..\..
+if exist "%WSO2AppServer_HOME%\bin\version.txt" goto okHome
+
+echo The WSO2AppServer_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+
+:okHome
+rem set the classes
+setlocal EnableDelayedExpansion
+rem loop through the libs and add them to the class path
+cd %WSO2AppServer_HOME%\samples\Jaxws-Jaxrs\jaxrs_basic
+set CLIENT_CLASSPATH=.\conf;.\build\classes
+FOR %%C in (.\build\lib\*.jar) DO set CLIENT_CLASSPATH=!CLIENT_CLASSPATH!;.\build\lib\%%~nC%%~xC
+
+rem ----- Execute The Requested Command ---------------------------------------
+echo Using WSO2AppServer_HOME: %WSO2AppServer_HOME%
+echo Using JAVA_HOME: %JAVA_HOME%
+set _RUNJAVA="%JAVA_HOME%\bin\java"
+
+%_RUNJAVA% %JAVA_OPTS% -Dwso2appserver.home="%WSO2AppServer_HOME%" -cp "%CLIENT_CLASSPATH%" -Djava.endorsed.dirs="%WSO2AppServer_HOME%\lib\endorsed";"%JAVA_HOME%\jre\lib\endorsed";"%JAVA_HOME%\lib\endorsed" demo.jaxrs.client.Client http://localhost:9763/jaxrs_basic/services/customers/customerservice %*
+cd %CURRENT_DIR%
+endlocal
+:end
diff --git a/product/modules/agents/windows/jax-rs/run-client.sh b/product/modules/agents/windows/jax-rs/run-client.sh
new file mode 100755
index 000000000..279d5023c
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/run-client.sh
@@ -0,0 +1,90 @@
+#!/bin/sh
+# -----------------------------------------------------------------------------
+#
+# Environment Variable Prequisites
+#
+# CARBON_HOME Home of WSO2 AppServer installation. If not set I will try
+# to figure it out.
+#
+# JAVA_HOME Must point at your Java Development Kit installation.
+#
+# NOTE: Borrowed generously from Apache Tomcat startup scripts.
+
+# if JAVA_HOME is not set we're not happy
+if [ -z "$JAVA_HOME" ]; then
+ echo "You must set the JAVA_HOME variable before running WSO2 AppServer."
+ exit 1
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false
+os400=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '.*/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`/"$link"
+ fi
+done
+
+# Get standard environment variables
+PRGDIR=`dirname "$PRG"`
+
+# Only set WSO2AppServer_HOME if not already set
+[ -z "$CARBON_HOME" ] && CARBON_HOME=`cd "$PRGDIR/../../.." ; pwd`
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CARBON_HOME" ] && WSO2AppServer_HOME=`cygpath --unix "$CARBON_HOME"`
+ [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For OS400
+if $os400; then
+ # Set job priority to standard for interactive (interactive - 6) by using
+ # the interactive priority - 6, the helper threads that respond to requests
+ # will be running at the same priority as interactive jobs.
+ COMMAND='chgjob job('$JOBNAME') runpty(6)'
+ system $COMMAND
+
+ # Enable multi threading
+ QIBM_MULTI_THREADED=Y
+ export QIBM_MULTI_THREADED
+fi
+
+# update classpath
+CLIENT_CLASSPATH=""
+for f in "$CARBON_HOME"/samples/Jaxws-Jaxrs/jaxrs_basic/build/lib/*.jar
+do
+ CLIENT_CLASSPATH=$CLIENT_CLASSPATH:$f
+done
+CLIENT_CLASSPATH=$CLIENT_CLASSPATH:$CLASSPATH
+
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+ CARBON_HOME=`cygpath --absolute --windows "$CARBON_HOME"`
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+fi
+
+echo Using CARBON_HOME: $CARBON_HOME
+echo Using JAVA_HOME : $JAVA_HOME
+
+CLIENT_CLASSPATH="$CARBON_HOME/samples/Jaxws-Jaxrs/jaxrs_basic/build/classes":$CLIENT_CLASSPATH
+
+$JAVA_HOME/bin/java -Dwso2appserver.home="$CARBON_HOME" -classpath "$CLIENT_CLASSPATH" \
+-Djava.endorsed.dirs="$CARBON_HOME/lib/endorsed":"$JAVA_HOME/jre/lib/endorsed":"$JAVA_HOME/lib/endorsed" \
+demo.jaxrs.client.Client http://localhost:9763/jaxrs_basic/services/customers/customerservice$*
diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/DiscoveryService.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/DiscoveryService.java
new file mode 100644
index 000000000..64cd0e8ec
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/DiscoveryService.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package cdm.api.windows;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+
+@Path("/EnrollmentServer")
+public interface DiscoveryService {
+
+ @Path("/Discovery.svc")
+ @POST
+ @Consumes({ "application/soap+xml;charset=utf-8", "application/xml" })
+ @Produces("application/soap+xml;charset=utf-8")
+ Response getDiscoveryResponse(
+ InputStream discoveryRequest);
+
+ @Path("/Discovery.svc")
+ @GET
+ @Consumes("text/html")
+ @Produces("text/html")
+ Response getDiscoveryOKRequest();
+
+ @Path("/Discovery.svc")
+ @GET
+ @Consumes({ "application/soap+xml;charset=utf-8", "application/xml" })
+ @Produces("text/html")
+ Response getDiscoveryOKRequestWithBody(InputStream discoveryRequest);
+
+}
diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/EnrolmentService.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/EnrolmentService.java
new file mode 100644
index 000000000..9a61a3c61
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/EnrolmentService.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package cdm.api.windows;
+
+import javax.swing.text.Document;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+@Path("/ENROLLMENTSERVER")
+public interface EnrolmentService {
+
+ @Path("/PolicyEnrollmentWebservice.svc")
+ @POST
+ @Consumes("application/soap+xml;charset=utf-8")
+ @Produces("application/soap+xml;charset=utf-8")
+ Response getPolicies(Document request);
+
+ @Path("/DeviceEnrollmentWebservice.svc")
+ @POST
+ @Consumes("application/soap+xml;charset=utf-8")
+ @Produces("application/soap+xml;charset=utf-8")
+ Response enrollUser(Document request);
+
+}
diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/DiscoveryServiceImpl.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/DiscoveryServiceImpl.java
new file mode 100644
index 000000000..01ef56460
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/DiscoveryServiceImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package cdm.api.windows.impl;
+
+import cdm.api.windows.DiscoveryService;
+
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import org.apache.log4j.Logger;
+
+public class DiscoveryServiceImpl implements DiscoveryService {
+
+ private Logger LOGGER = Logger.getLogger(DiscoveryServiceImpl.class);
+ private String discoveryServiceFileName;
+
+ public Response getDiscoveryResponse(InputStream discoveryRequest) {
+ LOGGER.info("Received Discovery Service POST Request [{}]");
+
+ String response = null;
+ try {
+ response = new String(Files.readAllBytes(Paths.get(discoveryServiceFileName)));
+ } catch (IOException e) {
+ LOGGER.error("An Unexpected Error has occurred while processing the request ", e);
+ }
+ LOGGER.info("Sending Discovery Response");
+
+ return Response.ok().entity(response).build();
+ }
+
+ public Response getDiscoveryOKRequest() {
+ LOGGER.info("Received a GET Request without body");
+ return Response.ok().build();
+ }
+
+ public Response getDiscoveryOKRequestWithBody(InputStream discoveryRequest) {
+ LOGGER.info("Received a GET Request with body [{}]");
+ return Response.ok().build();
+ }
+
+ public void setDiscoveryServiceFileName(String discoveryServiceFileName) {
+ this.discoveryServiceFileName = discoveryServiceFileName;
+ }
+
+}
diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/EnrolmentServiceImpl.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/EnrolmentServiceImpl.java
new file mode 100644
index 000000000..71b797efe
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/EnrolmentServiceImpl.java
@@ -0,0 +1,300 @@
+/*
+ * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package cdm.api.windows.impl;
+
+import cdm.api.windows.EnrolmentService;
+import org.apache.log4j.Logger;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.pkcs.PKCS10CertificationRequest;
+import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequest;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+import javax.swing.text.Document;
+import javax.ws.rs.core.Response;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.Security;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Iterator;
+
+import cdm.api.windows.util.CertificateSigningService;
+
+public class EnrolmentServiceImpl implements EnrolmentService {
+
+ private Logger LOGGER = Logger.getLogger(EnrolmentServiceImpl.class);
+
+ static {
+ Security.addProvider(new BouncyCastleProvider());
+ }
+
+ private String enrollmentResponseFile;
+
+ private String responseFile;
+
+ private String wapProvisioningXmlFile;
+
+ private String privatePemKeyFilePath;
+
+ private String caCertificateFilePath;
+
+ PrivateKey privateKey;
+
+ X509Certificate rooCACertificate;
+
+ public void init() {
+
+ try {
+ FileInputStream in = new FileInputStream(privatePemKeyFilePath);
+ byte[] keyBytes = new byte[in.available()];
+ in.read(keyBytes);
+ in.close();
+
+ String key = new String(keyBytes, "UTF-8");
+ key = key.replaceAll(
+ "(-+BEGIN RSA PRIVATE KEY-+\\r?\\n|-+END RSA PRIVATE KEY-+\\r?\\n?)", "");
+
+ // don't use this for real projects!
+ BASE64Decoder decoder = new BASE64Decoder();
+ keyBytes = decoder.decodeBuffer(key);
+
+ // generate private key
+
+ PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+
+ privateKey = keyFactory.generatePrivate(spec);
+
+ LOGGER.info("Private Key Algorithm : " + privateKey.getAlgorithm());
+ } catch (Exception e) {
+ LOGGER.error("An unexpected Error has occurred while reading CA Private Key, ", e);
+ }
+
+ try {
+ FileInputStream fr = new FileInputStream(caCertificateFilePath);
+ CertificateFactory cf = CertificateFactory.getInstance("X509");
+ rooCACertificate = (X509Certificate) cf.generateCertificate(fr);
+
+ rooCACertificate.verify(rooCACertificate.getPublicKey());
+
+ LOGGER.info("CA Certificate Expiration Date : " + rooCACertificate.getNotAfter());
+
+ } catch (Exception e) {
+ LOGGER.error("An unexpected Error has occurred while reading CA Root Certificate, ", e);
+ }
+
+ /*try {
+ KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
+ gen.initialize(2048);
+ key = gen.generateKeyPair();
+ PrivateKey privateKey = key.getPrivate();
+ PublicKey publicKey = key.getPublic();
+
+
+ *//**
+ * Following details need to be provided
+ *
+ * Serial number
+ * Signature algorithm
+ * Issuer Name.
+ * Subject Name -- or a Subject Alternative Name (SAN).
+ * Date range (not before, not after).
+ * Subject Public Key.
+ *//*
+
+ X509V3CertificateGenerator v3CertGen = new X509V3CertificateGenerator();
+ v3CertGen.setSerialNumber(BigInteger.valueOf(new SecureRandom().nextInt(Integer.MAX_VALUE)));
+ v3CertGen.setIssuerDN(new X509Principal("CN=wso2.com"));
+ //v3CertGen.setIssuerDN(new X509Principal("CN=wso2.com, OU=Mobile, O=wso2 L=Colombo, C=LK"));
+ v3CertGen.setNotBefore(new Date(System.currentTimeMillis() - 1000L * 60 * 60 * 24 * 30));
+ v3CertGen.setNotAfter(new Date(System.currentTimeMillis() + (1000L * 60 * 60 * 24 * 365*10)));
+ v3CertGen.setSubjectDN(new X509Principal("CN=wso2.com"));
+ v3CertGen.setPublicKey(publicKey);
+ v3CertGen.setSignatureAlgorithm("SHA1withRSA");
+
+ rooCACertificate = v3CertGen.generateX509Certificate(privateKey);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }*/
+ }
+
+ public Response getPolicies(Document request) {
+ LOGGER.info("Received Get Policies Request");
+ String response = null;
+ try {
+ response = new String(Files.readAllBytes(Paths.get(responseFile)));
+ } catch (IOException e) {
+ LOGGER.error("An Unexpected Error has occurred while processing the request ", e);
+ }
+
+ LOGGER.info("Sending Get Policy Response");
+ return Response.ok().entity(response).build();
+ }
+
+ public Response enrollUser(Document request) {
+ LOGGER.info("Received User Enrollment Request");
+
+ XPath xPath = XPathFactory.newInstance().newXPath();
+ xPath.setNamespaceContext(new MyNamespaceContext());
+ String response = null;
+
+ DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
+
+ try {
+ NodeList nl = (NodeList) xPath.evaluate(
+ "/s:Envelope/s:Body/wst:RequestSecurityToken/wsse:BinarySecurityToken", request,
+ XPathConstants.NODESET);
+ Node node = nl.item(0);
+ String certificateDataString = node.getTextContent();
+ byte[] derByteArray =
+ javax.xml.bind.DatatypeConverter.parseBase64Binary(certificateDataString);
+
+ PKCS10CertificationRequest certificationRequest =
+ new PKCS10CertificationRequest(derByteArray);
+ JcaPKCS10CertificationRequest csrReq =
+ new JcaPKCS10CertificationRequest(certificationRequest);
+
+ LOGGER.info("Public Key of CSR : " + csrReq.getPublicKey());
+
+ X509Certificate signedCert =
+ CertificateSigningService.signCSR(csrReq, privateKey, rooCACertificate);
+
+ LOGGER.info("Verifying Signed Certificate with CSR's public key : " +
+ signedCert.getPublicKey());
+
+ BASE64Encoder base64Encoder = new BASE64Encoder();
+ String rootCertEncodedString = base64Encoder.encode(rooCACertificate.getEncoded());
+ String signedCertEncoded = base64Encoder.encode(signedCert.getEncoded());
+
+ DocumentBuilder builder = domFactory.newDocumentBuilder();
+ org.w3c.dom.Document dDoc = builder.parse(wapProvisioningXmlFile);
+
+ NodeList wapParm = dDoc.getElementsByTagName("parm");
+
+ NamedNodeMap rootCertAttributes = wapParm.item(0).getAttributes();
+ Node b64Encoded = rootCertAttributes.getNamedItem("value");
+ b64Encoded.setTextContent(rootCertEncodedString);
+
+ NamedNodeMap clientCertAttributes = wapParm.item(1).getAttributes();
+ Node b64CliendEncoded = clientCertAttributes.getNamedItem("value");
+ b64CliendEncoded.setTextContent(signedCertEncoded);
+
+ String wapProvisioning = convertDocumentToString(dDoc);
+ String encodedWap = base64Encoder.encode(wapProvisioning.getBytes());
+
+ org.w3c.dom.Document responseXml = builder.parse(enrollmentResponseFile);
+ NodeList token = responseXml.getElementsByTagName("BinarySecurityToken");
+
+ Node firstToken = token.item(0);
+ firstToken.setTextContent(encodedWap);
+
+ response = convertDocumentToString(responseXml);
+ } catch (Exception e) {
+ LOGGER.error("An Unexpected Error has occurred while processing the request ", e);
+ }
+
+ LOGGER.info("Sending User Enrollment Response");
+ return Response.ok().entity(response).build();
+ }
+
+ private String convertDocumentToString(org.w3c.dom.Document document) throws Exception {
+ DOMSource domSource = new DOMSource(document);
+ StringWriter writer = new StringWriter();
+ StreamResult result = new StreamResult(writer);
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer transformer = tf.newTransformer();
+ transformer.transform(domSource, result);
+ String wapProvisioning = writer.toString();
+
+ return wapProvisioning;
+
+ }
+
+ public void setEnrollmentResponseFile(String enrollmentResponseFile) {
+ this.enrollmentResponseFile = enrollmentResponseFile;
+ }
+
+ public void setResponseFile(String responseFile) {
+ this.responseFile = responseFile;
+ }
+
+ public void setWapProvisioningXmlFile(String wapProvisioningXmlFile) {
+ this.wapProvisioningXmlFile = wapProvisioningXmlFile;
+ }
+
+ public void setPrivatePemKeyFilePath(String privatePemKeyFilePath) {
+ this.privatePemKeyFilePath = privatePemKeyFilePath;
+ }
+
+ public void setCaCertificateFilePath(String caCertificateFilePath) {
+ this.caCertificateFilePath = caCertificateFilePath;
+ }
+
+ public void setPrivateKey(PrivateKey privateKey) {
+ this.privateKey = privateKey;
+ }
+
+ public void setRooCACertificate(X509Certificate rooCACertificate) {
+ this.rooCACertificate = rooCACertificate;
+ }
+
+ private static class MyNamespaceContext implements NamespaceContext {
+
+ public String getNamespaceURI(String prefix) {
+
+ if ("s".equals(prefix)) {
+ return "http://www.w3.org/2003/05/soap-envelope";
+ } else if ("wst".equals(prefix)) {
+ return "http://docs.oasis-open.org/ws-sx/ws-trust/200512";
+ } else if ("wsse".equals(prefix)) {
+ return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
+ }
+ return null;
+
+ }
+
+ public String getPrefix(String namespaceURI) {
+ return null;
+ }
+
+ public Iterator getPrefixes(String namespaceURI) {
+ return null;
+ }
+ }
+}
diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/CertificateSigningService.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/CertificateSigningService.java
new file mode 100644
index 000000000..6b0069409
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/CertificateSigningService.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package cdm.api.windows.util;
+
+import org.apache.log4j.Logger;
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.cert.X509v3CertificateBuilder;
+import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
+import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils;
+import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
+import org.bouncycastle.operator.ContentSigner;
+import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
+import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequest;
+
+import java.math.BigInteger;
+import java.security.PrivateKey;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.Date;
+
+public class CertificateSigningService {
+
+ private static Logger LOGGER = Logger.getLogger(CertificateSigningService.class);
+
+ public static X509Certificate signCSR(JcaPKCS10CertificationRequest jcaRequest,
+ PrivateKey privateKey, X509Certificate caCert)
+ throws Exception {
+ try {
+
+ X509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(caCert,
+ BigInteger
+ .valueOf(
+ new SecureRandom()
+ .nextInt(
+ Integer.MAX_VALUE)),
+ new Date(
+ System.currentTimeMillis() -
+ 1000L *
+ 60 *
+ 60 *
+ 24 *
+ 30),
+ new Date(
+ System.currentTimeMillis() +
+ (1000L *
+ 60 *
+ 60 *
+ 24 *
+ 365 *
+ 10)),
+ new X500Name(
+ "CN=abimaran"),
+ jcaRequest
+ .getPublicKey());
+
+ JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
+
+ ContentSigner signer =
+ new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(privateKey);
+
+ X509Certificate theCert =
+ new JcaX509CertificateConverter().setProvider("BC").getCertificate(
+ certificateBuilder.build(signer));
+
+ LOGGER.info("Signed Certificate CN : " + theCert.getSubjectDN().getName());
+
+ LOGGER.info("Signed CSR's public key : " + theCert.getPublicKey());
+
+ return theCert;
+
+ } catch (Exception e) {
+ throw new Exception("Error in signing the certificate", e);
+ }
+ }
+
+}
diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/WindowsAPIUtil.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/WindowsAPIUtil.java
new file mode 100644
index 000000000..ca784e189
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/WindowsAPIUtil.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cdm.api.windows.util;
+
+
+import com.google.gson.JsonObject;
+import org.wso2.carbon.device.mgt.common.Device;
+import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
+import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
+
+
+/**
+ * WindowsAPIUtil class provides utility function used by Android REST-API classes.
+ */
+public class WindowsAPIUtil {
+
+ public static Device convertToDeviceObject(JsonObject json){
+ Device device = new Device();
+ device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
+ device.setName("Test Device");
+ device.setOwner("harshan");
+ return device;
+ }
+
+ public static DeviceIdentifier convertToDeviceIdentifierObject(String deviceId){
+ DeviceIdentifier identifier = new DeviceIdentifier();
+ identifier.setId(deviceId);
+ identifier.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
+ return identifier;
+ }
+}
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/applicationContext.xml b/product/modules/agents/windows/jax-rs/src/main/resources/applicationContext.xml
new file mode 100644
index 000000000..5dd63f2c8
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/applicationContext.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/ca_cert.pem b/product/modules/agents/windows/jax-rs/src/main/resources/ca_cert.pem
new file mode 100644
index 000000000..6eaad0f57
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/ca_cert.pem
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDXDCCAkQCCQDWxw0vNF9H8DANBgkqhkiG9w0BAQUFADBwMQswCQYDVQQGEwJM
+SzEQMA4GA1UECBMHQ29sb21ibzEQMA4GA1UEBxMHQ29sb21ibzENMAsGA1UEChME
+d3NvMjEPMA0GA1UECxMGbW9iaWxlMR0wGwYDVQQDFBRjYV93c28yV2luZG93c01v
+YmlsZTAeFw0xNDA3MDcxMDE4MDhaFw0xNTA3MDcxMDE4MDhaMHAxCzAJBgNVBAYT
+AkxLMRAwDgYDVQQIEwdDb2xvbWJvMRAwDgYDVQQHEwdDb2xvbWJvMQ0wCwYDVQQK
+EwR3c28yMQ8wDQYDVQQLEwZtb2JpbGUxHTAbBgNVBAMUFGNhX3dzbzJXaW5kb3dz
+TW9iaWxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+w93X1S8nOM
+VM3ScGP8XY9+PnoUaFZgKaD3d9Z6cj4HPKjIzv8iTMx9JBfDjSsLiks5nJqxm1in
+juck7n0tl/CZ5L2j/3DhsA4D0Ngp5JsH5ZF+Vu2T+z8wUq8UwGD6qsn/EP9jBbj/
+WN0TtOPcfhOhfJVxaNOrt+9htYad9WOeU8Rh+CIb5oQrigEd417e5d5j4wcU8QLj
+sVQQ8WRCYDrnKKof834ZnViBYX4UAdLtXkWFtKcD0RM/cB2LdjydwP3HEj6pkwjT
+hRLGHdVF21VCbKOF6mnQagvuseT/ynioBNY60TXb283BQ6YrDfMytvRuzguEQ/7/
+AsTPclNZxQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQB3cwy5pibn009WvAYzmw9B
+oB77bt21GQO4gFLJlNkvIRrneE5SinjoO6ezWOgY3+8t9ViNeD874momq4kuE6Hb
+XDZE1qqinJlqfMJQuEaFkDZKg55kO66wy5+8ioFhA9V8SpeM+SYy3ENBucxiDLQE
+ZhM7RKJCpSIq0rRHJyBRbs6GoW7cOB5QQcFDfSW+/CajicWzeD/OJMIfjJezCsZ8
+GNXJpyAS/Te+ysHlfmrKMb1VMZphFNiTmpEx8OI8F/kbhmdwePaZ3SOw2kJp8e3v
+Ke4/zPwB95wjz8luzU+PbqNO2K4ZKtXHk6rx5yybR1UBpYINvUEjsRI3hgy1IoE+
+-----END CERTIFICATE-----
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/ca_private.key b/product/modules/agents/windows/jax-rs/src/main/resources/ca_private.key
new file mode 100644
index 000000000..764b31663
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/ca_private.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAz+w93X1S8nOMVM3ScGP8XY9+PnoUaFZgKaD3d9Z6cj4HPKjI
+zv8iTMx9JBfDjSsLiks5nJqxm1injuck7n0tl/CZ5L2j/3DhsA4D0Ngp5JsH5ZF+
+Vu2T+z8wUq8UwGD6qsn/EP9jBbj/WN0TtOPcfhOhfJVxaNOrt+9htYad9WOeU8Rh
++CIb5oQrigEd417e5d5j4wcU8QLjsVQQ8WRCYDrnKKof834ZnViBYX4UAdLtXkWF
+tKcD0RM/cB2LdjydwP3HEj6pkwjThRLGHdVF21VCbKOF6mnQagvuseT/ynioBNY6
+0TXb283BQ6YrDfMytvRuzguEQ/7/AsTPclNZxQIDAQABAoIBAQCrNz+Od1fpnOrv
+Hnnu4Pb82F+99Ot/K7mOLiX6Qdyc3KU690Y85m2JTk6yfPsj8VFUdTOg2OXuJWf9
+TivkU6JK3u7rJJq6i2rdffz4aji9Lkina1LdJFBacaNKQzBUZsekAiiPB660FK34
+sDw9FfIIxAOTwsAb8UoTcgVE5PCIEx7R7YdAI0/mMnd98kTc2YdcnAmGwrDFQNer
+eOLhq8H/6SxUADyos3s6Tgw3/yIo9BnBpe8uPNoakEPgYJLh263uF2rJ2h0+yLDV
+9F9by+yFCqyVqS8P06NI+NMe8WsYJo99RGQsLZ7PsI5jiJSTRYgOF4ROQfAcCZiK
+UWKCwcwhAoGBAPOg32J8AZX64FFDqyruN/1Q6hJfkVAVM+B3dxNAYIpccLuuxJ7x
+JMIWkAFfBlOoaXZzxaDIXmXrd3h5qxRTd6W/gAR9nRko7YHaK7NszpEPA8hVOjjx
+kkTNs/KjlELrLspRWL+iDqR5Nscw0V9y2D6tyYuGp475wK4PmKbgcKAdAoGBANp7
+M9nFEAUTeHzdo9csbrGy6wUuCRlixFvXKOH+1ezeuNvxh0XtbJPj7FrPT4nuCKEV
+Wud1w3/IRaeCYeKXaHk6eF8zN1gVkN0MAQJ+9KtfZ0QnmQSsluJfrUBGej6UYO0z
+DUv5CLNYLPwOVGTb/jb5n+lY2IzjKmA+aWZRML/JAoGBAJSfUycVVzJTdXydt1Hd
+OTLDpcfHnTIpfRg2SOHpp/tAIVWdbD06Bp6QfREZExb96jhkr+9BzLSITL2mG4Ou
+15K5nDMhHjE3Eozgt0Ah5HIBouEXfQk39W8bvecLe2rHZifuMCHXju8vMweY9GEy
+AlFaW1VOs/E40x5cTVegG5TRAoGANLxmUJtTeZYwkBtDr+2GrpfcSLzK73i6otx1
+fs9vPaSpBFXxa/yaJ7xtUaIWtdlh9dfcwF/Zl590yLEdBX+8dP6bDYekRTu3YtPB
+7qNMVY1KtNXGBq3OIcgsXoZkfXR9TOP0wrDS289d1F11G39KhmSMp9uNMbynfuGx
+uUPBu5kCgYA1UUtQkVPbkKaaopSrDkqAJDlsUnNVkvXH5yWqdAYI2Frw1iOwhED3
+cKmwAejf8nl1HPwfDTGQMRB5PCDkK7mWJ5w9W4MUbJ7ZiNPHloZutUTcw3Nz58cn
+OZMZGR/Trtn+YLoj2526NPwKqlw0bRB27UR0KOdgPOHynI3uYPnwgQ==
+-----END RSA PRIVATE KEY-----
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/discover-service.xml b/product/modules/agents/windows/jax-rs/src/main/resources/discover-service.xml
new file mode 100644
index 000000000..05f8f939b
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/discover-service.xml
@@ -0,0 +1,27 @@
+
+
+
+ http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/DiscoverResponse
+
+
+ d9eb2fdd-e38a-46ee-bd93-aea9dc86a3b8
+
+ urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478
+
+
+
+
+ OnPremise
+
+ https://EnterpriseEnrollment.wso2.com/ENROLLMENTSERVER/PolicyEnrollmentWebservice.svc
+
+
+ https://EnterpriseEnrollment.wso2.com/ENROLLMENTSERVER/DeviceEnrollmentWebservice.svc
+
+
+
+
+
\ No newline at end of file
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/enrollment-service.xml b/product/modules/agents/windows/jax-rs/src/main/resources/enrollment-service.xml
new file mode 100644
index 000000000..4be6e477a
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/enrollment-service.xml
@@ -0,0 +1,27 @@
+
+
+ http://schemas.microsoft.com/windows/pki/2009/01/enrollment/RSTRC/wstep
+ urn:uuid:81a5419a-496b-474f-a627-5cdd33eed8ab
+
+
+ 2012-08-02T00:32:59.420Z
+ 2014-08-02T00:37:59.420Z
+
+
+
+
+
+
+ http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentToken
+
+
+
+
+ 0
+
+
+
+
\ No newline at end of file
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/log4j.xml b/product/modules/agents/windows/jax-rs/src/main/resources/log4j.xml
new file mode 100644
index 000000000..7cd7d6412
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/log4j.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/policy-service.xml b/product/modules/agents/windows/jax-rs/src/main/resources/policy-service.xml
new file mode 100644
index 000000000..e38440d6b
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/policy-service.xml
@@ -0,0 +1,15 @@
+
+
+
+ http://schemas.microsoft.com/windows/pki/2009/01/enrollmentpolicy/IPolicy/GetPoliciesResponse
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/wap-provisioning.xml b/product/modules/agents/windows/jax-rs/src/main/resources/wap-provisioning.xml
new file mode 100644
index 000000000..d51958a71
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/wap-provisioning.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/windows-mdm-server.properties b/product/modules/agents/windows/jax-rs/src/main/resources/windows-mdm-server.properties
new file mode 100644
index 000000000..6f092e31f
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/resources/windows-mdm-server.properties
@@ -0,0 +1,8 @@
+service.url=http://0.0.0.0:9090
+
+
+discovery.service.file.location=./conf/discover-service.xml
+policy.certificate.file.location=./conf/policy-service.xml
+enrollment.service.file.location=./conf/enrollment-service.xml
+
+enrollment.service.wap.provisioning.file.location=./conf/wap-provisioning.xml
\ No newline at end of file
diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/META-INF/webapp-classloading.xml b/product/modules/agents/windows/jax-rs/src/main/webapp/META-INF/webapp-classloading.xml
new file mode 100644
index 000000000..8521215e7
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/webapp/META-INF/webapp-classloading.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+ false
+
+
+ CXF,Carbon
+
diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml
new file mode 100644
index 000000000..165c96704
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/web.xml b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 000000000..777ee8a70
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,43 @@
+
+
+
+ CDM-Windows-API
+
+ JAX-WS/JAX-RS Endpoint
+ JAX-WS/JAX-RS Servlet
+ JAXServlet
+
+ org.apache.cxf.transport.servlet.CXFServlet
+
+
+ service-list-stylesheet
+ servicelist.css
+
+ 1
+
+
+ JAXServlet
+ /*
+
+
+ 60
+
+
\ No newline at end of file
diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/servicelist.css b/product/modules/agents/windows/jax-rs/src/main/webapp/servicelist.css
new file mode 100644
index 000000000..bbc4987c0
--- /dev/null
+++ b/product/modules/agents/windows/jax-rs/src/main/webapp/servicelist.css
@@ -0,0 +1,117 @@
+@CHARSET "ISO-8859-1";
+
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+
+html {
+ background: #efefef;
+}
+
+body {
+ line-height: 1;
+ width:960px;
+ margin:auto;
+ background:white;
+ padding:10px;
+ box-shadow:0px 0px 5px #CCC;
+ font-family:"Lucida Grande","Lucida Sans","Microsoft Sans Serif", "Lucida Sans Unicode","Verdana","Sans-serif","trebuchet ms" !important;
+
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width:960px;
+ border:solid 1px #ccc;
+}
+
+table a {
+ font-size:12px;
+ color:#1e90ff;
+ padding:7px;
+float:left;
+;
+}
+
+.heading {
+ font-size: 18px;
+ margin-top: 20px;
+ float:left;
+ color:#0067B1;
+ margin-bottom:20px;
+ padding-top:20px;
+}
+
+.field {
+ font-weight: normal;
+ width:120px;
+ font-size:12px;
+ float:left;
+ padding:7px;
+ clear:left;
+}
+.value {
+ font-weight: bold;
+ font-size:12px;
+ float:left;
+ padding:7px;
+ clear:right;
+}
+.porttypename {
+ font-weight: bold;
+ font-size:14px;
+}
+UL {
+ margin-top: 0;
+}
+LI {
+ font-weight: normal;
+ font-size:12px;
+ margin-top:10px;
+}
+
+TD {
+ border:1px solid #ccc;
+ vertical-align: text-top;
+ padding: 5px;
+}
+
+
diff --git a/product/pom.xml b/product/pom.xml
index c9fbafc3d..dfbfe94b7 100644
--- a/product/pom.xml
+++ b/product/pom.xml
@@ -35,6 +35,8 @@
+ modules/agents/windows/jax-rs
+ modules/agents/android/jax-rs
modules/p2-profile-gen
modules/distribution
modules/integration