Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
refs #1482 adds swagger.context.id support + bug fix
  • Loading branch information
frantuma committed Jan 19, 2016
1 parent c340be9 commit 451d6c2
Show file tree
Hide file tree
Showing 7 changed files with 312 additions and 94 deletions.
Expand Up @@ -4,10 +4,6 @@

public interface SwaggerConfig {

public static final String CONFIG_ID_KEY = "swagger.config.id";
public static final String CONFIG_ID_PREFIX = CONFIG_ID_KEY + ".";
public static final String CONFIG_ID_DEFAULT = CONFIG_ID_PREFIX + "default";

Swagger configure(Swagger swagger);

String getFilterClass();
Expand Down
Expand Up @@ -3,10 +3,6 @@
public abstract class AbstractScanner {
protected boolean prettyPrint = false;

public static final String SCANNER_ID_KEY = "swagger.scanner.id";
public static final String SCANNER_ID_PREFIX = SCANNER_ID_KEY + ".";
public static final String SCANNER_ID_DEFAULT = SCANNER_ID_PREFIX + "default";

public boolean getPrettyPrint() {
return prettyPrint;
}
Expand Down
Expand Up @@ -50,6 +50,7 @@ public class BeanConfig extends AbstractScanner implements Scanner, SwaggerConfi

String scannerId;
String configId;
String contextId;

public String getResourcePackage() {
return this.resourcePackage;
Expand Down Expand Up @@ -147,6 +148,14 @@ public void setFilterClass(String filterClass) {
this.filterClass = filterClass;
}

public String getContextId() {
return contextId;
}

public void setContextId(String contextId) {
this.contextId = contextId;
}

public String getScannerId() {
return scannerId;
}
Expand Down Expand Up @@ -196,6 +205,7 @@ public void setScan(boolean shouldScan) {
new SwaggerContextService()
.withConfigId(configId)
.withScannerId(scannerId)
.withContextId(contextId)
.withServletConfig(servletConfig)
.withSwaggerConfig(this)
.withScanner(this)
Expand Down
Expand Up @@ -10,7 +10,8 @@ public class SwaggerConfigLocator {

private static SwaggerConfigLocator instance;

private ConcurrentMap<String, SwaggerConfig> map = new ConcurrentHashMap<String, SwaggerConfig>();
private ConcurrentMap<String, SwaggerConfig> configMap = new ConcurrentHashMap<String, SwaggerConfig>();
private ConcurrentMap<String, Swagger> swaggerMap = new ConcurrentHashMap<String, Swagger>();

public static SwaggerConfigLocator getInstance() {
if (instance == null) {
Expand All @@ -23,7 +24,7 @@ private SwaggerConfigLocator() {
}

public SwaggerConfig getConfig(String id) {
return map.getOrDefault(id, new SwaggerConfig() {
return configMap.getOrDefault(id, new SwaggerConfig() {
@Override
public Swagger configure(Swagger swagger) {
return swagger;
Expand All @@ -37,6 +38,15 @@ public String getFilterClass() {
}

public void putConfig(String id, SwaggerConfig config) {
map.putIfAbsent(id, config);
configMap.putIfAbsent(id, config);
}

public Swagger getSwagger(String id) {
return swaggerMap.getOrDefault(id, new Swagger());
}

public void putSwagger(String id, Swagger swagger) {
swaggerMap.putIfAbsent(id, swagger);
}

}
Expand Up @@ -3,16 +3,28 @@
import io.swagger.config.Scanner;
import io.swagger.config.ScannerFactory;
import io.swagger.config.SwaggerConfig;
import io.swagger.models.Swagger;

import javax.servlet.ServletConfig;

public class SwaggerContextService {

public static final String CONFIG_ID_KEY = "swagger.config.id";
public static final String CONFIG_ID_PREFIX = CONFIG_ID_KEY + ".";
public static final String CONFIG_ID_DEFAULT = CONFIG_ID_PREFIX + "default";

public static final String SCANNER_ID_KEY = "swagger.scanner.id";
public static final String SCANNER_ID_PREFIX = SCANNER_ID_KEY + ".";
public static final String SCANNER_ID_DEFAULT = SCANNER_ID_PREFIX + "default";

public static final String CONTEXT_ID_KEY = "swagger.context.id";

private ServletConfig sc;
private String configId;
private SwaggerConfig swaggerConfig;
private String scannerId;
private Scanner scanner;
private String contextId;

public void setScannerId(String scannerId) {
this.scannerId = scannerId;
Expand All @@ -30,6 +42,10 @@ public void setSwaggerConfig(SwaggerConfig swaggerConfig) {
this.swaggerConfig = swaggerConfig;
}

public void setContextId(String contextId) {
this.contextId = contextId;
}

public void setSc(ServletConfig sc) {
this.sc = sc;
}
Expand All @@ -54,21 +70,35 @@ public SwaggerContextService withScannerId(String scannerId) {
return this;
}

public SwaggerContextService withContextId(String contextId) {
this.contextId = contextId;
return this;
}

public SwaggerContextService withScanner(Scanner scanner) {
this.scanner = scanner;
return this;
}

public SwaggerContextService initConfig() {
return initConfig(null);
}

public SwaggerContextService initConfig(Swagger swagger) {

String configIdKey;
if (configId != null) {
configIdKey = SwaggerConfig.CONFIG_ID_PREFIX + configId;
configIdKey = CONFIG_ID_PREFIX + configId;
} else if (contextId != null) {
configIdKey = CONFIG_ID_PREFIX + contextId;
} else {
if (sc != null) {
configIdKey = (sc.getInitParameter(SwaggerConfig.CONFIG_ID_KEY) != null) ? SwaggerConfig.CONFIG_ID_PREFIX + sc.getInitParameter(SwaggerConfig.CONFIG_ID_KEY) : SwaggerConfig.CONFIG_ID_DEFAULT;
configIdKey = (sc.getInitParameter(CONFIG_ID_KEY) != null) ? CONFIG_ID_PREFIX + sc.getInitParameter(CONFIG_ID_KEY) : null;
if (configIdKey == null) {
configIdKey = (sc.getInitParameter(CONTEXT_ID_KEY) != null) ? CONFIG_ID_PREFIX + sc.getInitParameter(CONTEXT_ID_KEY) : CONFIG_ID_DEFAULT;
}
} else {
configIdKey = SwaggerConfig.CONFIG_ID_DEFAULT;
configIdKey = CONFIG_ID_DEFAULT;
}
}
SwaggerConfig value = (swaggerConfig != null) ? swaggerConfig : null;
Expand All @@ -78,35 +108,86 @@ public SwaggerContextService initConfig() {
if (value != null) {
SwaggerConfigLocator.getInstance().putConfig(configIdKey, value);
}
if (swagger != null) {
SwaggerConfigLocator.getInstance().putSwagger(configIdKey, swagger);
}
return this;

}

private Object getConfigOrSwagger(boolean returnSwagger) {
String configIdKey;
if (configId != null) {
configIdKey = CONFIG_ID_PREFIX + configId;
} else if (contextId != null) {
configIdKey = CONFIG_ID_PREFIX + contextId;
} else {
if (sc != null) {
configIdKey = (sc.getInitParameter(CONFIG_ID_KEY) != null) ? CONFIG_ID_PREFIX + sc.getInitParameter(CONFIG_ID_KEY) : null;
if (configIdKey == null) {
configIdKey = (sc.getInitParameter(CONTEXT_ID_KEY) != null) ? CONFIG_ID_PREFIX + sc.getInitParameter(CONTEXT_ID_KEY) : CONFIG_ID_DEFAULT;
}
} else {
configIdKey = CONFIG_ID_DEFAULT;
}
}
if (returnSwagger) {
return SwaggerConfigLocator.getInstance().getSwagger(configIdKey);
} else {
return SwaggerConfigLocator.getInstance().getConfig(configIdKey);
}
}

public SwaggerConfig getConfig() {
return (SwaggerConfig)getConfigOrSwagger(false);
}

public Swagger getSwagger() {
Swagger value = (Swagger) getConfigOrSwagger(true);
if (value == null && sc != null) {
value = (Swagger) sc.getServletContext().getAttribute("swagger");

This comment has been minimized.

Copy link
@CedricReichenbach

CedricReichenbach Sep 26, 2016

Why is the Swagger instance read from servlet context here, but never written to (as far as I can see)?

Looks like this "caching" of the Swagger instance should have been moved here from ApiListingResource, but the set part was accidentally dropped. Or am I missing something?

}
return value;
}

public SwaggerContextService updateSwagger(Swagger swagger) {

String configIdKey;
if (configId != null) {
configIdKey = SwaggerConfig.CONFIG_ID_PREFIX + configId;
configIdKey = CONFIG_ID_PREFIX + configId;
} else if (contextId != null) {
configIdKey = CONFIG_ID_PREFIX + contextId;
} else {
if (sc != null) {
configIdKey = (sc.getInitParameter(SwaggerConfig.CONFIG_ID_KEY) != null) ? SwaggerConfig.CONFIG_ID_PREFIX + sc.getInitParameter(SwaggerConfig.CONFIG_ID_KEY) : SwaggerConfig.CONFIG_ID_DEFAULT;
configIdKey = (sc.getInitParameter(CONFIG_ID_KEY) != null) ? CONFIG_ID_PREFIX + sc.getInitParameter(CONFIG_ID_KEY) : null;
if (configIdKey == null) {
configIdKey = (sc.getInitParameter(CONTEXT_ID_KEY) != null) ? CONFIG_ID_PREFIX + sc.getInitParameter(CONTEXT_ID_KEY) : CONFIG_ID_DEFAULT;
}
} else {
configIdKey = SwaggerConfig.CONFIG_ID_DEFAULT;
configIdKey = CONFIG_ID_DEFAULT;
}
}
return SwaggerConfigLocator.getInstance().getConfig(configIdKey);
if (swagger != null) {
SwaggerConfigLocator.getInstance().putSwagger(configIdKey, swagger);
}
return this;

}

public SwaggerContextService initScanner() {
String scannerIdKey;
if (scannerId != null) {
scannerIdKey = AbstractScanner.SCANNER_ID_PREFIX + scannerId;
scannerIdKey = SCANNER_ID_PREFIX + scannerId;
} else if (contextId != null) {
scannerIdKey = SCANNER_ID_PREFIX + contextId;
} else {
if (sc != null) {
scannerIdKey = (sc.getInitParameter(AbstractScanner.SCANNER_ID_KEY) != null) ? AbstractScanner.SCANNER_ID_PREFIX + sc.getInitParameter(AbstractScanner.SCANNER_ID_KEY) : AbstractScanner.SCANNER_ID_DEFAULT;
scannerIdKey = (sc.getInitParameter(SCANNER_ID_KEY) != null) ? SCANNER_ID_PREFIX + sc.getInitParameter(SCANNER_ID_KEY) : null;
if (scannerIdKey == null) {
scannerIdKey = (sc.getInitParameter(CONTEXT_ID_KEY) != null) ? SCANNER_ID_PREFIX + sc.getInitParameter(CONTEXT_ID_KEY) : SCANNER_ID_DEFAULT;
}
} else {
scannerIdKey = AbstractScanner.SCANNER_ID_DEFAULT;
scannerIdKey = SCANNER_ID_DEFAULT;
}
}
Scanner value = (scanner != null) ? scanner : new DefaultJaxrsScanner();
Expand All @@ -127,13 +208,18 @@ public Scanner getScanner() {
String scannerIdKey;
Scanner value = null;
if (scannerId != null) {
scannerIdKey = AbstractScanner.SCANNER_ID_PREFIX + scannerId;
scannerIdKey = SCANNER_ID_PREFIX + scannerId;
} else if (contextId != null) {
scannerIdKey = SCANNER_ID_PREFIX + contextId;
} else {
if (sc != null) {
scannerIdKey = (sc.getInitParameter(AbstractScanner.SCANNER_ID_KEY) != null) ? AbstractScanner.SCANNER_ID_PREFIX + sc.getInitParameter(AbstractScanner.SCANNER_ID_KEY) : AbstractScanner.SCANNER_ID_DEFAULT;
scannerIdKey = (sc.getInitParameter(SCANNER_ID_KEY) != null) ? SCANNER_ID_PREFIX + sc.getInitParameter(SCANNER_ID_KEY) : null;
if (scannerIdKey == null) {
scannerIdKey = (sc.getInitParameter(CONTEXT_ID_KEY) != null) ? SCANNER_ID_PREFIX + sc.getInitParameter(CONTEXT_ID_KEY) : SCANNER_ID_DEFAULT;
}
value = (Scanner) sc.getServletContext().getAttribute(scannerIdKey);
} else {
scannerIdKey = AbstractScanner.SCANNER_ID_DEFAULT;
scannerIdKey = SCANNER_ID_DEFAULT;
}
}
if (value != null) {
Expand All @@ -147,10 +233,38 @@ public Scanner getScanner() {
}

public static boolean isScannerIdInitParamDefined(ServletConfig sc) {
return (sc.getInitParameter(AbstractScanner.SCANNER_ID_KEY) != null) ? true : false;
String key = sc.getInitParameter(SCANNER_ID_KEY);
if (key != null){
return true;
} else {
return (sc.getInitParameter(CONTEXT_ID_KEY) != null) ? true : false;
}
}

public static String getScannerIdFromInitParam(ServletConfig sc) {
return sc.getInitParameter(AbstractScanner.SCANNER_ID_KEY);
String key = sc.getInitParameter(SCANNER_ID_KEY);
if (key != null){
return key;
} else {
return sc.getInitParameter(CONTEXT_ID_KEY);
}
}

public static boolean isConfigIdInitParamDefined(ServletConfig sc) {
String key = sc.getInitParameter(CONFIG_ID_KEY);
if (key != null){
return true;
} else {
return (sc.getInitParameter(CONTEXT_ID_KEY) != null) ? true : false;
}
}

public static String getConfigIdFromInitParam(ServletConfig sc) {
String key = sc.getInitParameter(CONFIG_ID_KEY);
if (key != null){
return key;
} else {
return sc.getInitParameter(CONTEXT_ID_KEY);
}
}
}
Expand Up @@ -42,6 +42,7 @@ public class ApiListingResource {
private static volatile boolean initialized = false;

private static volatile ConcurrentMap<String, Boolean> initializedScanner = new ConcurrentHashMap<String, Boolean>();
private static volatile ConcurrentMap<String, Boolean> initializedConfig = new ConcurrentHashMap<String, Boolean>();

Logger LOGGER = LoggerFactory.getLogger(ApiListingResource.class);

Expand All @@ -54,8 +55,8 @@ protected synchronized Swagger scan(Application app, ServletConfig sc) {
Scanner scanner = ctxService.getScanner();
if (scanner != null) {
SwaggerSerializers.setPrettyPrint(scanner.getPrettyPrint());
swagger = (Swagger) context.getAttribute("swagger");

//swagger = (Swagger) context.getAttribute("swagger");
swagger = new SwaggerContextService().withServletConfig(sc).getSwagger();
Set<Class<?>> classes;
if (scanner instanceof JaxrsScanner) {
JaxrsScanner jaxrsScanner = (JaxrsScanner) scanner;
Expand All @@ -66,7 +67,6 @@ protected synchronized Swagger scan(Application app, ServletConfig sc) {
if (classes != null) {
Reader reader = new Reader(swagger, ReaderConfigUtils.getReaderConfig(context));
swagger = reader.read(classes);
// leave for compatibility? only ReflectiveJaxrsScanner implements this, but client could call
if (scanner instanceof SwaggerConfig) {
swagger = ((SwaggerConfig) scanner).configure(swagger);
} else {
Expand All @@ -78,11 +78,16 @@ protected synchronized Swagger scan(Application app, ServletConfig sc) {
LOGGER.debug("no configurator");
}
}
context.setAttribute("swagger", swagger);
//context.setAttribute("swagger", swagger);
new SwaggerContextService().withServletConfig(sc).updateSwagger(swagger);
}
}
if (SwaggerContextService.isScannerIdInitParamDefined(sc)) {
initializedScanner.putIfAbsent(SwaggerContextService.getScannerIdFromInitParam(sc), true);
LOGGER.error("scan isScannerIdInitParamDefined " + sc.getServletName() + "_" + SwaggerContextService.getScannerIdFromInitParam(sc));
initializedScanner.putIfAbsent(sc.getServletName() + "_" + SwaggerContextService.getScannerIdFromInitParam(sc), true);
} else if (SwaggerContextService.isConfigIdInitParamDefined(sc)) {
LOGGER.error("scan isConfigIdInitParamDefined " + sc.getServletName() + "_" + SwaggerContextService.getConfigIdFromInitParam(sc));
initializedConfig.putIfAbsent(sc.getServletName() + "_" + SwaggerContextService.getConfigIdFromInitParam(sc), true);
} else {
initialized = true;
}
Expand All @@ -95,15 +100,24 @@ private Swagger process(
ServletConfig sc,
HttpHeaders headers,
UriInfo uriInfo) {
Swagger swagger = (Swagger) context.getAttribute("swagger");
Swagger swagger = new SwaggerContextService().withServletConfig(sc).getSwagger();
//Swagger swagger = (Swagger) context.getAttribute("swagger");
synchronized (ApiListingResource.class) {
if (SwaggerContextService.isScannerIdInitParamDefined(sc)) {
if (!initializedScanner.getOrDefault(SwaggerContextService.getScannerIdFromInitParam(sc), false)) {
LOGGER.error("process isScannerIdInitParamDefined " + sc.getServletName() + "_" + SwaggerContextService.getScannerIdFromInitParam(sc));
if (!initializedScanner.getOrDefault(sc.getServletName() + "_" + SwaggerContextService.getScannerIdFromInitParam(sc), false)) {
swagger = scan(app, sc);
}
} else {
if (!initialized) {
swagger = scan(app, sc);
LOGGER.error("process isConfigIdInitParamDefined " + sc.getServletName() + "_" + SwaggerContextService.getConfigIdFromInitParam(sc));
if (SwaggerContextService.isConfigIdInitParamDefined(sc)) {
if (!initializedConfig.getOrDefault(sc.getServletName() + "_" + SwaggerContextService.getConfigIdFromInitParam(sc), false)) {
swagger = scan(app, sc);
}
} else {
if (!initialized) {
swagger = scan(app, sc);
}
}
}
}
Expand Down

0 comments on commit 451d6c2

Please sign in to comment.