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 {