You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2010/02/25 18:41:17 UTC

svn commit: r916368 - in /incubator/chemistry/trunk/chemistry: ./ chemistry-api/src/main/java/org/apache/chemistry/ chemistry-atompub-server/ chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/ chemistry-parent/ chemistry-soap-server/ che...

Author: fguillaume
Date: Thu Feb 25 17:41:17 2010
New Revision: 916368

URL: http://svn.apache.org/viewvc?rev=916368&view=rev
Log:
Preliminary SOAP server support

Added:
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/README.txt   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/sun-jaxws.xml   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/pom.xml   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/AuthHandler.java   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/CallContext.java   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/ChemistryHelper.java   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/DiscoveryServicePortImpl.java   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/RepositoryServicePortImpl.java   (with props)
    incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/resources/
Removed:
    incubator/chemistry/trunk/chemistry/chemistry-atompub-server/README.txt
Modified:
    incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/RepositoryManager.java
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleRepositoryService.java
    incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml
    incubator/chemistry/trunk/chemistry/chemistry-ws/pom.xml
    incubator/chemistry/trunk/chemistry/pom.xml

Modified: incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/RepositoryManager.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/RepositoryManager.java?rev=916368&r1=916367&r2=916368&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/RepositoryManager.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/RepositoryManager.java Thu Feb 25 17:41:17 2010
@@ -29,8 +29,13 @@
 
     protected static RepositoryManager instance;
 
+    protected List<Runnable> activators = new ArrayList<Runnable>(1);
+
     protected List<RepositoryService> services = new CopyOnWriteArrayList<RepositoryService>();
 
