You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2007/05/03 09:49:46 UTC

svn commit: r534745 - /incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/

Author: jsdelfino
Date: Thu May  3 00:49:45 2007
New Revision: 534745

URL: http://svn.apache.org/viewvc?view=rev&rev=534745
Log:
Added a factory for the CRUD implementation.

Added:
    incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationFactory.java   (with props)
    incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationImpl.java   (with props)
    incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/DefaultCRUDImplementationFactory.java   (with props)
Modified:
    incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementation.java
    incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProcessor.java
    incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProvider.java
    incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDModuleActivator.java

Modified: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementation.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementation.java?view=diff&rev=534745&r1=534744&r2=534745
==============================================================================
--- incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementation.java (original)
+++ incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementation.java Thu May  3 00:49:45 2007
@@ -18,22 +18,7 @@
  */
 package crud;
 
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.tuscany.assembly.AssemblyFactory;
-import org.apache.tuscany.assembly.ConstrainingType;
 import org.apache.tuscany.assembly.Implementation;
-import org.apache.tuscany.assembly.Property;
-import org.apache.tuscany.assembly.Reference;
-import org.apache.tuscany.assembly.Service;
-import org.apache.tuscany.interfacedef.InvalidInterfaceException;
-import org.apache.tuscany.interfacedef.java.JavaFactory;
-import org.apache.tuscany.interfacedef.java.JavaInterface;
-import org.apache.tuscany.interfacedef.java.JavaInterfaceContract;
-import org.apache.tuscany.interfacedef.java.introspect.JavaInterfaceIntrospector;
-import org.apache.tuscany.policy.Intent;
-import org.apache.tuscany.policy.PolicySet;
 
 /**
  * The model representing a sample CRUD implementation in an SCA assembly model.
@@ -47,106 +32,20 @@
  * @version $$Rev$$ $$Date: 2007-04-23 19:18:54 -0700 (Mon, 23 Apr
  *          2007) $$
  */
-public class CRUDImplementation implements Implementation {
-
-    private Service crudService;
-    private String directory;
-
-    /**
-     * Constructs a new CRUD implementation.
-     */
-    public CRUDImplementation(AssemblyFactory assemblyFactory,
-                              JavaFactory javaFactory,
-                              JavaInterfaceIntrospector introspector) {
-
-        // CRUD implementation always provide a single service exposing
-        // the CRUD interface, and have no references and properties
-        crudService = assemblyFactory.createService();
-        crudService.setName("CRUD");
-        JavaInterface javaInterface;
-        try {
-            javaInterface = introspector.introspect(CRUD.class);
-        } catch (InvalidInterfaceException e) {
-            throw new IllegalArgumentException(e);
-        }
-        JavaInterfaceContract interfaceContract = javaFactory.createJavaInterfaceContract();
-        interfaceContract.setInterface(javaInterface);
-        crudService.setInterfaceContract(interfaceContract);
-    }
+public interface CRUDImplementation extends Implementation {
 
     /**
      * Returns the directory used by CRUD implementations to persist resources.
      * 
      * @return the directory used to persist resources
      */
-    public String getDirectory() {
-        return directory;
-    }
+    public String getDirectory();
 
     /**
      * Sets the directory used by CRUD implementations to persist resources.
      * 
      * @param directory the directory used to persist resources
      */
-    public void setDirectory(String directory) {
-        this.directory = directory;
-    }
-
-    public ConstrainingType getConstrainingType() {
-        // CRUD implementations do not support constrainingTypes
-        return null;
-    }
-
-    public List<Property> getProperties() {
-        // CRUD implementations do not support properties
-        return Collections.emptyList();
-    }
-
-    public List<Service> getServices() {
-        // CRUD implementations provide a single fixed CRUD service
-        return Collections.singletonList(crudService);
-    }
-    
-    public List<Reference> getReferences() {
-        // CRUD implementations do not support properties
-        return Collections.emptyList();
-    }
-
-    public String getURI() {
-        // CRUD implementations don't have a URI
-        return null;
-    }
-
-    public void setConstrainingType(ConstrainingType constrainingType) {
-        // CRUD implementations do not support constrainingTypes
-    }
-
-    public void setURI(String uri) {
-        // CRUD implementations don't have a URI
-    }
-
-    public List<PolicySet> getPolicySets() {
-        // CRUD implementations do not support policy sets
-        return Collections.emptyList();
-    }
-
-    public List<Intent> getRequiredIntents() {
-        // CRUD implementations do not support intents
-        return Collections.emptyList();
-    }
-
-    public List<Object> getExtensions() {
-        // CRUD implementations do not support extensions
-        return Collections.emptyList();
-    }
-
-    public boolean isUnresolved() {
-        // CRUD implementations are always resolved
-        return false;
-    }
-
-    public void setUnresolved(boolean unresolved) {
-        // CRUD implementations are always resolved
-    }
+    public void setDirectory(String directory);
 
 }

Added: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationFactory.java?view=auto&rev=534745
==============================================================================
--- incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationFactory.java (added)
+++ incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationFactory.java Thu May  3 00:49:45 2007
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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 crud;
+
+/**
+ * A factory for the sample CRUD implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface CRUDImplementationFactory {
+    
+    /**
+     * Creates a new CRUD implementation.
+     * 
+     * @return
+     */
+    CRUDImplementation createCRUDImplementation();
+
+}

