You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2018/10/05 15:02:19 UTC

[2/2] syncope git commit: [SYNCOPE-1376] Use absolute path but no protocol, host or port

[SYNCOPE-1376] Use absolute path but no protocol, host or port


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/1310349e
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/1310349e
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/1310349e

Branch: refs/heads/2_0_X
Commit: 1310349e36d04724d2f1c5d1890133ad41424b91
Parents: cdad0ab
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Oct 5 17:02:03 2018 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Oct 5 17:02:03 2018 +0200

----------------------------------------------------------------------
 .../rest/cxf/SyncopeSwagger2Customizer.java     |  16 +++
 ...SyncopeSwaggerToOpenApiConversionFilter.java | 114 +++++++++++++++++++
 .../src/main/resources/restCXFContext.xml       |   2 +-
 .../src/main/resources/jboss/restCXFContext.xml |   2 +-
 4 files changed, 132 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/1310349e/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwagger2Customizer.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwagger2Customizer.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwagger2Customizer.java
index 85c6a9a..1bcf643 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwagger2Customizer.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwagger2Customizer.java
@@ -18,12 +18,16 @@
  */
 package org.apache.syncope.core.rest.cxf;
 
+import io.swagger.models.Swagger;
 import io.swagger.models.parameters.HeaderParameter;
 import io.swagger.models.parameters.Parameter;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.jaxrs.ext.MessageContext;
 import org.apache.cxf.jaxrs.swagger.Swagger2Customizer;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.core.persistence.api.DomainsHolder;
@@ -43,6 +47,18 @@ public class SyncopeSwagger2Customizer extends Swagger2Customizer {
     }
 
     @Override
