/** * 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 org.apache.cxf.transport.servlet.servicelist; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.message.Message; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.transport.AbstractDestination; import org.apache.cxf.transport.http.DestinationRegistry; import org.apache.cxf.transport.servlet.ServletController; public class ServiceListGeneratorServlet extends HttpServlet { private static final long serialVersionUID = -113918058557537996L; private DestinationRegistry destinationRegistry; private Bus bus; private String serviceListStyleSheet; private String title; private boolean showForeignContexts = true; public ServiceListGeneratorServlet(DestinationRegistry destinationRegistry, Bus bus) { this.destinationRegistry = destinationRegistry; this.bus = bus; if (this.bus == null) { this.bus = BusFactory.getDefaultBus(false); } this.title = "CXF - Service list"; } public void setServiceListStyleSheet(String serviceListStyleSheet) { this.serviceListStyleSheet = serviceListStyleSheet; } public void setTitle(String title) { this.title = title; } @SuppressWarnings("unchecked") @Override public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object obj = request.getAttribute(ServletController.AUTH_SERVICE_LIST); boolean isAuthServiceList = false; if (obj != null) { isAuthServiceList = Boolean.valueOf(obj.toString()); } if (isAuthServiceList) { String authServiceListRealm = (String)request.getAttribute(ServletController.AUTH_SERVICE_LIST_REALM); ServiceListJAASAuthenticator authenticator = new ServiceListJAASAuthenticator(); authenticator.setRealm(authServiceListRealm); if (!authenticator.authenticate(request, response)) { return; } request.removeAttribute(ServletController.AUTH_SERVICE_LIST); request.removeAttribute(ServletController.AUTH_SERVICE_LIST_REALM); } AbstractDestination[] destinations = destinationRegistry.getSortedDestinations(); if (request.getParameter("stylesheet") != null) { renderStyleSheet(request, response); return; } List<String> privateEndpoints; if (bus != null) { privateEndpoints = (List<String>)bus.getProperty("org.apache.cxf.private.endpoints"); } else { privateEndpoints = new ArrayList<>(); } AbstractDestination[] soapEndpoints = getSOAPEndpoints(destinations, privateEndpoints); AbstractDestination[] restEndpoints = getRestEndpoints(destinations, privateEndpoints); ServiceListWriter serviceListWriter; if ("false".equals(request.getParameter("formatted"))) { boolean renderWsdlList = "true".equals(request.getParameter("wsdlList")); serviceListWriter = new UnformattedServiceListWriter(renderWsdlList, bus); } else { String styleSheetPath; if (serviceListStyleSheet != null) { styleSheetPath = request.getContextPath() + "/" + serviceListStyleSheet; } else { styleSheetPath = ""; String contextPath = request.getContextPath(); if (contextPath != null) { styleSheetPath += contextPath; } String servletPath = request.getServletPath(); if (servletPath != null) { styleSheetPath += servletPath; } String pathInfo = request.getPathInfo(); if (pathInfo != null) { styleSheetPath += pathInfo; } if (!styleSheetPath.endsWith("/")) { styleSheetPath += "/"; } styleSheetPath += "?stylesheet=1"; } serviceListWriter = new FormattedServiceListWriter(styleSheetPath, title, showForeignContexts, bus); } response.setContentType(serviceListWriter.getContentType()); Object basePath = request.getAttribute(Message.BASE_PATH); serviceListWriter.writeServiceList(response.getWriter(), basePath == null ? null : basePath.toString(), soapEndpoints, restEndpoints); } private boolean isPrivate(EndpointInfo ei, List<String> privateEndpoints) { if (privateEndpoints != null) { for (String s : privateEndpoints) { if (ei.getAddress().endsWith(s)) { return true; } } } return false; } private AbstractDestination[] getSOAPEndpoints(AbstractDestination[] destinations, List<String> privateEndpoints) { List<AbstractDestination> soapEndpoints = new ArrayList<>(); for (AbstractDestination sd : destinations) { if (null != sd.getEndpointInfo().getName() && null != sd.getEndpointInfo().getInterface() && !isPrivate(sd.getEndpointInfo(), privateEndpoints)) { soapEndpoints.add(sd); } } return soapEndpoints.toArray(new AbstractDestination[soapEndpoints.size()]); } private AbstractDestination[] getRestEndpoints(AbstractDestination[] destinations, List<String> privateEndpoints) { List<AbstractDestination> restfulDests = new ArrayList<>(); for (AbstractDestination sd : destinations) { // use some more reasonable check - though this one seems to be the only option at the moment if (null == sd.getEndpointInfo().getInterface() && !isPrivate(sd.getEndpointInfo(), privateEndpoints)) { restfulDests.add(sd); } } return restfulDests.toArray(new AbstractDestination[restfulDests.size()]); } private void renderStyleSheet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/css; charset=UTF-8"); URL url = this.getClass().getResource("servicelist.css"); if (url != null) { IOUtils.copy(url.openStream(), response.getOutputStream()); } } public void init(ServletConfig servletConfig) { String configServiceListStyleSheet = servletConfig.getInitParameter("service-list-stylesheet"); if (!StringUtils.isEmpty(configServiceListStyleSheet)) { this.serviceListStyleSheet = configServiceListStyleSheet; } String configTitle = servletConfig.getInitParameter("service-list-title"); if (!StringUtils.isEmpty(configTitle)) { this.title = configTitle; } String showAllContexts = servletConfig.getInitParameter("service-list-all-contexts"); if (!StringUtils.isEmpty(showAllContexts)) { this.showForeignContexts = Boolean.valueOf(showAllContexts); } } public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } public void destroy() { } }