Propchange: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationImpl.java?view=auto&rev=534745
==============================================================================
--- incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationImpl.java (added)
+++ incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationImpl.java Thu May  3 00:49:45 2007
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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 crud;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tuscany.assembly.AssemblyFactory;
+import org.apache.tuscany.assembly.ConstrainingType;
+import org.apache.tuscany.assembly.Property;
+import org.apache.tuscany.assembly.Reference;
+import org.apache.tuscany.assembly.Service;
+import org.apache.tuscany.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.interfacedef.java.JavaFactory;
+import org.apache.tuscany.interfacedef.java.JavaInterface;
+import org.apache.tuscany.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.interfacedef.java.introspect.JavaInterfaceIntrospector;
+import org.apache.tuscany.policy.Intent;
+import org.apache.tuscany.policy.PolicySet;
+
+/**
+ * The model representing a sample CRUD implementation in an SCA assembly model.
+ * 
+ * @version $$Rev$$ $$Date: 2007-04-23 19:18:54 -0700 (Mon, 23 Apr
+ *          2007) $$
+ */
+public class CRUDImplementationImpl implements CRUDImplementation {
+
+    private Service crudService;
+    private String directory;
+
+    /**
+     * Constructs a new CRUD implementation.
+     */
+    public CRUDImplementationImpl(AssemblyFactory assemblyFactory,
+                              JavaFactory javaFactory,
+                              JavaInterfaceIntrospector introspector) {
+
+        // CRUD implementation always provide a single service exposing
+        // the CRUD interface, and have no references and properties
+        crudService = assemblyFactory.createService();
+        crudService.setName("CRUD");
+        JavaInterface javaInterface;
+        try {
+            javaInterface = introspector.introspect(CRUD.class);
+        } catch (InvalidInterfaceException e) {
+            throw new IllegalArgumentException(e);
+        }
+        JavaInterfaceContract interfaceContract = javaFactory.createJavaInterfaceContract();
+        interfaceContract.setInterface(javaInterface);
+        crudService.setInterfaceContract(interfaceContract);
+    }
+
+    public String getDirectory() {
+        return directory;
+    }
+
+    public void setDirectory(String directory) {
+        this.directory = directory;
+    }
+
+    public ConstrainingType getConstrainingType() {
+        // The sample CRUD implementation does not support constrainingTypes
+        return null;
+    }
+
+    public List<Property> getProperties() {
+        // The sample CRUD implementation does not support properties
+        return Collections.emptyList();
+    }
+
+    public List<Service> getServices() {
+        // The sample CRUD implementation provides a single fixed CRUD service
+        return Collections.singletonList(crudService);
+    }
+    
+    public List<Reference> getReferences() {
+        // The sample CRUD implementation does not support properties
+        return Collections.emptyList();
+    }
+
+    public String getURI() {
+        // The sample CRUD implementation does not have a URI
+        return null;
+    }
+
+    public void setConstrainingType(ConstrainingType constrainingType) {
+        // The sample CRUD implementation does not support constrainingTypes
+    }
+
+    public void setURI(String uri) {
+        // The sample CRUD implementation does not have a URI
+    }
+
+    public List<PolicySet> getPolicySets() {
+        // The sample CRUD implementation does not support policy sets
+        return Collections.emptyList();
+    }
+
+    public List<Intent> getRequiredIntents() {
+        // The sample CRUD implementation does not support intents
+        return Collections.emptyList();
+    }
+
+    public List<Object> getExtensions() {
+        // The sample CRUD implementation does not support extensions
+        return Collections.emptyList();
+    }
+
+    public boolean isUnresolved() {
+        // The sample CRUD implementation is always resolved
+        return false;
+    }
+
+    public void setUnresolved(boolean unresolved) {
+        // The sample CRUD implementation is always resolved
+    }
+
+}

