CAMEL-7800: camel-swagger-java - work in progress
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e2f5c9f0 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e2f5c9f0 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e2f5c9f0 Branch: refs/heads/master Commit: e2f5c9f075c89a8e74332e4f91a72f733fb0d4ca Parents: 83341f2 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Sep 18 16:06:07 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Sep 18 16:16:15 2015 +0200 ---------------------------------------------------------------------- .../swagger/DefaultCamelSwaggerServlet.java | 91 -------------------- .../camel/swagger/RestSwaggerCorsFilter.java | 55 ++++++++++++ .../camel/swagger/RestSwaggerServlet.java | 91 ++++++++++++++++++++ .../src/main/webapp/WEB-INF/web.xml | 9 +- 4 files changed, 149 insertions(+), 97 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/e2f5c9f0/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/DefaultCamelSwaggerServlet.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/DefaultCamelSwaggerServlet.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/DefaultCamelSwaggerServlet.java deleted file mode 100644 index b3c73e6..0000000 --- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/DefaultCamelSwaggerServlet.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * 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.camel.swagger; - -import java.lang.management.ManagementFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import javax.management.MBeanServer; -import javax.management.ObjectName; - -import org.apache.camel.model.ModelHelper; -import org.apache.camel.model.rest.RestDefinition; -import org.apache.camel.model.rest.RestsDefinition; -import org.apache.camel.util.CamelVersionHelper; - -/** - * The default Camel swagger servlet to use when exposing the APIs of the rest-dsl using swagger. - * <p/> - * This requires Camel version 2.15 or better at runtime (and JMX to be enabled). - */ -public class DefaultCamelSwaggerServlet extends RestSwaggerAbstractServlet { - - @Override - public List<RestDefinition> getRestDefinitions(String camelId) throws Exception { - ObjectName found = null; - - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - Set<ObjectName> names = server.queryNames(new ObjectName("org.apache.camel:type=context,*"), null); - for (ObjectName on : names) { - String id = on.getKeyProperty("name"); - if (id.startsWith("\"") && id.endsWith("\"")) { - id = id.substring(1, id.length() - 1); - } - if (camelId == null || camelId.equals(id)) { - // filter out older Camel versions as this requires Camel 2.15 or better (rest-dsl) - String version = (String) server.getAttribute(on, "CamelVersion"); - if (CamelVersionHelper.isGE("2.15.0", version)) { - found = on; - } - } - } - - if (found != null) { - String xml = (String) server.invoke(found, "dumpRestsAsXml", null, null); - if (xml != null) { - RestsDefinition rests = ModelHelper.createModelFromXml(null, xml, RestsDefinition.class); - if (rests != null) { - return rests.getRests(); - } - } - } - - return null; - } - - @Override - public List<String> findCamelContexts() throws Exception { - List<String> answer = new ArrayList<>(); - - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - Set<ObjectName> names = server.queryNames(new ObjectName("*:type=context,*"), null); - for (ObjectName on : names) { - String id = on.getKeyProperty("name"); - if (id.startsWith("\"") && id.endsWith("\"")) { - id = id.substring(1, id.length() - 1); - } - - // filter out older Camel versions as this requires Camel 2.15 or better (rest-dsl) - String version = (String) server.getAttribute(on, "CamelVersion"); - if (CamelVersionHelper.isGE("2.15.0", version)) { - answer.add(id); - } - } - return answer; - } -} http://git-wip-us.apache.org/repos/asf/camel/blob/e2f5c9f0/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerCorsFilter.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerCorsFilter.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerCorsFilter.java new file mode 100644 index 0000000..0cf7303 --- /dev/null +++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerCorsFilter.java @@ -0,0 +1,55 @@ +/** + * 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.camel.swagger; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +/** + * A simple CORS filter that can used to allow the swagger ui or other API browsers from remote origins to access the + * Rest services exposes by this Camel swagger component. + */ +public class RestSwaggerCorsFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // noop + } + + @Override + public void destroy() { + // noop + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH"); + res.setHeader("Access-Control-Max-Age", "3600"); + res.setHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); + + chain.doFilter(request, response); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/e2f5c9f0/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerServlet.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerServlet.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerServlet.java new file mode 100644 index 0000000..7d85e76 --- /dev/null +++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerServlet.java @@ -0,0 +1,91 @@ +/** + * 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.camel.swagger; + +import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.camel.model.ModelHelper; +import org.apache.camel.model.rest.RestDefinition; +import org.apache.camel.model.rest.RestsDefinition; +import org.apache.camel.util.CamelVersionHelper; + +/** + * The default Camel swagger servlet to use when exposing the APIs of the rest-dsl using swagger. + * <p/> + * This requires Camel version 2.15 or better at runtime (and JMX to be enabled). + */ +public class RestSwaggerServlet extends RestSwaggerAbstractServlet { + + @Override + public List<RestDefinition> getRestDefinitions(String camelId) throws Exception { + ObjectName found = null; + + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + Set<ObjectName> names = server.queryNames(new ObjectName("org.apache.camel:type=context,*"), null); + for (ObjectName on : names) { + String id = on.getKeyProperty("name"); + if (id.startsWith("\"") && id.endsWith("\"")) { + id = id.substring(1, id.length() - 1); + } + if (camelId == null || camelId.equals(id)) { + // filter out older Camel versions as this requires Camel 2.15 or better (rest-dsl) + String version = (String) server.getAttribute(on, "CamelVersion"); + if (CamelVersionHelper.isGE("2.15.0", version)) { + found = on; + } + } + } + + if (found != null) { + String xml = (String) server.invoke(found, "dumpRestsAsXml", null, null); + if (xml != null) { + RestsDefinition rests = ModelHelper.createModelFromXml(null, xml, RestsDefinition.class); + if (rests != null) { + return rests.getRests(); + } + } + } + + return null; + } + + @Override + public List<String> findCamelContexts() throws Exception { + List<String> answer = new ArrayList<>(); + + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + Set<ObjectName> names = server.queryNames(new ObjectName("*:type=context,*"), null); + for (ObjectName on : names) { + String id = on.getKeyProperty("name"); + if (id.startsWith("\"") && id.endsWith("\"")) { + id = id.substring(1, id.length() - 1); + } + + // filter out older Camel versions as this requires Camel 2.15 or better (rest-dsl) + String version = (String) server.getAttribute(on, "CamelVersion"); + if (CamelVersionHelper.isGE("2.15.0", version)) { + answer.add(id); + } + } + return answer; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/e2f5c9f0/examples/camel-example-swagger-java/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-swagger-java/src/main/webapp/WEB-INF/web.xml b/examples/camel-example-swagger-java/src/main/webapp/WEB-INF/web.xml index 2979553..35527aa 100755 --- a/examples/camel-example-swagger-java/src/main/webapp/WEB-INF/web.xml +++ b/examples/camel-example-swagger-java/src/main/webapp/WEB-INF/web.xml @@ -41,11 +41,10 @@ <load-on-startup>1</load-on-startup> </servlet> - <!-- START SNIPPET: e1 --> - <!-- to setup Camel Swagger api servlet --> + <!-- to setup Camel Swagger servlet --> <servlet> <servlet-name>ApiDeclarationServlet</servlet-name> - <servlet-class>org.apache.camel.swagger.DefaultCamelSwaggerServlet</servlet-class> + <servlet-class>org.apache.camel.swagger.RestSwaggerServlet</servlet-class> <init-param> <!-- we specify the base.path using relative notation, that means the actual path will be calculated at runtime as http://server:port/contextpath/rest --> @@ -82,7 +81,6 @@ <servlet-name>ApiDeclarationServlet</servlet-name> <url-pattern>/api-docs/*</url-pattern> </servlet-mapping> - <!-- END SNIPPET: e1 --> <!-- define that url path for the Camel Servlet to use --> <servlet-mapping> @@ -90,7 +88,7 @@ <url-pattern>/rest/*</url-pattern> </servlet-mapping> - <!-- enable CORS filter so people can use swagger ui to browse and test the apis + <!-- enable CORS filter so people can use swagger ui to browse and test the apis --> <filter> <filter-name>RestSwaggerCorsFilter</filter-name> <filter-class>org.apache.camel.swagger.RestSwaggerCorsFilter</filter-class> @@ -101,7 +99,6 @@ <url-pattern>/api-docs/*</url-pattern> <url-pattern>/rest/*</url-pattern> </filter-mapping> - --> <welcome-file-list> <welcome-file>home.html</welcome-file>