Author: sergeyb
Date: Fri Jan  6 14:27:09 2012
New Revision: 1228198

URL: http://svn.apache.org/viewvc?rev=1228198&view=rev
Log:
[DOSGI-107] Prototyping the code for a wsdl configuration type

Modified:
    
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/Constants.java
    
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java
    
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java

Modified: 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/Constants.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/Constants.java?rev=1228198&r1=1228197&r2=1228198&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/Constants.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/Constants.java
 Fri Jan  6 14:27:09 2012
@@ -39,7 +39,9 @@ public class Constants {
     public static final String WSDL_CONFIG_TYPE = "wsdl";
     public static final String WSDL_CONFIG_PREFIX = 
"osgi.remote.configuration" + "." + WSDL_CONFIG_TYPE;
     public static final String SERVICE_NAMESPACE = WSDL_CONFIG_PREFIX + 
".service.ns";
-    
+    public static final String SERVICE_NAME = WSDL_CONFIG_PREFIX + 
".service.name";
+    public static final String PORT_NAME = WSDL_CONFIG_PREFIX + ".port.name";
+    public static final String WSDL_LOCATION = WSDL_CONFIG_PREFIX + 
".location";
     // Provider prefix
     public static final String PROVIDER_PREFIX = "org.apache.cxf";
     

Modified: 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java?rev=1228198&r1=1228197&r2=1228198&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java
 Fri Jan  6 14:27:09 2012
@@ -226,5 +226,51 @@ public abstract class AbstractPojoConfig
         return intentMap;
     }    
 
-
+    protected String getPojoAddress(Map sd, Class<?> iClass) {
+        String address = OsgiUtils.getProperty(sd, 
RemoteConstants.ENDPOINT_ID);
+        if(address == null && sd.get(RemoteConstants.ENDPOINT_ID)!=null ){
+            LOG.severe("Could not use address property " + 
RemoteConstants.ENDPOINT_ID );
+            return null;
+        }
+        
+        
+        if (address == null) {
+            address = OsgiUtils.getProperty(sd, Constants.WS_ADDRESS_PROPERTY);
+        }
+        if(address == null && sd.get(Constants.WS_ADDRESS_PROPERTY)!=null ){
+            LOG.severe("Could not use address property " + 
Constants.WS_ADDRESS_PROPERTY );
+            return null;
+        }
+        
+        if (address == null) {
+            address = OsgiUtils.getProperty(sd, 
Constants.WS_ADDRESS_PROPERTY_OLD);
+        }
+        if(address == null && sd.get(Constants.WS_ADDRESS_PROPERTY_OLD)!=null 
){
+            LOG.severe("Could not use address property " + 
Constants.WS_ADDRESS_PROPERTY_OLD);
+            return null;
+        }
+        
+        if (address == null) {
+            address = OsgiUtils.getProperty(sd, Constants.RS_ADDRESS_PROPERTY);
+        }
+        if(address == null && sd.get(Constants.RS_ADDRESS_PROPERTY)!=null ){
+            LOG.severe("Could not use address property " + 
Constants.RS_ADDRESS_PROPERTY);
+            return null;
+        }
+        
+        
+        if (address == null) {
+            String port = null;
+            Object p = sd.get(Constants.WS_PORT_PROPERTY);
+            if (p instanceof String) {
+                port = (String) p;
+            }
+            
+            address = getDefaultAddress(iClass, port);
+            if (address != null) {
+                LOG.info("Using a default address : " + address);
+            }
+        }
+        return address;
+    }
 }

Modified: 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
URL: 
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java?rev=1228198&r1=1228197&r2=1228198&view=diff
==============================================================================
--- 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
 (original)
+++ 
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
 Fri Jan  6 14:27:09 2012
@@ -28,14 +28,19 @@ import javax.xml.ws.Service;
 
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.PackageUtils;
+import org.apache.cxf.databinding.DataBinding;
 import org.apache.cxf.dosgi.dsw.Constants;
 import org.apache.cxf.dosgi.dsw.OsgiUtils;
 import org.apache.cxf.dosgi.dsw.service.ExportRegistrationImpl;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.jaxb.JAXBDataBinding;
+import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
 