+    /**
+     * Gets the {@link RepositoryManager} singleton.
+     */
     public static RepositoryManager getInstance() {
         if (instance == null) {
             synchronized (RepositoryManager.class) {
@@ -42,6 +47,32 @@
         return instance;
     }
 
+    /**
+     * Registers a {@link Runnable} that will be called the first time a request
+     * for a repository is made.
+     * <p>
+     * This can be used with a runnable that registers repositories just when
+     * they are needed.
+     */
+    public synchronized void registerActivator(Runnable activator) {
+        activators.add(activator);
+    }
+
+    protected void runActivators() {
+        if (activators.isEmpty()) {
+            return;
+        }
+        synchronized (this) {
+            for (Runnable activator : activators) {
+                activator.run();
+            }
+            activators.clear();
+        }
+    }
+
+    /**
+     * Registers a {@link RepositoryService}.
+     */
     public synchronized void registerService(RepositoryService service) {
         if (service == this) {
             // avoid stupid errors
@@ -60,6 +91,7 @@
     }
 
     public Repository getDefaultRepository() {
+        runActivators();
         for (RepositoryService service : services) {
             Repository repository = service.getDefaultRepository();
             if (repository != null) {
@@ -70,6 +102,7 @@
     }
 
     public Collection<RepositoryEntry> getRepositories() {
+        runActivators();
         List<RepositoryEntry> entries = new ArrayList<RepositoryEntry>(1);
         for (RepositoryService service : services) {
             entries.addAll(service.getRepositories());
@@ -78,6 +111,7 @@
     }
 
     public Repository getRepository(String repositoryId) {
+        runActivators();
         for (RepositoryService service : services) {
             Repository repository = service.getRepository(repositoryId);
             if (repository != null) {

Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleRepositoryService.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleRepositoryService.java?rev=916368&r1=916367&r2=916368&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleRepositoryService.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleRepositoryService.java Thu Feb 25 17:41:17 2010
@@ -16,34 +16,55 @@
  */
 package org.apache.chemistry.impl.simple;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 
 import org.apache.chemistry.Repository;
 import org.apache.chemistry.RepositoryEntry;
 import org.apache.chemistry.RepositoryService;
 
 /**
- * Simple repository service holding one repository instance.
+ * Simple repository service holding one ore more repository instance.
  */
 public class SimpleRepositoryService implements RepositoryService {
 
-    protected final Repository repository;
+    private List<Repository> repositories;
 
+    /**
+     * Service holding one repository.
+     */
     public SimpleRepositoryService(Repository repository) {
-        this.repository = repository;
+        this.repositories = Collections.singletonList(repository);
+    }
+
+    /**
+     * Service holding one or more repository. The first repository is used as
+     * the default.
+     */
+    public SimpleRepositoryService(List<Repository> repositories) {
+        if (repositories == null || repositories.isEmpty()) {
+            throw new IllegalArgumentException();
+        }
+        this.repositories = new ArrayList<Repository>(repositories);
     }
 
     public Repository getDefaultRepository() {
-        return repository;
+        return repositories.get(0);
     }
 
     public Collection<RepositoryEntry> getRepositories() {
-        return Collections.<RepositoryEntry> singleton(repository);
+        return Collections.<RepositoryEntry> unmodifiableCollection(repositories);
     }
 
     public Repository getRepository(String repositoryId) {
-        return repository.getId().equals(repositoryId) ? repository : null;
+        for (Repository repository : repositories) {
+            if (repository.getId().equals(repositoryId)) {
+                return repository;
+            }
+        }
+        return null;
     }
 
 }

Modified: incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml?rev=916368&r1=916367&r2=916368&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml Thu Feb 25 17:41:17 2010
@@ -121,6 +121,16 @@
       </dependency>
       <dependency>
         <groupId>org.apache.chemistry</groupId>
+        <artifactId>chemistry-ws</artifactId>
+        <version>${version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.chemistry</groupId>
+        <artifactId>chemistry-soap-server</artifactId>
+        <version>${version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.chemistry</groupId>
         <artifactId>chemistry-jcr</artifactId>
         <version>${version}</version>
       </dependency>
@@ -196,6 +206,21 @@
         <version>1.0</version>
       </dependency>
       <dependency>
+        <groupId>javax.xml.bind</groupId>
+        <artifactId>jaxb-api</artifactId>
+        <version>2.1</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.geronimo.specs</groupId>
+        <artifactId>geronimo-jaxws_2.1_spec</artifactId>
+        <version>1.0</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.geronimo.specs</groupId>
+        <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
+        <version>1.1.2</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxrs</artifactId>
         <version>${cxf.version}</version>

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu Feb 25 17:41:17 2010
@@ -0,0 +1,6 @@
+bin
+target
+*.iws
+*.ipr
+*.iml
+.*

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/README.txt
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/README.txt?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/README.txt (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/README.txt Thu Feb 25 17:41:17 2010
@@ -0,0 +1,12 @@
+This contains the code for SOAP server bindings to the Chemistry SPI.
+
+In order to have it work correctly, the endpoints have to be registered
+with the SOAP runtime. This is usually done through a WEB-INF/sun-jaxws.xml
+file placed in a WAR. An example such file is available in the examples/
+directory.
+
+In this file, the url-pattern will have to be configured depending on your
+application server.
+
+Note also the <handler-class> directive, which is necessary to have
+authentication be propagated from SOAP to the underlying Chemistry repository.

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/README.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/README.txt
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/sun-jaxws.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/sun-jaxws.xml?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/sun-jaxws.xml (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/sun-jaxws.xml Thu Feb 25 17:41:17 2010
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
+  <endpoint name="RepositoryService"
+      implementation="org.apache.chemistry.soap.server.RepositoryServicePortImpl"
+      url-pattern="/webservices/cmis/RepositoryService">
+    <handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
+      <handler-chain>
+        <handler>
+          <handler-class>org.apache.chemistry.soap.server.AuthHandler</handler-class>
+        </handler>
+      </handler-chain>
+    </handler-chains>
+  </endpoint>
+</endpoints>

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/sun-jaxws.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/examples/sun-jaxws.xml
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/pom.xml?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/pom.xml (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/pom.xml Thu Feb 25 17:41:17 2010
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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.
+  -->
+
+
+<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>
+
+  <parent>
+    <groupId>org.apache.chemistry</groupId>
+    <artifactId>chemistry-parent</artifactId>
+    <version>0.5-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>chemistry-soap-server</artifactId>
+  <name>Chemistry SOAP Server</name>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>org.apache.chemistry</groupId>
+      <artifactId>chemistry-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.chemistry</groupId>
+      <artifactId>chemistry-commons</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.chemistry</groupId>
+      <artifactId>chemistry-ws</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/AuthHandler.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/AuthHandler.java?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/AuthHandler.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/AuthHandler.java Thu Feb 25 17:41:17 2010
@@ -0,0 +1,124 @@
+/*
+ * 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.
+ *
+ * Authors:
+ *     Florian Mueller, Open Text
+ *     Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry.soap.server;
+
+import java.util.Collections;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+/**
+ * Extracts a username and password from the WSS UsernameToken of the SOAP
+ * request.
+ * <p>
+ * This information is then stored in a CallContext object of the global
+ * SOAPMessageContext for later retrieval by methods that need it.
+ * <p>
+ * This class should be registered in the handler-chains for each SOAP endpoint.
+ * This often happens in the {@code sun-jaxws.xml} file.
+ */
+public class AuthHandler implements SOAPHandler<SOAPMessageContext> {
+
+    public static final String WSSE_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
+
+    public static final QName WSSE_SECURITY = new QName(WSSE_NS, "Security");
+
+    public static final QName WSSE_USERNAME_TOKEN = new QName(WSSE_NS,
+            "UsernameToken");
+
+    public static final QName WSSE_USERNAME = new QName(WSSE_NS, "Username");
+
+    public static final QName WSSE_PASSWORD = new QName(WSSE_NS, "Password");
+
+    public static final Set<QName> HEADERS = Collections.singleton(WSSE_SECURITY);
+
+    public Set<QName> getHeaders() {
+        return HEADERS;
+    }
+
+    public boolean handleMessage(SOAPMessageContext soapContext) {
+        if (Boolean.TRUE.equals(soapContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) {
+            return handleOutboundMessage(soapContext);
+        } else {
+            return handleInboundMessage(soapContext);
+        }
+    }
+
+    protected boolean handleInboundMessage(SOAPMessageContext soapContext) {
+        CallContext callContext = new CallContext();
+        try {
+            extractUsernamePassword(soapContext, callContext);
+        } catch (NoSuchElementException e) {
+            // cannot get UsernameToken
+            callContext.setUsername("");
+            callContext.setPassword("");
+        }
+        callContext.setInMessageContext(soapContext);
+        return true; // continue processing
+    }
+
+    /**
+     * Gets the username and password from the UsernameToken on the
+     * {@link SOAPMessageContext} and stores them in the {@link CallContext}.
+     *
+     * @throws NoSuchElementException if the token cannot be found
+     */
+    protected void extractUsernamePassword(SOAPMessageContext soapContext,
+            CallContext callContext) throws NoSuchElementException {
+        SOAPHeader sh;
+        try {
+            sh = soapContext.getMessage().getSOAPHeader();
+        } catch (SOAPException e) {
+            throw new RuntimeException("Cannot get SOAP header", e);
+        }
+        // NoSuchElementException may be thrown by next()
+        SOAPElement security = (SOAPElement) sh.getChildElements(WSSE_SECURITY).next();
+        SOAPElement token = (SOAPElement) security.getChildElements(
+                WSSE_USERNAME_TOKEN).next();
+        SOAPElement usernameElement = (SOAPElement) token.getChildElements(
+                WSSE_USERNAME).next();
+        SOAPElement passwordElement = (SOAPElement) token.getChildElements(
+                WSSE_PASSWORD).next();
+        String username = usernameElement.getValue();
+        String password = passwordElement.getValue();
+        if (username == null || password == null) {
+            throw new NoSuchElementException();
+        }
+        callContext.setUsername(username);
+        callContext.setPassword(password);
+    }
+
+    protected boolean handleOutboundMessage(SOAPMessageContext soapContext) {
+        return true; // continue processing
+    }
+
+    public boolean handleFault(SOAPMessageContext context) {
+        return true; // continue processing
+    }
+
+    public void close(MessageContext context) {
+    }
+
+}

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/AuthHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/AuthHandler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/CallContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/CallContext.java?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/CallContext.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/CallContext.java Thu Feb 25 17:41:17 2010
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ *
+ * Authors:
+ *     Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry.soap.server;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.MessageContext.Scope;
+
+/**
+ * Holds context data about the current call.
+ */
+public class CallContext extends HashMap<String, String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public static final String USERNAME = "username";
+
+    public static final String PASSWORD = "password";
+
+    public static final String CALL_CONTEXT = "org.apache.chemistry.callcontext";
+
+    public void setUsername(String username) {
+        put(USERNAME, username);
+    }
+
+    public String getUsername() {
+        return get(USERNAME);
+    }
+
+    public void setPassword(String password) {
+        put(PASSWORD, password);
+    }
+
+    public String getPassword() {
+        return get(PASSWORD);
+    }
+
+    public Map<String, Serializable> toMap() {
+        return new HashMap<String, Serializable>(this);
+    }
+
+    /**
+     * Stores this call context in a {@link MessageContext}.
+     *
+     * @param mcontext the message context in which to store
+     */
+    public void setInMessageContext(MessageContext mcontext) {
+        mcontext.put(CALL_CONTEXT, this);
+        mcontext.setScope(CALL_CONTEXT, Scope.APPLICATION);
+    }
+
+    /**
+     * Retrieves the call context from the {@link MessageContext}.
+     *
+     * @param messageContext the message context
+     * @return the call context
+     */
+    public static CallContext fromMessageContext(MessageContext messageContext) {
+        CallContext callContext = (CallContext) messageContext.get(CALL_CONTEXT);
+        if (callContext == null) {
+            callContext = new CallContext();
+            // Principal principal = context.getUserPrincipal();
+            // if (principal != null) {
+            // callContext.setUsername(principal.getName());
+            // }
+        }
+        return callContext;
+    }
+
+    public static Map<String, Serializable> mapFromWebServiceContext(
+            WebServiceContext wscontext) {
+        return CallContext.fromMessageContext(wscontext.getMessageContext()).toMap();
+    }
+
+}

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/CallContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/CallContext.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/ChemistryHelper.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/ChemistryHelper.java?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/ChemistryHelper.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/ChemistryHelper.java Thu Feb 25 17:41:17 2010
@@ -0,0 +1,213 @@
+/*
+ * 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.
+ *
+ * Authors:
+ *     Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry.soap.server;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.Map.Entry;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.apache.chemistry.CapabilityJoin;
+import org.apache.chemistry.CapabilityQuery;
+import org.apache.chemistry.ObjectEntry;
+import org.apache.chemistry.Property;
+import org.apache.chemistry.PropertyType;
+import org.apache.chemistry.ws.CmisObjectType;
+import org.apache.chemistry.ws.CmisPropertiesType;
+import org.apache.chemistry.ws.CmisProperty;
+import org.apache.chemistry.ws.CmisPropertyBoolean;
+import org.apache.chemistry.ws.CmisPropertyDateTime;
+import org.apache.chemistry.ws.CmisPropertyDecimal;
+import org.apache.chemistry.ws.CmisPropertyHtml;
+import org.apache.chemistry.ws.CmisPropertyId;
+import org.apache.chemistry.ws.CmisPropertyInteger;
+import org.apache.chemistry.ws.CmisPropertyString;
+import org.apache.chemistry.ws.CmisPropertyUri;
+import org.apache.chemistry.ws.EnumCapabilityJoin;
+import org.apache.chemistry.ws.EnumCapabilityQuery;
+
+/**
+ * Helper for various Chemistry to JAXB conversions.
+ */
+public class ChemistryHelper {
+
+    private ChemistryHelper() {
+        // utility class;
+    }
+
+    public static EnumCapabilityQuery chemistryToJAXB(CapabilityQuery query) {
+        switch (query) {
+        case NONE:
+            return EnumCapabilityQuery.NONE;
+        case METADATA_ONLY:
+            return EnumCapabilityQuery.METADATAONLY;
+        case FULL_TEXT_ONLY:
+            return EnumCapabilityQuery.FULLTEXTONLY;
+        case BOTH_COMBINED:
+            return EnumCapabilityQuery.BOTHCOMBINED;
+        case BOTH_SEPARATE:
+            return EnumCapabilityQuery.BOTHSEPARATE;
+        default:
+            throw new RuntimeException();
+        }
+    }
+
+    public static EnumCapabilityJoin chemistryToJAXB(CapabilityJoin join) {
+        switch (join) {
+        case NONE:
+            return EnumCapabilityJoin.NONE;
+        case INNER_ONLY:
+            return EnumCapabilityJoin.INNERONLY;
+        case INNER_AND_OUTER:
+            return EnumCapabilityJoin.INNERANDOUTER;
+        default:
+            throw new RuntimeException();
+        }
+    }
+
+    public static void chemistryToJAXB(ObjectEntry entry, CmisObjectType object) {
+        CmisPropertiesType properties = new CmisPropertiesType();
+        List<CmisProperty> list = properties.getProperty();
+        for (Entry<String, Serializable> e : entry.getValues().entrySet()) {
+            list.add(getWSCmisProperty(e.getKey(), e.getValue()));
+        }
+        object.setProperties(properties);
+        // object.setAllowableActions(null);
+    }
+
+    /**
+     * Transforms a Chemistry property into a WS one.
+     */
+    public static CmisProperty getWSCmisProperty(String key, Serializable value) {
+        CmisProperty p;
+        PropertyType propertyType = guessType(key, value);
+        // boolean multi = false; // TODO
+        switch (propertyType.ordinal()) {
+        case PropertyType.STRING_ORD:
+            p = new CmisPropertyString();
+            ((CmisPropertyString) p).getValue().add((String) value);
+            break;
+        case PropertyType.DECIMAL_ORD:
+            p = new CmisPropertyDecimal();
+            ((CmisPropertyDecimal) p).getValue().add((BigDecimal) value);
+            break;
+        case PropertyType.INTEGER_ORD:
+            p = new CmisPropertyInteger();
+            Long l;
+            if (value == null) {
+                l = null;
+            } else if (value instanceof Long) {
+                l = (Long) value;
+            } else if (value instanceof Integer) {
+                l = Long.valueOf(((Integer) value).longValue());
+            } else {
+                throw new AssertionError("not a int/long: " + value);
+            }
+            ((CmisPropertyInteger) p).getValue().add(
+                    l == null ? null : BigInteger.valueOf(l.longValue()));
+            break;
+        case PropertyType.BOOLEAN_ORD:
+            p = new CmisPropertyBoolean();
+            ((CmisPropertyBoolean) p).getValue().add((Boolean) value);
+            break;
+        case PropertyType.DATETIME_ORD:
+            p = new CmisPropertyDateTime();
+            ((CmisPropertyDateTime) p).getValue().add(
+                    getXMLGregorianCalendar((Calendar) value));
+            break;
+        case PropertyType.URI_ORD:
+            p = new CmisPropertyUri();
+            URI u = (URI) value;
+            ((CmisPropertyUri) p).getValue().add(
+                    u == null ? null : u.toString());
+            break;
+        case PropertyType.ID_ORD:
+            p = new CmisPropertyId();
+            ((CmisPropertyId) p).getValue().add((String) value);
+            break;
+        case PropertyType.HTML_ORD:
+            p = new CmisPropertyHtml();
+            // ((CmisPropertyHtml)property).getAny().add(element);
+            break;
+        default:
+            throw new AssertionError();
+        }
+        p.setPropertyDefinitionId(key);
+        return p;
+
+    }
+
+    // TODO XXX we shouldn't guess, values should be typed in ObjectEntry
+    protected static PropertyType guessType(String key, Serializable value) {
+        for (String n : Arrays.asList( //
+                Property.ID, //
+                Property.TYPE_ID, //
+                Property.BASE_TYPE_ID, //
+                Property.VERSION_SERIES_ID, //
+                Property.VERSION_SERIES_CHECKED_OUT_ID, //
+                Property.PARENT_ID, //
+                Property.SOURCE_ID, //
+                Property.TARGET_ID)) {
+            if (key.toUpperCase().endsWith(n.toUpperCase())) {
+                return PropertyType.ID;
+            }
+        }
+        if (value instanceof String) {
+            return PropertyType.STRING;
+        }
+        if (value instanceof BigDecimal) {
+            return PropertyType.DECIMAL;
+        }
+        if (value instanceof Number) {
+            return PropertyType.INTEGER;
+        }
+        if (value instanceof Boolean) {
+            return PropertyType.BOOLEAN;
+        }
+        if (value instanceof Calendar) {
+            return PropertyType.DATETIME;
+        }
+        return PropertyType.STRING;
+    }
+
+    protected static DatatypeFactory datatypeFactory;
+
+    protected static XMLGregorianCalendar getXMLGregorianCalendar(
+            Calendar calendar) {
+        if (calendar == null) {
+            return null;
+        }
+        if (datatypeFactory == null) {
+            try {
+                datatypeFactory = DatatypeFactory.newInstance();
+            } catch (DatatypeConfigurationException e) {
+                throw new java.lang.RuntimeException(e);
+            }
+        }
+        return datatypeFactory.newXMLGregorianCalendar((GregorianCalendar) calendar);
+    }
+
+}

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/ChemistryHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/ChemistryHelper.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/DiscoveryServicePortImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/DiscoveryServicePortImpl.java?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/DiscoveryServicePortImpl.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/DiscoveryServicePortImpl.java Thu Feb 25 17:41:17 2010
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ *
+ * Authors:
+ *     Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry.soap.server;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.jws.WebService;
+import javax.xml.bind.JAXBElement;
+import javax.xml.ws.Holder;
+import javax.xml.ws.WebServiceContext;
+
+import org.apache.chemistry.Inclusion;
+import org.apache.chemistry.ListPage;
+import org.apache.chemistry.ObjectEntry;
+import org.apache.chemistry.Paging;
+import org.apache.chemistry.RelationshipDirection;
+import org.apache.chemistry.Repository;
+import org.apache.chemistry.RepositoryManager;
+import org.apache.chemistry.SPI;
+import org.apache.chemistry.ws.CmisException;
+import org.apache.chemistry.ws.CmisExtensionType;
+import org.apache.chemistry.ws.CmisObjectListType;
+import org.apache.chemistry.ws.CmisObjectType;
+import org.apache.chemistry.ws.DiscoveryServicePort;
+import org.apache.chemistry.ws.EnumIncludeRelationships;
+import org.apache.chemistry.ws.Query;
+import org.apache.chemistry.ws.QueryResponse;
+
+@WebService(name = "DiscoveryServicePort", //
+targetNamespace = "http://docs.oasis-open.org/ns/cmis/ws/200908/", //
+serviceName = "DiscoveryService", //
+portName = "DiscoveryServicePort", //
+endpointInterface = "org.apache.chemistry.ws.DiscoveryServicePort")
+public class DiscoveryServicePortImpl implements DiscoveryServicePort {
+
+    @Resource
+    WebServiceContext wscontext;
+
+    public QueryResponse query(Query parameters) throws CmisException {
+        // repository
+        String repositoryId = parameters.getRepositoryId();
+        Repository repository = RepositoryManager.getInstance().getRepository(
+                repositoryId);
+        if (repository == null) {
+            return null; // TODO fault
+        }
+
+        // parameters
+        String statement = parameters.getStatement();
+        JAXBElement<Boolean> searchAllVersionsB = parameters.getSearchAllVersions();
+        boolean searchAllVersions = searchAllVersionsB == null ? false
+                : searchAllVersionsB.getValue().booleanValue();
+
+        JAXBElement<BigInteger> maxItemsBI = parameters.getMaxItems();
+        int maxItems = maxItemsBI == null || maxItemsBI.getValue() == null
+                || maxItemsBI.getValue().intValue() < 0 ? 0
+                : maxItemsBI.getValue().intValue();
+        JAXBElement<BigInteger> skipCountBI = parameters.getSkipCount();
+        int skipCount = skipCountBI == null || skipCountBI.getValue() == null
+                || skipCountBI.getValue().intValue() < 0 ? 0
+                : skipCountBI.getValue().intValue();
+        Paging paging = new Paging(maxItems, skipCount);
+
+        JAXBElement<Boolean> includeAllowableActions = parameters.getIncludeAllowableActions();
+        boolean allowableActions = includeAllowableActions == null
+                || includeAllowableActions.getValue() == null ? false
+                : includeAllowableActions.getValue().booleanValue();
+        JAXBElement<EnumIncludeRelationships> includeRelationships = parameters.getIncludeRelationships();
+        RelationshipDirection relationships = includeRelationships == null
+                || includeRelationships.getValue() == null ? null
+                : RelationshipDirection.fromInclusion(includeRelationships.getValue().name());
+        JAXBElement<String> renditionFilter = parameters.getRenditionFilter();
+        String renditions = renditionFilter == null
+                || renditionFilter.getValue() == null ? null
+                : renditionFilter.getValue();
+        Inclusion inclusion = new Inclusion(null, renditions, relationships,
+                allowableActions, false, false);
+
+        // response
+        QueryResponse response = new QueryResponse();
+        CmisObjectListType objects = new CmisObjectListType();
+        response.setObjects(objects);
+
+        Map<String, Serializable> params = CallContext.mapFromWebServiceContext(wscontext);
+        SPI spi = repository.getSPI(params);
+        try {
+            ListPage<ObjectEntry> res = spi.query(statement, searchAllVersions,
+                    inclusion, paging);
+            objects.setHasMoreItems(res.getHasMoreItems());
+            objects.setNumItems(BigInteger.valueOf(res.getNumItems()));
+            List<CmisObjectType> objectList = objects.getObjects();
+            for (ObjectEntry entry : res) {
+                CmisObjectType object = new CmisObjectType();
+                ChemistryHelper.chemistryToJAXB(entry, object);
+                objectList.add(object);
+            }
+        } finally {
+            spi.close();
+        }
+
+        return response;
+    }
+
+    public void getContentChanges(String repositoryId,
+            Holder<String> changeLogToken, Boolean includeProperties,
+            String filter, Boolean includePolicyIds, Boolean includeACL,
+            BigInteger maxItems, CmisExtensionType extension,
+            Holder<CmisObjectListType> objects) throws CmisException {
+        // TODO Auto-generated method stub
+        throw new UnsupportedOperationException();
+    }
+
+}

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/DiscoveryServicePortImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/DiscoveryServicePortImpl.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/RepositoryServicePortImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/RepositoryServicePortImpl.java?rev=916368&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/RepositoryServicePortImpl.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/RepositoryServicePortImpl.java Thu Feb 25 17:41:17 2010
@@ -0,0 +1,118 @@
+/*
+ * 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.
+ *
+ * Authors:
+ *     Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry.soap.server;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.jws.WebService;
+
+import org.apache.chemistry.Repository;
+import org.apache.chemistry.RepositoryCapabilities;
+import org.apache.chemistry.RepositoryEntry;
+import org.apache.chemistry.RepositoryInfo;
+import org.apache.chemistry.RepositoryManager;
+import org.apache.chemistry.ws.CmisException;
+import org.apache.chemistry.ws.CmisExtensionType;
+import org.apache.chemistry.ws.CmisRepositoryCapabilitiesType;
+import org.apache.chemistry.ws.CmisRepositoryEntryType;
+import org.apache.chemistry.ws.CmisRepositoryInfoType;
+import org.apache.chemistry.ws.CmisTypeContainer;
+import org.apache.chemistry.ws.CmisTypeDefinitionListType;
+import org.apache.chemistry.ws.CmisTypeDefinitionType;
+import org.apache.chemistry.ws.RepositoryServicePort;
+
+@WebService(name = "RepositoryServicePort", //
+targetNamespace = "http://docs.oasis-open.org/ns/cmis/ws/200908/", //
+serviceName = "RepositoryService", //
+portName = "RepositoryServicePort", //
+endpointInterface = "org.apache.chemistry.ws.RepositoryServicePort")
+public class RepositoryServicePortImpl implements RepositoryServicePort {
+
+    public List<CmisRepositoryEntryType> getRepositories(
+            CmisExtensionType extension) throws CmisException {
+        Collection<RepositoryEntry> repos = RepositoryManager.getInstance().getRepositories();
+        List<CmisRepositoryEntryType> entries = new ArrayList<CmisRepositoryEntryType>(
+                repos.size());
+        for (RepositoryEntry repo : repos) {
+            CmisRepositoryEntryType entry = new CmisRepositoryEntryType();
+            entry.setRepositoryId(repo.getId());
+            entry.setRepositoryName(repo.getName());
+            entries.add(entry);
+        }
+        return entries;
+    }
+
+    public CmisRepositoryInfoType getRepositoryInfo(String repositoryId,
+            CmisExtensionType extension) throws CmisException {
+        Repository repo = RepositoryManager.getInstance().getRepository(
+                repositoryId);
+        if (repo == null) {
+            return null; // TODO or fault?
+        }
+        RepositoryInfo info = repo.getInfo();
+        RepositoryCapabilities cap = info.getCapabilities();
+
+        CmisRepositoryInfoType repositoryInfo = new CmisRepositoryInfoType();
+        repositoryInfo.setRepositoryId(info.getId());
+        repositoryInfo.setRepositoryName(info.getName());
+        repositoryInfo.setRepositoryDescription(info.getDescription());
+        repositoryInfo.setVendorName(info.getVendorName());
+        repositoryInfo.setProductName(info.getProductName());
+        repositoryInfo.setProductVersion(info.getProductVersion());
+        repositoryInfo.setCmisVersionSupported(info.getVersionSupported());
+        repositoryInfo.setRootFolderId(info.getRootFolderId().getId());
+
+        CmisRepositoryCapabilitiesType capabilities = new CmisRepositoryCapabilitiesType();
+        repositoryInfo.setCapabilities(capabilities);
+        capabilities.setCapabilityMultifiling(cap.hasMultifiling());
+        capabilities.setCapabilityUnfiling(cap.hasUnfiling());
+        capabilities.setCapabilityVersionSpecificFiling(cap.hasVersionSpecificFiling());
+        capabilities.setCapabilityPWCUpdatable(cap.isPWCUpdatable());
+        capabilities.setCapabilityPWCSearchable(cap.isPWCSearchable());
+        capabilities.setCapabilityAllVersionsSearchable(cap.isAllVersionsSearchable());
+        capabilities.setCapabilityQuery(ChemistryHelper.chemistryToJAXB(cap.getQueryCapability()));
+        capabilities.setCapabilityJoin(ChemistryHelper.chemistryToJAXB(cap.getJoinCapability()));
+
+        return repositoryInfo;
+    }
+
+    public CmisTypeDefinitionType getTypeDefinition(String repositoryId,
+            String typeId, CmisExtensionType extension) throws CmisException {
+        // TODO Auto-generated method stub
+        throw new UnsupportedOperationException();
+    }
+
+    public CmisTypeDefinitionListType getTypeChildren(String repositoryId,
+            String typeId, Boolean includePropertyDefinitions,
+            BigInteger maxItems, BigInteger skipCount,
+            CmisExtensionType extension) throws CmisException {
+        // TODO Auto-generated method stub
+        throw new UnsupportedOperationException();
+    }
+
+    public List<CmisTypeContainer> getTypeDescendants(String repositoryId,
+            String typeId, BigInteger depth,
+            Boolean includePropertyDefinitions, CmisExtensionType extension)
+            throws CmisException {
+        // TODO Auto-generated method stub
+        throw new UnsupportedOperationException();
+    }
+
+}

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/RepositoryServicePortImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-soap-server/src/main/java/org/apache/chemistry/soap/server/RepositoryServicePortImpl.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: incubator/chemistry/trunk/chemistry/chemistry-ws/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-ws/pom.xml?rev=916368&r1=916367&r2=916368&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-ws/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-ws/pom.xml Thu Feb 25 17:41:17 2010
@@ -32,22 +32,18 @@
     <dependency>
       <groupId>javax.xml.bind</groupId>
       <artifactId>jaxb-api</artifactId>
-      <version>2.1</version>
       <!--scope>runtime</scope-->
     </dependency>
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-jaxws_2.1_spec</artifactId>
-      <version>1.0</version>
       <!--scope>runtime</scope-->
     </dependency>
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
-      <version>1.1.2</version>
       <!--scope>runtime</scope-->
     </dependency>
-
   </dependencies>
 
   <build>

Modified: incubator/chemistry/trunk/chemistry/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/pom.xml?rev=916368&r1=916367&r2=916368&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/pom.xml Thu Feb 25 17:41:17 2010
@@ -38,6 +38,7 @@
     <module>chemistry-atompub-server</module>
     <module>chemistry-atompub-client</module>
     <module>chemistry-ws</module>
+    <module>chemistry-soap-server</module>
     <module>chemistry-jcr</module>
     <module>chemistry-tck-atompub</module>
     <module>chemistry-shell</module>