don't extend swagger classes, i'll just do the work myself. fixes issues with weld

This commit is contained in:
Athou
2013-04-17 09:54:52 +02:00
parent 8343434882
commit 8486f7b57e
2 changed files with 61 additions and 95 deletions

View File

@@ -1,120 +1,63 @@
package com.commafeed.frontend.rest; package com.commafeed.frontend.rest;
import java.util.Enumeration;
import javax.inject.Inject; import javax.inject.Inject;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.Application; import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import com.commafeed.backend.services.ApplicationSettingsService; import com.commafeed.backend.services.ApplicationSettingsService;
import com.commafeed.frontend.model.Entries; import com.commafeed.frontend.model.Entries;
import com.wordnik.swagger.annotations.Api; import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation; import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.core.Documentation;
import com.wordnik.swagger.core.DocumentationEndPoint;
import com.wordnik.swagger.core.SwaggerSpec; import com.wordnik.swagger.core.SwaggerSpec;
import com.wordnik.swagger.jaxrs.ConfigReader; import com.wordnik.swagger.core.util.TypeUtil;
import com.wordnik.swagger.jaxrs.JavaApiListing;
@Path("/resources") @Path("/resources")
@Api("/resources") @Api("/resources")
@Produces({ "application/json" }) @Produces({ "application/json" })
public class ApiListingResource extends JavaApiListing { public class ApiListingResource {
public static final String API_VERSION = "1.0";
@Inject @Inject
ApplicationSettingsService applicationSettingsService; ApplicationSettingsService applicationSettingsService;
@Override
@GET @GET
@ApiOperation(value = "Returns list of all available api endpoints", responseClass = "List[DocumentationEndPoint]") @ApiOperation(value = "Returns list of all available api endpoints", responseClass = "List[DocumentationEndPoint]")
public Response getAllApis(@Context final ServletConfig sc, public Response getAllApis(@Context Application app) {
@Context Application app, @Context HttpHeaders headers,
@Context UriInfo uriInfo) {
return super.getAllApis(new ServletConfigProxy( TypeUtil.addAllowablePackage(Entries.class.getPackage().getName());
applicationSettingsService.get().getPublicUrl(), sc), app,
headers, uriInfo); Documentation doc = new Documentation();
for (Class<?> resource : app.getClasses()) {
if (ApiListingResource.class.equals(resource)) {
continue;
}
Api api = resource.getAnnotation(Api.class);
if (api != null) {
doc.addApi(new DocumentationEndPoint(api.value(), api
.description()));
}
}
doc.setSwaggerVersion(SwaggerSpec.version());
doc.setBasePath(getBasePath(applicationSettingsService.get()
.getPublicUrl()));
doc.setApiVersion(API_VERSION);
return Response.ok().entity(doc).build();
} }
public static class ServletConfigProxy implements ServletConfig { public static String getBasePath(String publicUrl) {
if (publicUrl.endsWith("/")) {
private ServletConfig sc; publicUrl = publicUrl.substring(0, publicUrl.length() - 1);
private String publicUrl;
public ServletConfigProxy(String publicUrl, ServletConfig sc) {
this.sc = sc;
this.publicUrl = publicUrl;
}
@Override
public String getServletName() {
return sc.getServletName();
}
@Override
public ServletContext getServletContext() {
return sc.getServletContext();
}
@Override
public String getInitParameter(String name) {
if ("swagger.config.reader".equals(name)) {
return CustomConfigReader.class.getName();
}
if (CustomConfigReader.class.getName().equals(name)) {
return publicUrl;
}
return sc.getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {
return sc.getInitParameterNames();
} }
return publicUrl + "/rest";
} }
public static class CustomConfigReader extends ConfigReader {
private ServletConfig config;
public CustomConfigReader(ServletConfig config) {
this.config = config;
}
@Override
public String basePath() {
String publicUrl = config.getInitParameter(CustomConfigReader.class
.getName());
if (publicUrl.endsWith("/")) {
publicUrl = publicUrl.substring(0, publicUrl.length() - 1);
}
return publicUrl + "/rest";
}
@Override
public String swaggerVersion() {
return SwaggerSpec.version();
}
@Override
public String apiVersion() {
return "1.0";
}
@Override
public String modelPackages() {
return Entries.class.getPackage().getName();
}
@Override
public String apiFilterClassName() {
return null;
}
}
} }

View File

@@ -46,14 +46,20 @@ import com.commafeed.backend.services.UserService;
import com.commafeed.frontend.CommaFeedApplication; import com.commafeed.frontend.CommaFeedApplication;
import com.commafeed.frontend.CommaFeedSession; import com.commafeed.frontend.CommaFeedSession;
import com.commafeed.frontend.SecurityCheck; import com.commafeed.frontend.SecurityCheck;
import com.commafeed.frontend.rest.ApiListingResource.ServletConfigProxy; import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.rest.ApiListingResource;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation; import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.jaxrs.JavaHelp; import com.wordnik.swagger.core.Documentation;
import com.wordnik.swagger.core.SwaggerSpec;
import com.wordnik.swagger.core.util.TypeUtil;
import com.wordnik.swagger.jaxrs.HelpApi;
import com.wordnik.swagger.jaxrs.JaxrsApiReader;
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
@SecurityCheck(Role.USER) @SecurityCheck(Role.USER)
public abstract class AbstractREST extends JavaHelp { public abstract class AbstractREST {
@Context @Context
HttpServletRequest request; HttpServletRequest request;
@@ -164,13 +170,30 @@ public abstract class AbstractREST extends JavaHelp {
return authorized; return authorized;
} }
@Override
@GET @GET
@ApiOperation(value = "Returns information about API parameters", responseClass = "com.wordnik.swagger.core.Documentation") @ApiOperation(value = "Returns information about API parameters", responseClass = "com.wordnik.swagger.core.Documentation")
public Response getHelp(@Context ServletConfig sc, public Response getHelp(@Context ServletConfig sc,
@Context HttpHeaders headers, @Context UriInfo uriInfo) { @Context HttpHeaders headers, @Context UriInfo uriInfo) {
return super.getHelp(new ServletConfigProxy(applicationSettingsService
.get().getPublicUrl(), sc), headers, uriInfo);
}
TypeUtil.addAllowablePackage(Entries.class.getPackage().getName());
String apiVersion = ApiListingResource.API_VERSION;
String swaggerVersion = SwaggerSpec.version();
String basePath = ApiListingResource
.getBasePath(applicationSettingsService.get().getPublicUrl());
Api api = this.getClass().getAnnotation(Api.class);
if (api == null) {
return Response.status(Status.NOT_FOUND).build();
}
String apiPath = null;
String apiListingPath = api.value();
Documentation doc = new HelpApi("").filterDocs(JaxrsApiReader.read(
getClass(), apiVersion, swaggerVersion, basePath, apiPath),
headers, uriInfo, apiListingPath, apiPath);
doc.setSwaggerVersion(swaggerVersion);
doc.setBasePath(basePath);
doc.setApiVersion(apiVersion);
return Response.ok().entity(doc).build();
}
} }