-public class WsdlConfigurationTypeHandler extends AbstractConfigurationHandler 
{
+public class WsdlConfigurationTypeHandler extends 
AbstractPojoConfigurationTypeHandler {
     private static final String CONFIGURATION_TYPE = "wsdl";
     private static final Logger LOG = 
LogUtils.getL7dLogger(WsdlConfigurationTypeHandler.class);
     
@@ -77,9 +82,16 @@ public class WsdlConfigurationTypeHandle
             serviceNs = PackageUtils.getNamespace(
                             PackageUtils.getPackageName(iClass));
         }
-        QName serviceQname = new QName(serviceNs, iClass.getSimpleName());
+        String serviceName = OsgiUtils.getProperty(sd, Constants.SERVICE_NAME);
+        if (serviceName == null) {
+               serviceName = iClass.getSimpleName();   
+        }
+        QName serviceQname = getServiceQName(iClass, sd.getProperties());
+        QName portQname = getPortQName(serviceQname.getNamespaceURI(), 
sd.getProperties());
         Service service = createWebService(wsdlAddress, serviceQname);
-        Object proxy = getProxy(service.getPort(iClass), iClass);
+        Object proxy = getProxy(
+            portQname == null ? service.getPort(iClass) : 
service.getPort(portQname, iClass), 
+               iClass);
         //MARC: FIXME !!!! 
getDistributionProvider().addRemoteService(serviceReference);
         return proxy;
         
@@ -90,6 +102,27 @@ public class WsdlConfigurationTypeHandle
         return Service.create(wsdlAddress, serviceQname);
     }
 
+    private QName getServiceQName(Class<?> iClass, Map sd) {
+       String serviceNs = OsgiUtils.getProperty(sd, 
Constants.SERVICE_NAMESPACE);
+        if (serviceNs == null) {
+            serviceNs = PackageUtils.getNamespace(
+                            PackageUtils.getPackageName(iClass));
+        }
+        String serviceName = OsgiUtils.getProperty(sd, Constants.SERVICE_NAME);
+        if (serviceName == null) {
+               serviceName = iClass.getSimpleName();   
+        }
+        return new QName(serviceNs, serviceName);
+    }
+    
+    private QName getPortQName(String ns, Map sd) {
+       String portName = OsgiUtils.getProperty(sd, Constants.PORT_NAME);
+        if (portName == null) {
+               return null;    
+        }
+        return new QName(ns, portName);
+    }
+    
     public void createServer(ExportRegistrationImpl exportRegistration,
                                BundleContext dswContext,
                                BundleContext callingContext,
@@ -97,8 +130,67 @@ public class WsdlConfigurationTypeHandle
                                Class<?> iClass, 
                                Object serviceBean) {
         
-        throw new UnsupportedOperationException("No WSDL configuration is 
currently supported for"
-                  + " creating service endpoints");
+       String location = OsgiUtils.getProperty(sd, Constants.WSDL_LOCATION);
+       if (location == null) {
+               LOG.warning("WSDL location is unavailable");
+            exportRegistration.setException(new Throwable("WSDL location is 
unavailable"));
+            return;
+       }
+        URL wsdlURL = dswContext.getBundle().getResource(location);
+        if (wsdlURL == null) {
+               LOG.warning("WSDL resource is unavailable");
+            exportRegistration.setException(new Throwable("WSDL resource is 
unavailable"));
+            return;
+       }
+        
+       String address = getPojoAddress(sd, iClass);
+        if (address == null) {
+            LOG.warning("Remote address is unavailable");
+            exportRegistration.setException(new Throwable("Remote address is 
unavailable"));
+            return;
+        }
+
+        LOG.info("Creating a " + iClass.getName() + " endpoint from CXF 
PublishHook, address is " + address);
+
+        DataBinding databinding = new JAXBDataBinding();
+        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
+
+        factory.setServiceClass(iClass);
+        factory.setAddress(address);
+        factory.getServiceFactory().setDataBinding(databinding);
+        factory.setServiceBean(serviceBean);
+
+        QName serviceQname = getServiceQName(iClass, sd);
+        factory.setServiceName(serviceQname);
+        
+        QName portQname = getPortQName(serviceQname.getNamespaceURI(), sd);
+        if (portQname != null) {
+               factory.setEndpointName(portQname);
+        }
+        
+        factory.setWsdlURL(wsdlURL.toString());
+        
+        ClassLoader oldClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            String[] intents = applyIntents(dswContext, callingContext, 
factory.getFeatures(), factory, sd);
+
+            // The properties for the EndpointDescription
+            Map<String, Object> endpointProps = createEndpointProps(sd, 
iClass, new String[]{Constants.WS_CONFIG_TYPE}, address,intents);
+            
+            
Thread.currentThread().setContextClassLoader(ServerFactoryBean.class.getClassLoader());
+            Server server = factory.create();
+
+            exportRegistration.setServer(server);
+            
+            //  add the information on the new Endpoint to the export 
registration
+            EndpointDescription ed = new EndpointDescription(endpointProps);
+            exportRegistration.setEndpointdescription(ed);
+            
+        } catch (IntentUnsatifiedException iue) {
+            exportRegistration.setException(iue);
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldClassLoader);
+        }
     }
     
     private String getWsdlAddress(EndpointDescription sd, Class<?> iClass) {


Reply via email to