Propchange: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProcessor.java?view=diff&rev=534745&r1=534744&r2=534745
==============================================================================
--- incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProcessor.java (original)
+++ incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProcessor.java Thu May  3 00:49:45 2007
@@ -25,14 +25,11 @@
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.tuscany.assembly.AssemblyFactory;
 import org.apache.tuscany.contribution.processor.StAXArtifactProcessor;
 import org.apache.tuscany.contribution.resolver.ArtifactResolver;
 import org.apache.tuscany.contribution.service.ContributionReadException;
 import org.apache.tuscany.contribution.service.ContributionResolveException;
 import org.apache.tuscany.contribution.service.ContributionWriteException;
-import org.apache.tuscany.interfacedef.java.JavaFactory;
-import org.apache.tuscany.interfacedef.java.introspect.JavaInterfaceIntrospector;
 
 /**
  * Implements a STAX artifact processor for CRUD implementations.
@@ -47,14 +44,10 @@
 public class CRUDImplementationProcessor implements StAXArtifactProcessor<CRUDImplementation> {
     private static final QName IMPLEMENTATION_CRUD = new QName("http://crud", "implementation.crud");
     
-    private AssemblyFactory assemblyFactory;
-    private JavaFactory javaFactory;
-    private JavaInterfaceIntrospector introspector;
+    private CRUDImplementationFactory crudFactory;
     
-    public CRUDImplementationProcessor(AssemblyFactory assemblyFactory, JavaFactory javaFactory, JavaInterfaceIntrospector introspector) {
-        this.assemblyFactory = assemblyFactory;
-        this.javaFactory = javaFactory;
-        this.introspector = introspector;
+    public CRUDImplementationProcessor(CRUDImplementationFactory crudFactory) {
+        this.crudFactory = crudFactory;
     }
 
     public QName getArtifactType() {
@@ -77,7 +70,7 @@
             String directory = reader.getAttributeValue(null, "directory");
 
             // Create an initialize the CRUD implementation model
-            CRUDImplementation implementation = new CRUDImplementationProvider(assemblyFactory, javaFactory, introspector);
+            CRUDImplementation implementation = crudFactory.createCRUDImplementation();
             implementation.setDirectory(directory);
             
             // Skip to end element

Modified: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProvider.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProvider.java?view=diff&rev=534745&r1=534744&r2=534745
==============================================================================
--- incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProvider.java (original)
+++ incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDImplementationProvider.java Thu May  3 00:49:45 2007
@@ -41,7 +41,7 @@
  * @version $$Rev$$ $$Date: 2007-04-23 19:18:54 -0700 (Mon, 23 Apr
  *          2007) $$
  */
