Diff
Added: trunk/servicemix-jsr181/maven.xml (885 => 886)
--- trunk/servicemix-jsr181/maven.xml 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/maven.xml 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<project default="default"
+ xmlns:ant="jelly:ant">
+
+ <goal name="default" prereqs="clean, jbi:install"/>
+
+ <goal name="nightly" prereqs="clean, jbi:install, jbi:deploy"/>
+
+</project>
Added: trunk/servicemix-jsr181/project.properties (885 => 886)
--- trunk/servicemix-jsr181/project.properties 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/project.properties 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,6 @@
+jbi.component.class.name = org.servicemix.jsr181.Jsr181Component
+jbi.bootstrap.class.name = org.servicemix.jsr181.Jsr181Bootstrap
+jbi.component.type=service-engine
+
+org.apache.commons.attributes.enable=true
+org.apache.commons.attributes.index.enable=true
Added: trunk/servicemix-jsr181/project.xml (885 => 886)
--- trunk/servicemix-jsr181/project.xml 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/project.xml 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE project>
+<project>
+ <pomVersion>3</pomVersion>
+ <extend>${basedir}/../etc/project.xml</extend>
+
+ <name>ServiceMix :: JSR-181 Service Engine</name>
+ <id>servicemix-jsr181</id>
+ <shortDescription>JSR-181 service engine</shortDescription>
+ <description>JSR-181 service engine</description>
+
+ <package>org.servicemix.jsr181</package>
+ <packageGroups>
+ <packageGroup>
+ <title>JSR-181 service engine</title>
+ <packages>org.servicemix.jsr181</packages>
+ </packageGroup>
+ </packageGroups>
+
+ <!-- ============ -->
+ <!-- Dependencies -->
+ <!-- ============ -->
+ <dependencies>
+
+ <!-- JBI bundled dependencies -->
+ <dependency>
+ <groupId>servicemix</groupId>
+ <artifactId>servicemix-common</artifactId>
+ <version>${pom.currentVersion}</version>
+ <properties>
+ <eclipse.dependency>true</eclipse.dependency>
+ <jbi.bundle>true</jbi.bundle>
+ <jbi.bootstrap>true</jbi.bootstrap>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>${commons_logging_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ <jbi.bootstrap>true</jbi.bootstrap>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>backport-util-concurrent</groupId>
+ <artifactId>backport-util-concurrent</artifactId>
+ <version>${backport_util_concurrent_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>wsdl4j</groupId>
+ <artifactId>wsdl4j</artifactId>
+ <version>${wsdl4j_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>xfire</groupId>
+ <artifactId>xfire-all</artifactId>
+ <version>${xfire_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>stax</groupId>
+ <artifactId>stax-api</artifactId>
+ <version>${stax_api_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>jdom</groupId>
+ <artifactId>jdom</artifactId>
+ <version>${jdom_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>org.xbean</groupId>
+ <artifactId>xbean-spring</artifactId>
+ <version>${xbean_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>org.xbean</groupId>
+ <artifactId>xbean-server</artifactId>
+ <version>${xbean_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>org.xbean</groupId>
+ <artifactId>xbean-kernel</artifactId>
+ <version>${xbean_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>springframework</groupId>
+ <artifactId>spring</artifactId>
+ <version>${spring_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>woodstox</groupId>
+ <artifactId>wstx-asl</artifactId>
+ <version>${woodstox_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>xmlbeans</groupId>
+ <artifactId>xbean</artifactId>
+ <version>${xmlbeans_version}</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+
+ <!-- Commons attribute -->
+ <dependency>
+ <groupId>commons-attributes</groupId>
+ <artifactId>commons-attributes-api</artifactId>
+ <version>2.1</version>
+ <url>http://jakarta.apache.org/commons/attributes/</url>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>commons-attributes</groupId>
+ <artifactId>commons-attributes-plugin</artifactId>
+ <version>2.1</version>
+ <type>plugin</type>
+ <url>http://jakarta.apache.org/commons/attributes/</url>
+ </dependency>
+
+ <!-- Backport 175 -->
+ <dependency>
+ <groupId>backport175</groupId>
+ <artifactId>backport175</artifactId>
+ <version>1.0.RC1</version>
+ <url>http://backport175.codehaus.org</url>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+
+ <!-- JAXB -->
+ <dependency>
+ <groupId>xfire</groupId>
+ <artifactId>jaxb-api</artifactId>
+ <version>20051114</version>
+ <properties>
+ <jbi.bundle>true</jbi.bundle>
+ </properties>
+ </dependency>
+
+ <!-- Provided dependencies -->
+ <dependency>
+ <groupId>geronimo-spec</groupId>
+ <artifactId>geronimo-spec-j2ee-connector</artifactId>
+ <version>${geronimo_spec_j2ee_connector_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>geronimo-spec</groupId>
+ <artifactId>geronimo-spec-jta</artifactId>
+ <version>${geronimo_spec_jta_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>servicemix</groupId>
+ <artifactId>servicemix-jbi</artifactId>
+ <version>${pom.currentVersion}</version>
+ <properties>
+ <eclipse.dependency>true</eclipse.dependency>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>mx4j</groupId>
+ <artifactId>mx4j</artifactId>
+ <version>${mx4j_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>mx4j</groupId>
+ <artifactId>mx4j-remote</artifactId>
+ <version>${mx4j_version}</version>
+ </dependency>
+
+
+ <!-- Testing only -->
+ <dependency>
+ <groupId>servicemix</groupId>
+ <artifactId>servicemix-core</artifactId>
+ <version>${pom.currentVersion}</version>
+ <properties>
+ <eclipse.dependency>true</eclipse.dependency>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>servicemix</groupId>
+ <artifactId>servicemix-components</artifactId>
+ <version>${pom.currentVersion}</version>
+ <properties>
+ <eclipse.dependency>true</eclipse.dependency>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>springframework</groupId>
+ <artifactId>spring</artifactId>
+ <version>${spring_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>activemq</groupId>
+ <artifactId>activemq</artifactId>
+ <version>${activemq_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>jencks</groupId>
+ <artifactId>jencks-all</artifactId>
+ <version>${jencks_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>concurrent</groupId>
+ <artifactId>concurrent</artifactId>
+ <version>${concurrent_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ <version>${commons_beanutils_version}</version>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>${log4j_version}</version>
+ </dependency>
+
+ </dependencies>
+
+</project>
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Bootstrap.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Bootstrap.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Bootstrap.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,54 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181;
+
+import org.servicemix.common.BaseBootstrap;
+
+public class Jsr181Bootstrap extends BaseBootstrap {
+
+ private Jsr181Configuration configuration;
+
+ public Jsr181Bootstrap() {
+ configuration = new Jsr181Configuration();
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseBootstrap#getExtensionMBean()
+ */
+ protected Object getExtensionMBean() throws Exception {
+ return configuration;
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseBootstrap#doInit()
+ */
+ protected void doInit() throws Exception {
+ super.doInit();
+ configuration.setRootDir(this.context.getContext().getWorkspaceRoot());
+ configuration.load();
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseBootstrap#doOnInstall()
+ */
+ protected void doOnInstall() throws Exception {
+ super.doOnInstall();
+ configuration.save();
+ }
+
+}
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Component.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Component.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Component.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,46 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181;
+
+import org.servicemix.common.BaseComponent;
+import org.servicemix.common.BaseLifeCycle;
+import org.servicemix.common.BaseServiceUnitManager;
+import org.servicemix.common.Deployer;
+
+/**
+ * @author gnodet
+ *
+ */
+public class Jsr181Component extends BaseComponent {
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseComponent#createLifeCycle()
+ */
+ protected BaseLifeCycle createLifeCycle() {
+ return new Jsr181LifeCycle(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseComponent#createServiceUnitManager()
+ */
+ public BaseServiceUnitManager createServiceUnitManager() {
+ Deployer[] deployers = new Deployer[] { new Jsr181XBeanDeployer(this) };
+ return new BaseServiceUnitManager(this, deployers);
+ }
+
+}
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Configuration.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Configuration.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Configuration.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,63 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181;
+
+import org.servicemix.common.PersistentConfiguration;
+
+
+public class Jsr181Configuration extends PersistentConfiguration implements Jsr181ConfigurationMBean {
+
+ public static final String WEBANNOTATIONSCLASS_PROPERTY = "webAnnotationsClass";
+ public static final String WEBANNOTATIONSCLASS_DEFAULT = "org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations";
+ public static final String TYPEMAPPINGREGISTRYCLASS_PROPERTY = "typeMappingRegistryClass";
+ public static final String TYPEMAPPINGREGISTRYCLASS_DEFAULT = "org.codehaus.xfire.jaxb2.JaxbTypeRegistry";
+
+ public Jsr181Configuration() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.jsr181.Jsr181ConfigurationMBean#getTypeMappingRegistryClass()
+ */
+ public String getTypeMappingRegistryClass() {
+ return properties.getProperty(TYPEMAPPINGREGISTRYCLASS_PROPERTY, TYPEMAPPINGREGISTRYCLASS_DEFAULT);
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.jsr181.Jsr181ConfigurationMBean#setTypeMappingRegistryClass(java.lang.String)
+ */
+ public void setTypeMappingRegistryClass(String typeMappingRegistryClass) {
+ this.properties.put(TYPEMAPPINGREGISTRYCLASS_PROPERTY, typeMappingRegistryClass);
+ save();
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.jsr181.Jsr181ConfigurationMBean#getWebAnnotationsClass()
+ */
+ public String getWebAnnotationsClass() {
+ return properties.getProperty(WEBANNOTATIONSCLASS_PROPERTY, WEBANNOTATIONSCLASS_DEFAULT);
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.jsr181.Jsr181ConfigurationMBean#setWebAnnotationsClass(java.lang.String)
+ */
+ public void setWebAnnotationsClass(String webAnnotationsClass) {
+ this.properties.put(WEBANNOTATIONSCLASS_PROPERTY, webAnnotationsClass);
+ save();
+ }
+
+}
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181ConfigurationMBean.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181ConfigurationMBean.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181ConfigurationMBean.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,41 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181;
+
+public interface Jsr181ConfigurationMBean {
+
+ /**
+ * @return Returns the typeMappingRegistryClass.
+ */
+ String getTypeMappingRegistryClass();
+
+ /**
+ * @param typeMappingRegistryClass The typeMappingRegistryClass to set.
+ */
+ void setTypeMappingRegistryClass(String typeMappingRegistryClass);
+
+ /**
+ * @return Returns the webAnnotationsClass.
+ */
+ String getWebAnnotationsClass();
+
+ /**
+ * @param webAnnotationsClass The webAnnotationsClass to set.
+ */
+ void setWebAnnotationsClass(String webAnnotationsClass);
+}
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Endpoint.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Endpoint.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181Endpoint.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,162 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181;
+
+import org.apache.commons.logging.Log;
+import org.codehaus.xfire.XFire;
+import org.codehaus.xfire.service.Service;
+import org.codehaus.xfire.service.ServiceFactory;
+import org.codehaus.xfire.transport.Transport;
+import org.servicemix.common.Endpoint;
+import org.servicemix.jsr181.xfire.JbiTransport;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import javax.jbi.component.ComponentContext;
+import javax.jbi.messaging.MessageExchange.Role;
+import javax.jbi.servicedesc.ServiceEndpoint;
+import javax.wsdl.Definition;
+import javax.wsdl.Port;
+import javax.wsdl.WSDLException;
+import javax.wsdl.factory.WSDLFactory;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+public class Jsr181Endpoint extends Endpoint {
+
+ protected Object pojo;
+ protected ServiceEndpoint activated;
+ protected Service xfireService;
+ protected Log logger;
+
+ /**
+ * @return Returns the pojo.
+ */
+ public Object getPojo() {
+ return pojo;
+ }
+
+ /**
+ * @param pojo The pojo to set.
+ */
+ public void setPojo(Object pojo) {
+ this.pojo = pojo;
+ }
+
+ /**
+ * @return Returns the xfireService.
+ */
+ public Service getXFireService() {
+ return xfireService;
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.Endpoint#getRole()
+ */
+ public Role getRole() {
+ return Role.PROVIDER;
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.Endpoint#activate()
+ */
+ public void activate() throws Exception {
+ logger = this.serviceUnit.getComponent().getLogger();
+ ComponentContext ctx = this.serviceUnit.getComponent().getComponentContext();
+ activated = ctx.activateEndpoint(service, endpoint);
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.Endpoint#deactivate()
+ */
+ public void deactivate() throws Exception {
+ ServiceEndpoint ep = activated;
+ activated = null;
+ ComponentContext ctx = this.serviceUnit.getComponent().getComponentContext();
+ ctx.deactivateEndpoint(ep);
+ }
+
+
+ public void registerService() throws SAXException, IOException, ParserConfigurationException, WSDLException {
+ XFire xfire = getXFire();
+ ServiceFactory factory = getServiceFactory();
+ xfireService = factory.create(getPojo().getClass());
+ xfire.getServiceRegistry().register(xfireService);
+ xfire.getTransportManager().disableAll(xfireService.getName());
+ Transport jbiT = xfire.getTransportManager().getTransport(JbiTransport.JBI_BINDING);
+ xfire.getTransportManager().enable(jbiT, xfireService.getName());
+ this.description = generateWsdl();
+
+ // Check service name and endpoint name
+ QName serviceName = xfireService.getServiceInfo().getName();
+ String endpointName = null;
+ if (service == null) {
+ service = serviceName;
+ } else if (!service.equals(serviceName)) {
+ logger.warn("The service name defined in the wsdl (" + serviceName +
+ ") does not match the service name defined in the endpoint spec (" + service +
+ "). WSDL description may be unusable.");
+ }
+ Definition d = WSDLFactory.newInstance().newWSDLReader().readWSDL(null, description);
+ javax.wsdl.Service service = d.getService(serviceName);
+ if (service != null) {
+ if (service.getPorts().values().size() == 1) {
+ endpointName = ((Port) service.getPorts().values().iterator().next()).getName();
+ // Check if this is the same as defined in endpoint spec
+ if (endpoint == null) {
+ endpoint = endpointName;
+ } else if (!endpoint.equals(endpointName)) {
+ logger.warn("The endpoint name defined in the wsdl (" + endpointName +
+ ") does not match the endpoint name defined in the endpoint spec (" + endpoint +
+ "). WSDL description may be unusable.");
+ }
+ }
+ }
+ if (endpoint == null) {
+ throw new IllegalArgumentException("endpoint name should be provided");
+ }
+ }
+
+ protected Document generateWsdl() throws SAXException, IOException, ParserConfigurationException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ getXFire().generateWSDL(xfireService.getName(), baos);
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(baos.toByteArray()));
+ return doc;
+ }
+
+ protected XFire getXFire() {
+ Jsr181LifeCycle jsr181LifeCycle = (Jsr181LifeCycle) this.serviceUnit.getComponent().getLifeCycle();
+ XFire xfire = jsr181LifeCycle.getXFire();
+ return xfire;
+ }
+
+ protected ServiceFactory getServiceFactory() {
+ Jsr181LifeCycle jsr181LifeCycle = (Jsr181LifeCycle) this.serviceUnit.getComponent().getLifeCycle();
+ ServiceFactory factory = jsr181LifeCycle.getFactory();
+ return factory;
+ }
+
+}
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181LifeCycle.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181LifeCycle.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181LifeCycle.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,167 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181;
+
+import org.codehaus.xfire.MessageContext;
+import org.codehaus.xfire.XFire;
+import org.codehaus.xfire.XFireFactory;
+import org.codehaus.xfire.aegis.AegisBindingProvider;
+import org.codehaus.xfire.aegis.type.TypeMappingRegistry;
+import org.codehaus.xfire.annotations.AnnotationServiceFactory;
+import org.codehaus.xfire.annotations.WebAnnotations;
+import org.codehaus.xfire.exchange.InMessage;
+import org.codehaus.xfire.service.Service;
+import org.codehaus.xfire.service.ServiceFactory;
+import org.codehaus.xfire.transport.Channel;
+import org.codehaus.xfire.transport.Transport;
+import org.servicemix.common.BaseLifeCycle;
+import org.servicemix.common.Endpoint;
+import org.servicemix.jbi.jaxp.BytesSource;
+import org.servicemix.jsr181.xfire.JbiTransport;
+
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.InOptionalOut;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+public class Jsr181LifeCycle extends BaseLifeCycle {
+
+ protected Jsr181Configuration configuration;
+ protected XFire xfire;
+ protected ServiceFactory factory;
+
+ public Jsr181LifeCycle(Jsr181Component component) {
+ super(component);
+ configuration = new Jsr181Configuration();
+ }
+
+ /**
+ * @return Returns the factory.
+ */
+ public ServiceFactory getFactory() {
+ return factory;
+ }
+
+ /**
+ * @return Returns the xfire.
+ */
+ public XFire getXFire() {
+ return xfire;
+ }
+
+ /**
+ * @return Returns the configuration.
+ */
+ public Jsr181Configuration getConfiguration() {
+ return configuration;
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseBootstrap#getExtensionMBean()
+ */
+ protected Object getExtensionMBean() throws Exception {
+ return configuration;
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseLifeCycle#processProviderExchange(org.servicemix.common.Endpoint, javax.jbi.messaging.MessageExchange)
+ */
+ protected void processProviderExchange(Endpoint ep, MessageExchange exchange) throws Exception {
+ // TODO: fault should not be serialized as soap
+ // TODO: clean this code
+ Service service = ((Jsr181Endpoint) ep).getXFireService();
+ Transport t = xfire.getTransportManager().getTransport(JbiTransport.JBI_BINDING);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ Channel c = t.createChannel();
+ MessageContext ctx = new MessageContext();
+ ctx.setXFire(xfire);
+ ctx.setService(service);
+ ctx.setProperty(Channel.BACKCHANNEL_URI, out);
+ InMessage msg = new InMessage();
+ NormalizedMessage in = exchange.getMessage("in");
+ msg.setXMLStreamReader(getXMLStreamReader(in.getContent()));
+ c.receive(ctx, msg);
+
+ // Set response or DONE status
+ if (isInAndOut(exchange)) {
+ if (ctx.getExchange().getFaultMessage().getBody() != null) {
+ Fault fault = exchange.createFault();
+ fault.setContent(new BytesSource(out.toByteArray()));
+ exchange.setFault(fault);
+ exchange.setStatus(ExchangeStatus.ERROR);
+ } else {
+ NormalizedMessage outMsg = exchange.createMessage();
+ outMsg.setContent(new BytesSource(out.toByteArray()));
+ exchange.setMessage(outMsg, "out");
+ }
+ } else {
+ exchange.setStatus(ExchangeStatus.DONE);
+ }
+ channel.send(exchange);
+ }
+
+ protected boolean isInAndOut(MessageExchange exchange) {
+ return exchange instanceof InOut || exchange instanceof InOptionalOut;
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseLifeCycle#doInit()
+ */
+ protected void doInit() throws Exception {
+ super.doInit();
+ configuration.setRootDir(this.context.getWorkspaceRoot());
+ configuration.load();
+ xfire = XFireFactory.newInstance().getXFire();
+ xfire.getTransportManager().register(new JbiTransport());
+ WebAnnotations webAnnotations = (WebAnnotations) createInstance(configuration.getWebAnnotationsClass());
+ TypeMappingRegistry tmRegistry = (TypeMappingRegistry) createInstance(configuration.getTypeMappingRegistryClass());
+ factory = new AnnotationServiceFactory(
+ webAnnotations,
+ xfire.getTransportManager(),
+ new AegisBindingProvider(tmRegistry));
+ }
+
+ protected Object createInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
+ Class cl = Class.forName(className);
+ return cl.newInstance();
+ }
+
+ protected XMLStreamReader getXMLStreamReader(Source source) throws TransformerException, XMLStreamException {
+ try {
+ return XMLInputFactory.newInstance().createXMLStreamReader(source);
+ } catch (Exception e) {
+ // ignore, as this method is not mandatory in stax
+ }
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ TransformerFactory.newInstance().newTransformer().transform(source, new StreamResult(buffer));
+ return XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(buffer.toByteArray()));
+ }
+
+}
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181XBeanDeployer.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181XBeanDeployer.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/Jsr181XBeanDeployer.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,48 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181;
+
+import org.servicemix.common.Endpoint;
+import org.servicemix.common.xbean.AbstractXBeanDeployer;
+
+import javax.jbi.management.DeploymentException;
+
+public class Jsr181XBeanDeployer extends AbstractXBeanDeployer {
+
+ public Jsr181XBeanDeployer(Jsr181Component component) {
+ super(component);
+ }
+
+ protected boolean validate(Endpoint endpoint) throws DeploymentException {
+ if (endpoint instanceof Jsr181Endpoint == false) {
+ throw failure("deploy", "Endpoint should be a Jsr181 endpoint", null);
+ }
+ Jsr181Endpoint ep = (Jsr181Endpoint) endpoint;
+ if (ep.getPojo() == null) {
+ throw failure("deploy", "Endpoint must have a non-null pojo", null);
+ }
+ try {
+ ep.registerService();
+ } catch (Exception e) {
+ throw failure("deploy", "Could not register endpoint", e);
+ }
+ return true;
+ }
+
+
+}
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/JbiChannel.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/JbiChannel.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/JbiChannel.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,65 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181.xfire;
+
+import org.codehaus.xfire.MessageContext;
+import org.codehaus.xfire.XFireException;
+import org.codehaus.xfire.exchange.OutMessage;
+import org.codehaus.xfire.transport.AbstractChannel;
+import org.codehaus.xfire.transport.Channel;
+import org.codehaus.xfire.util.STAXUtils;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import java.io.OutputStream;
+
+/**
+ * Jbi channel, only support local invocations.
+ */
+public class JbiChannel extends AbstractChannel {
+
+ public JbiChannel(String uri, JbiTransport transport) {
+ setTransport(transport);
+ setUri(uri);
+ }
+
+ public void open() throws Exception {
+ }
+
+ public void send(MessageContext context, OutMessage message) throws XFireException {
+ if (message.getUri().equals(Channel.BACKCHANNEL_URI)) {
+ final OutputStream out = (OutputStream) context.getProperty(Channel.BACKCHANNEL_URI);
+ if (out != null) {
+ final XMLStreamWriter writer = STAXUtils.createXMLStreamWriter(out, message.getEncoding());
+ message.getSerializer().writeMessage(message, writer, context);
+ try {
+ writer.close();
+ } catch (XMLStreamException e) {
+ throw new XFireException("Error closing output stream", e);
+ }
+ return;
+ }
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ public void close() {
+ }
+
+}
\ No newline at end of file
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/JbiTransport.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/JbiTransport.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/JbiTransport.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,80 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181.xfire;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.xfire.service.Service;
+import org.codehaus.xfire.transport.AbstractWSDLTransport;
+import org.codehaus.xfire.transport.Channel;
+import org.codehaus.xfire.transport.DefaultEndpoint;
+
+/**
+ * Simple jbi transport, similar to local transport,
+ * but without soap encoding.
+ *
+ */
+public class JbiTransport extends AbstractWSDLTransport {
+
+ private static final Log log = LogFactory.getLog(JbiTransport.class);
+
+ public final static String JBI_TRANSPORT_NS = "http://java.sun.com/xml/ns/jbi/binding/service+engine";
+
+ public final static String JBI_BINDING = "http://java.sun.com/xml/ns/jbi/binding/service+engine";
+
+ private final static String URI_PREFIX = "urn:xfire:transport:jbi:";
+
+ public JbiTransport() {
+ addInHandler(new PrepareHandler());
+ }
+
+ protected String getName()
+ {
+ return "JBI";
+ }
+
+ public String getServiceURL(Service service) {
+ return "jbi://" + service.getName();
+ }
+
+ public String getTransportURI(Service service) {
+ return JBI_TRANSPORT_NS;
+ }
+
+ protected Channel createNewChannel(String uri) {
+ log.debug("Creating new channel for uri: " + uri);
+ JbiChannel c = new JbiChannel(uri, this);
+ c.setEndpoint(new DefaultEndpoint());
+ return c;
+ }
+
+ protected String getUriPrefix() {
+ return URI_PREFIX;
+ }
+
+ public String[] getSupportedBindings()
+ {
+ return new String[] { JBI_BINDING };
+ }
+
+ public String[] getKnownUriSchemes() {
+ return new String[] { "jbi://" };
+ }
+
+}
+
Added: trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/PrepareHandler.java (885 => 886)
--- trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/PrepareHandler.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/main/java/org/servicemix/jsr181/xfire/PrepareHandler.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,57 @@
+/**
+ *
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ *
+ * 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 org.servicemix.jsr181.xfire;
+
+import org.codehaus.xfire.MessageContext;
+import org.codehaus.xfire.exchange.InMessage;
+import org.codehaus.xfire.handler.AbstractHandler;
+import org.codehaus.xfire.handler.Phase;
+
+import javax.xml.stream.XMLStreamReader;
+
+/**
+ * Handler to start document parsing.
+ */
+public class PrepareHandler extends AbstractHandler {
+
+ public String getPhase() {
+ return Phase.PARSE;
+ }
+
+ public void invoke(MessageContext context) throws Exception {
+ InMessage message = context.getInMessage();
+ XMLStreamReader reader = message.getXMLStreamReader();
+ while (reader.hasNext()) {
+ int event = reader.next();
+ switch (event)
+ {
+ case XMLStreamReader.START_DOCUMENT:
+ String encoding = reader.getCharacterEncodingScheme();
+ message.setEncoding(encoding);
+ break;
+ case XMLStreamReader.END_DOCUMENT:
+ return;
+ case XMLStreamReader.START_ELEMENT:
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+}
\ No newline at end of file
Added: trunk/servicemix-jsr181/src/test/java/org/servicemix/jsr181/Jsr181ComponentTest.java (885 => 886)
--- trunk/servicemix-jsr181/src/test/java/org/servicemix/jsr181/Jsr181ComponentTest.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/test/java/org/servicemix/jsr181/Jsr181ComponentTest.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,71 @@
+package org.servicemix.jsr181;
+
+import org.codehaus.xfire.annotations.commons.CommonsWebAttributes;
+import org.codehaus.xfire.xmlbeans.XmlBeansTypeRegistry;
+import org.servicemix.client.DefaultServiceMixClient;
+import org.servicemix.jbi.container.JBIContainer;
+import org.servicemix.jbi.jaxp.SourceTransformer;
+import org.servicemix.jbi.jaxp.StringSource;
+
+import javax.jbi.messaging.InOut;
+import javax.naming.InitialContext;
+import javax.xml.namespace.QName;
+
+import java.io.File;
+import java.net.URL;
+
+import junit.framework.TestCase;
+
+public class Jsr181ComponentTest extends TestCase {
+
+ protected JBIContainer container;
+
+ protected void setUp() throws Exception {
+ container = new JBIContainer();
+ container.setUseMBeanServer(true);
+ container.setCreateMBeanServer(true);
+ container.setMonitorInstallationDirectory(false);
+ container.setNamingContext(new InitialContext());
+ container.init();
+ }
+
+ protected void tearDown() throws Exception {
+ if (container != null) {
+ container.shutDown();
+ }
+ }
+
+ public void testCommonsAnnotations() throws Exception {
+ Jsr181Component component = new Jsr181Component();
+ Jsr181LifeCycle lifecycle = (Jsr181LifeCycle) component.getLifeCycle();
+ lifecycle.getConfiguration().setTypeMappingRegistryClass(XmlBeansTypeRegistry.class.getName());
+ lifecycle.getConfiguration().setWebAnnotationsClass(CommonsWebAttributes.class.getName());
+ container.activateComponent(component, "JSR181Component");
+
+ // Start container
+ container.start();
+
+ // Deploy SU
+ URL url = ""
+ File path = new File(url.getFile());
+ path = path.getParentFile();
+ System.err.println(path.getAbsolutePath());
+ component.getServiceUnitManager().deploy("su", path.getAbsolutePath());
+ component.getServiceUnitManager().init("su", path.getAbsolutePath());
+ component.getServiceUnitManager().start("su");
+
+ // Call it
+ DefaultServiceMixClient client = new DefaultServiceMixClient(container);
+ InOut me = client.createInOutExchange();
+ me.setInterfaceName(new QName("http://test", "EchoService"));
+ me.getInMessage().setContent(new StringSource("<echo xmlns='http://test'><in0>world</in0></echo>"));
+ client.sendSync(me);
+ if (me.getFault() != null) {
+ System.err.println("!!! FAULT !!!!");
+ System.err.println(new SourceTransformer().toString(me.getFault().getContent()));
+ }
+ System.err.println(new SourceTransformer().toString(me.getOutMessage().getContent()));
+
+ }
+
+}
Added: trunk/servicemix-jsr181/src/test/java/test/EchoService.java (885 => 886)
--- trunk/servicemix-jsr181/src/test/java/test/EchoService.java 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/test/java/test/EchoService.java 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,17 @@
+package test;
+
+
+/**
+ * @@org.codehaus.xfire.annotations.commons.WebService(name = "EchoService")
+ * @@org.codehaus.xfire.annotations.commons.soap.SOAPBinding(style = 0)
+ */
+public class EchoService {
+
+ /**
+ * @@org.codehaus.xfire.annotations.commons.WebMethod(operationName = "echo")
+ */
+ public String echo(String input) {
+ return input;
+ }
+
+}
Added: trunk/servicemix-jsr181/src/test/resources/log4j.properties (885 => 886)
--- trunk/servicemix-jsr181/src/test/resources/log4j.properties 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/test/resources/log4j.properties 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,20 @@
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=INFO, stdout
+log4j.logger.org.servicemix.jsr181=DEBUG
+
+log4j.logger.org.activemq=WARN
+log4j.logger.org.activeio=INFO
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.FileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+log4j.appender.out.file=target/test-reports/activemq-test.log
+log4j.appender.out.append=true
Added: trunk/servicemix-jsr181/src/test/resources/su/xbean.xml (885 => 886)
--- trunk/servicemix-jsr181/src/test/resources/su/xbean.xml 2005-11-22 08:23:44 UTC (rev 885)
+++ trunk/servicemix-jsr181/src/test/resources/su/xbean.xml 2005-11-22 08:26:56 UTC (rev 886)
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<beans>
+ <bean name="endpoint1" class="org.servicemix.jsr181.Jsr181Endpoint">
+ <property name="pojo">
+ <bean class="test.EchoService" />
+ </property>
+ </bean>
+</beans>