Hi Willem,

I suggest we use ?serviceList to retrieve the service list
just like we use ?wsdl to retrieve the wsdl

Cheers,
James.

Author: ningjiang
Date: Fri Nov 24 02:11:33 2006
New Revision: 478826

URL: http://svn.apache.org/viewvc?view=rev&rev=478826
Log:
[JIRA CXF-266] Let servlet control can return list of services which are 
published by servlet
Now we can get the services list from http://localhost/services
Modified:
    
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/CXFServlet.java
    
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletController.java
    
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java
    
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletTransportFactory.java
    
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/servlet/CXFServletTest.java

Modified: 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/CXFServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/CXFServlet.java?view=diff&rev=478826&r1=478825&r2=478826
==============================================================================
--- 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/CXFServlet.java
 (original)
+++ 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/CXFServlet.java
 Fri Nov 24 02:11:33 2006
@@ -59,7 +59,7 @@
  *
  */
 public class CXFServlet extends HttpServlet {
-
+    static final String ADDRESS_PERFIX = "http://localhost/services";;
     static final Map<String, WeakReference<Bus>> BUS_MAP = new Hashtable<String, 
WeakReference<Bus>>();
     static final Logger LOG = Logger.getLogger(CXFServlet.class.getName());
     protected Bus bus;
@@ -189,28 +189,7 @@
                               String urlPat) throws ServletException {
try {
-
-            // TODO: This wasn't doing anything before. We need to pass this to
-            // the
-            // EndpointImpl so the service factory can use it...
-            // URL url = null;
-            // if (wsdlName != null && wsdlName.length() > 0) {
-            // try {
-            // url =
-            // getServletConfig().getServletContext().getResource(wsdlName);
-            // } catch (MalformedURLException ex) {
-            // try {
-            // url = new URL(wsdlName);
-            // } catch (MalformedURLException ex2) {
-            // try {
-            // url = getServletConfig().getServletContext().getResource("/" +
-            // wsdlName);
-            // } catch (MalformedURLException ex3) {
-            // url = null;
-            // }
-            // }
-            // }
-            // }
+ Class cls = ClassLoaderUtils.loadClass(implName, getClass());
             Object impl = cls.newInstance();
@@ -218,7 +197,7 @@
             LOG.info("publish the servcie to {context}/ " + (urlPat.charAt(0) == '/' ? 
"" : "/") + urlPat);
// TODO we may need to get the url-pattern from servlet context
-            ep.publish("http://localhost/services"; + (urlPat.charAt(0) == '/' ? "" : 
"/") + urlPat);
+            ep.publish(ADDRESS_PERFIX + (urlPat.charAt(0) == '/' ? "" : "/") + 
urlPat);
} catch (ClassNotFoundException ex) {
             throw new ServletException(ex);

Modified: 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletController.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletController.java?view=diff&rev=478826&r1=478825&r2=478826
==============================================================================
--- 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletController.java
 (original)
+++ 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletController.java
 Fri Nov 24 02:11:33 2006
@@ -70,7 +70,7 @@
         boolean xsd = false;
         if (request.getQueryString() != null && 
request.getQueryString().trim().equalsIgnoreCase("wsdl")) {
             wsdl = true;
-        }
+ } String xsdName = request.getRequestURI().substring( request.getRequestURI().lastIndexOf("/") + 1); if (xsdName != null @@ -86,11 +86,15 @@
             if (d.getMessageObserver() == null) {
                 if (xsd) {
                     generateXSD(request, res, xsdName);
- } else { - LOG.warning("Can't find the the request for" - + "http://localhost"; + request.getServletPath() - + request.getPathInfo() + " 's Observer ");
-                    generateNotFound(request, res);
+                } else {
+                    if (request.getRequestURI().endsWith("services")) {
+                        generateServiceList(request, res);
+                    } else {
+ LOG.warning("Can't find the the request for" + + "http://localhost"; + request.getServletPath() + + request.getPathInfo() + " 's Observer ");
+                        generateNotFound(request, res);
+ } }
             } else if (wsdl) {
                 generateWSDL(request, res, d);
@@ -100,6 +104,28 @@
         } catch (IOException e) {
             throw new ServletException(e);
         }
+    }
+ + private void generateServiceList(HttpServletRequest request, HttpServletResponse response)
+        throws IOException {
+        List<ServletDestination> destinations = transport.getDestinations();
+ response.setContentType("text/html"); + response.getWriter().write("<html><body>"); + if (destinations.size() > 0) { + for (ServletDestination sd : destinations) {
+                if (null != sd.getEndpointInfo().getName()) {
+                    String address = sd.getAddress().getAddress().getValue();
+ int bi = address.indexOf(CXFServlet.ADDRESS_PERFIX); + address = request.getRequestURL() + + address.substring(bi + CXFServlet.ADDRESS_PERFIX.length());
+                    response.getWriter().write("<a href=\"" + address + "\">");
+                    response.getWriter().write(sd.getEndpointInfo().getName() + 
"</a>");
+ } + }
+        } else {
+            response.getWriter().write("No service was found.");
+        }
+        response.getWriter().write("</body></html>");
     }
private void generateXSD(HttpServletRequest request, HttpServletResponse response, String xsdName)
Modified: 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java?view=diff&rev=478826&r1=478825&r2=478826
==============================================================================
--- 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java
 (original)
+++ 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java
 Fri Nov 24 02:11:33 2006
@@ -155,7 +155,7 @@
      * @param observer the observer to notify on receipt of incoming
      */
     public synchronized void setMessageObserver(MessageObserver observer) {
-        LOG.info("!!! set the observer for address " + 
getAddress().getAddress().getValue());
+        LOG.info("set the observer for address " + 
getAddress().getAddress().getValue());
         incomingObserver = observer;
     }
@@ -262,8 +262,7 @@ setHeaders(inMessage); - inMessage.setDestination(this); - + inMessage.setDestination(this); incomingObserver.onMessage(inMessage);
Modified: 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletTransportFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletTransportFactory.java?view=diff&rev=478826&r1=478825&r2=478826
==============================================================================
--- 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletTransportFactory.java
 (original)
+++ 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletTransportFactory.java
 Fri Nov 24 02:11:33 2006
@@ -21,8 +21,10 @@
 package org.apache.cxf.jaxws.servlet;
import java.io.IOException;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Resource; @@ -36,7 +38,8 @@
     implements DestinationFactory {
private Bus bus; - private Map<String, ServletDestination> destinations = new HashMap<String, ServletDestination>(); + private Map<String, ServletDestination> destinations = + new ConcurrentHashMap<String, ServletDestination>(); public ServletTransportFactory(Bus b) {
         bus = b;
@@ -54,7 +57,7 @@
         this.bus = bus;
     }
- public synchronized Destination getDestination(EndpointInfo endpointInfo)
+    public Destination getDestination(EndpointInfo endpointInfo)
         throws IOException {
         ServletDestination d = destinations.get(endpointInfo.getAddress());
if (d == null) { @@ -62,5 +65,13 @@
             destinations.put(endpointInfo.getAddress(), d);
         }
         return d;
+    }
+ + public List<ServletDestination> getDestinations() {
+        List<ServletDestination> result = new ArrayList<ServletDestination>();
+        for (ServletDestination sd : destinations.values()) {
+            result.add(sd);
+        }
+ return result; }
 }

Modified: 
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/servlet/CXFServletTest.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/servlet/CXFServletTest.java?view=diff&rev=478826&r1=478825&r2=478826
==============================================================================
--- 
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/servlet/CXFServletTest.java
 (original)
+++ 
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/servlet/CXFServletTest.java
 Fri Nov 24 02:11:33 2006
@@ -24,6 +24,7 @@
import com.meterware.httpunit.GetMethodWebRequest;
 import com.meterware.httpunit.PostMethodWebRequest;
+import com.meterware.httpunit.WebLink;
 import com.meterware.httpunit.WebRequest;
 import com.meterware.httpunit.WebResponse;
 import com.meterware.servletunit.ServletUnitClient;
@@ -72,6 +73,32 @@
assertValid("/s:Envelope/s:Body", doc);
         assertValid("//h:sayHiResponse", doc);
+    }
+ + public void testGetServiceList() throws Exception {
+        ServletUnitClient client = newClient();
+ + JaxWsServerFactoryBean svr = new JaxWsServerFactoryBean();
+        URL resource = getClass().getResource("/wsdl/hello_world.wsdl");
+        assertNotNull(resource);
+        svr.getServiceFactory().setWsdlURL(resource);
+        svr.setBus(getBus());
+        svr.setServiceClass(GreeterImpl.class);
+        svr.setAddress("http://localhost/services/Greeter";);
+
+        GreeterImpl greeter = new GreeterImpl();
+        BeanInvoker invoker = new BeanInvoker(greeter);
+        svr.getServiceFactory().setInvoker(invoker);
+
+        svr.create();
+ + client.setExceptionsThrownOnErrorStatus(false);
+
+ WebResponse res = client.getResponse("http://localhost/services";); + WebLink[] links = res.getLinks();
+        assertEquals("There should get one link for service", links.length, 1);
+ assertEquals(links[0].getURLString(), "http://localhost/services/Greeter";); + assertEquals("text/html", res.getContentType());
     }
public void testInvalidServiceUrl() throws Exception {




Reply via email to