-public class CRUDImplementationProvider extends CRUDImplementation implements ImplementationProvider,
+public class CRUDImplementationProvider extends CRUDImplementationImpl implements ImplementationProvider,
     ImplementationActivator {
 
     /**

Modified: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDModuleActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDModuleActivator.java?view=diff&rev=534745&r1=534744&r2=534745
==============================================================================
--- incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDModuleActivator.java (original)
+++ incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/CRUDModuleActivator.java Thu May  3 00:49:45 2007
@@ -22,10 +22,10 @@
 import java.util.Map;
 
 import org.apache.tuscany.assembly.AssemblyFactory;
-import org.apache.tuscany.assembly.impl.DefaultAssemblyFactory;
 import org.apache.tuscany.contribution.processor.StAXArtifactProcessorExtensionPoint;
 import org.apache.tuscany.core.ExtensionPointRegistry;
 import org.apache.tuscany.core.ModuleActivator;
+import org.apache.tuscany.core.runtime.RuntimeAssemblyFactory;
 import org.apache.tuscany.interfacedef.java.JavaFactory;
 import org.apache.tuscany.interfacedef.java.impl.DefaultJavaFactory;
 import org.apache.tuscany.interfacedef.java.introspect.JavaInterfaceIntrospectorExtensionPoint;
@@ -42,42 +42,31 @@
 
     private CRUDImplementationProcessor implementationArtifactProcessor;
 
-    public void start(ExtensionPointRegistry registry) {
-
-        // Add the CRUD implementation extension to the StAXArtifactProcessor
-        // extension point
-        StAXArtifactProcessorExtensionPoint artifactProcessors = registry
-            .getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
-
-        // FIXME: How to pass the assembly factory from the core to extensions?
-        AssemblyFactory assemblyFactory = registry.getExtensionPoint(AssemblyFactory.class);
-        if (assemblyFactory == null) {
-            assemblyFactory = new DefaultAssemblyFactory();
-        }
-
-        JavaFactory javaFactory = registry.getExtensionPoint(JavaFactory.class);
-        if (javaFactory == null) {
-            javaFactory = new DefaultJavaFactory();
-        }
-
-        JavaInterfaceIntrospectorExtensionPoint introspectorExtensionPoint = registry
-            .getExtensionPoint(JavaInterfaceIntrospectorExtensionPoint.class);
-        implementationArtifactProcessor = new CRUDImplementationProcessor(assemblyFactory, javaFactory,
-                                                                          introspectorExtensionPoint);
-        artifactProcessors.addExtension(implementationArtifactProcessor);
-    }
-
     public Map<Class, Object> getExtensionPoints() {
         // This module extension does not contribute any new
         // extension point
         return null;
     }
 
+    public void start(ExtensionPointRegistry registry) {
+
+        // Create the CRUD implementation factory
+        AssemblyFactory assemblyFactory = new RuntimeAssemblyFactory();
+        JavaFactory javaFactory = new DefaultJavaFactory();
+        JavaInterfaceIntrospectorExtensionPoint introspector = registry.getExtensionPoint(JavaInterfaceIntrospectorExtensionPoint.class);
+        CRUDImplementationFactory crudFactory = new DefaultCRUDImplementationFactory(assemblyFactory, javaFactory, introspector);
+
+        // Add the CRUD implementation extension to the StAXArtifactProcessor
+        // extension point
+        StAXArtifactProcessorExtensionPoint processors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+        implementationArtifactProcessor = new CRUDImplementationProcessor(crudFactory);
+        processors.addExtension(implementationArtifactProcessor);
+    }
+
     public void stop(ExtensionPointRegistry registry) {
 
         // Remove the contributed extensions
-        StAXArtifactProcessorExtensionPoint artifactProcessors = registry
-            .getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
-        artifactProcessors.removeExtension(implementationArtifactProcessor);
+        StAXArtifactProcessorExtensionPoint processors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+        processors.removeExtension(implementationArtifactProcessor);
     }
 }

Added: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/DefaultCRUDImplementationFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/DefaultCRUDImplementationFactory.java?view=auto&rev=534745
==============================================================================
--- incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/DefaultCRUDImplementationFactory.java (added)
+++ incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/DefaultCRUDImplementationFactory.java Thu May  3 00:49:45 2007
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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 crud;
+
+import org.apache.tuscany.assembly.AssemblyFactory;
+import org.apache.tuscany.interfacedef.java.JavaFactory;
+import org.apache.tuscany.interfacedef.java.introspect.JavaInterfaceIntrospector;
+
+/**
+ * A default factory for the CRUD implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultCRUDImplementationFactory implements CRUDImplementationFactory {
+    
+    private AssemblyFactory assemblyFactory;
+    private JavaFactory javaFactory;
+    private JavaInterfaceIntrospector introspector;
+    
+    public DefaultCRUDImplementationFactory(AssemblyFactory assemblyFactory,
+                                            JavaFactory javaFactory,
+                                            JavaInterfaceIntrospector introspector) {
+        this.assemblyFactory = assemblyFactory;
+        this.javaFactory = javaFactory;
+        this.introspector = introspector;
+    }
+
+    public CRUDImplementation createCRUDImplementation() {
+        return new CRUDImplementationProvider(assemblyFactory, javaFactory, introspector);
+    }
+
+}

Propchange: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/DefaultCRUDImplementationFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/samples/implementation-crud/src/main/java/crud/DefaultCRUDImplementationFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org