+    public Swagger customize(final Swagger data) {
+        super.customize(data);
+
+        MessageContext ctx = JAXRSUtils.createContextValue(JAXRSUtils.getCurrentMessage(), null, MessageContext.class);
+        String basePath = StringUtils.substringBeforeLast(ctx.getHttpServletRequest().getRequestURI(), "/");
+        data.setBasePath(basePath);
+        data.setHost(null);
+
+        return data;
+    }
+
+    @Override
     protected void addParameters(final List<Parameter> parameters) {
         if (domains == null) {
             domains = new ArrayList<>(

http://git-wip-us.apache.org/repos/asf/syncope/blob/1310349e/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwaggerToOpenApiConversionFilter.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwaggerToOpenApiConversionFilter.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwaggerToOpenApiConversionFilter.java
new file mode 100644
index 0000000..44aaabd
--- /dev/null
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwaggerToOpenApiConversionFilter.java
@@ -0,0 +1,114 @@
+/*
+ * 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.syncope.core.rest.cxf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Objects;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.PreMatching;
+import javax.ws.rs.ext.Provider;
+import javax.ws.rs.ext.WriterInterceptor;
+import javax.ws.rs.ext.WriterInterceptorContext;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.io.CachedOutputStream;
+import org.apache.cxf.jaxrs.ext.MessageContext;
+import org.apache.cxf.jaxrs.json.basic.JsonMapObject;
+import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
+import org.apache.cxf.jaxrs.swagger.openapi.OpenApiConfiguration;
+import org.apache.cxf.jaxrs.swagger.openapi.SwaggerToOpenApiConversionUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
+
+@Provider
+@PreMatching
+public final class SyncopeSwaggerToOpenApiConversionFilter implements ContainerRequestFilter, WriterInterceptor {
+
+    private static final String SWAGGER_PATH = "swagger.json";
+
+    private static final String OPEN_API_PATH = "openapi.json";
+
+    private static final String OPEN_API_PROPERTY = "openapi";
+
+    private OpenApiConfiguration openApiConfig;
+
+    private String openApiJsonPath = OPEN_API_PATH;
+
+    @Override
+    public void filter(final ContainerRequestContext reqCtx) throws IOException {
+        String path = reqCtx.getUriInfo().getPath();
+        if (path.endsWith(openApiJsonPath)) {
+            reqCtx.setRequestUri(URI.create(SWAGGER_PATH));
+            JAXRSUtils.getCurrentMessage().getExchange().put(OPEN_API_PROPERTY, Boolean.TRUE);
+        }
+    }
+
+    public OpenApiConfiguration getOpenApiConfig() {
+        return openApiConfig;
+    }
+
+    public void setOpenApiConfig(final OpenApiConfiguration openApiConfig) {
+        this.openApiConfig = openApiConfig;
+    }
+
+    @Override
+    public void aroundWriteTo(final WriterInterceptorContext context) throws IOException, WebApplicationException {
+        if (isOpenApiRequested()) {
+            OutputStream os = context.getOutputStream();
+            CachedOutputStream cos = new CachedOutputStream();
+
+            context.setOutputStream(cos);
+            context.proceed();
+
+            MessageContext ctx = createMessageContext();
+            String swaggerJson = IOUtils.toString(cos.getInputStream(), StandardCharsets.UTF_8);
+            String openApiJson = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson(
+                    ctx, swaggerJson, openApiConfig);
+
+            JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter();
+            JsonMapObject openapi = readerWriter.fromJsonToJsonObject(openApiJson);
+
+            String basePath = StringUtils.substringBeforeLast(ctx.getHttpServletRequest().getRequestURI(), "/");
+            openapi.setProperty("servers", Arrays.asList(Collections.singletonMap("url", basePath)));
+
+            os.write(readerWriter.toJson(openapi).getBytes(StandardCharsets.UTF_8));
+            os.flush();
+        } else {
+            context.proceed();
+        }
+    }
+
+    private MessageContext createMessageContext() {
+        return JAXRSUtils.createContextValue(JAXRSUtils.getCurrentMessage(), null, MessageContext.class);
+    }
+
+    private boolean isOpenApiRequested() {
+        return Objects.equals(Boolean.TRUE, JAXRSUtils.getCurrentMessage().getExchange().get(OPEN_API_PROPERTY));
+    }
+
+    public void setOpenApiJsonPath(final String openApiJsonPath) {
+        this.openApiJsonPath = openApiJsonPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1310349e/core/rest-cxf/src/main/resources/restCXFContext.xml
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/resources/restCXFContext.xml b/core/rest-cxf/src/main/resources/restCXFContext.xml
index caa1c88..2b38266 100644
--- a/core/rest-cxf/src/main/resources/restCXFContext.xml
+++ b/core/rest-cxf/src/main/resources/restCXFContext.xml
@@ -128,7 +128,7 @@ under the License.
       </map>
     </property>
   </bean>
-  <bean id="sw2OpenAPI" class="org.apache.cxf.jaxrs.swagger.openapi.SwaggerToOpenApiConversionFilter"/>
+  <bean id="sw2OpenAPI" class="org.apache.syncope.core.rest.cxf.SyncopeSwaggerToOpenApiConversionFilter"/>
 
   <jaxrs:server id="restContainer" address="/"
                 basePackages="org.apache.syncope.common.rest.api.service, org.apache.syncope.core.rest.cxf.service" 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1310349e/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/jboss/restCXFContext.xml b/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
index fdefbdf..fdc847d 100644
--- a/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
+++ b/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
@@ -142,7 +142,7 @@ under the License.
       </map>
     </property>
   </bean>
-  <bean id="sw2OpenAPI" class="org.apache.cxf.jaxrs.swagger.openapi.SwaggerToOpenApiConversionFilter"/>
+  <bean id="sw2OpenAPI" class="org.apache.syncope.core.rest.cxf.SyncopeSwaggerToOpenApiConversionFilter"/>
 
   <jaxrs:server id="restContainer" address="/"
                 basePackages="org.apache.syncope.common.rest.api.service, org.apache.syncope.core.rest.cxf.service"