package org.ff4j.web.api;
/*
* #%L
* ff4j-webapi-jersey2x
* %%
* Copyright (C) 2013 - 2015 FF4J
* %%
* Licensed 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.
* #L%
*/
import org.ff4j.FF4j;
import org.ff4j.web.ApiConfig;
import org.ff4j.web.api.filter.JerseyApplicationEventListener;
import org.ff4j.web.api.filter.JerseyRequestEventListener;
import org.ff4j.web.api.resources.FF4jResource;
import org.ff4j.web.api.security.FF4jAuthenticationFilter;
import org.ff4j.web.api.security.FF4jAuthorizationFilter;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.swagger.config.ScannerFactory;
import io.swagger.jaxrs.config.BeanConfig;
/**
* Parent class to provide FF4J REST API using Jersey2x.
*
* @author Cedrick Lunven (@clunven)</a>
*/
public abstract class FF4jApiApplicationJersey2x extends ResourceConfig {
/** logger for this class. */
protected final Logger log = LoggerFactory.getLogger(getClass());
/**
* Configuration for this.
*/
private ApiConfig apiConfig;
/**
* Initialisation of Jersey2 application.
*
* @param serviceLocator
*/
public FF4jApiApplicationJersey2x() {
init();
}
protected abstract ApiConfig getWebApiConfiguration();
/**
* Injection of FF4J.
*
* @author Cedrick Lunven (@clunven)</a>
*/
public class FF4jBinder extends AbstractBinder {
@Override
protected void configure() {
// singleton instance binding
bind(getWebApiConfiguration().getFF4j()).to(FF4j.class);
log.info("FF4J is now bound to Jersey Context.");
}
}
/**
* Initialisation of Jersey2 application.
*
* @param serviceLocator
*/
public void init() {
log.info(" __ __ _ _ _ ");
log.info(" / _|/ _| || | (_)");
log.info("| |_| |_| || |_| |");
log.info("| _| _|__ _| |");
log.info("|_| |_| |_|_/ |");
log.info(" |__/ WEB API Initialization...");
log.info(" ");
apiConfig = getWebApiConfiguration();
packages(FF4jResource.class.getPackage().getName());
register(new FF4jBinder());
register(JerseyApplicationEventListener.class);
register(JerseyRequestEventListener.class);
if (apiConfig != null) {
if (apiConfig.isAutorize()) {
enableAuthenticationFilter();
enableAuthorizationFilter();
} else if (apiConfig.isAuthenticate()) {
enableAuthenticationFilter();
}
// Swagger configuration
if (apiConfig.isDocumentation()) {
BeanConfig beanConfig = new BeanConfig();
beanConfig.setTitle("FF4J (ff4j.org) WebAPI");
beanConfig.setDescription("Administrate and operate all tasks on your features through this api");
beanConfig.setResourcePackage("org.ff4j.web.api.resources");
beanConfig.setContact("@clunven");
beanConfig.setLicense("Apache 2.0");
beanConfig.setLicenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html");
beanConfig.setVersion(apiConfig.getVersion());
beanConfig.setSchemes(new String[] {"http"});
beanConfig.setHost(apiConfig.getHost() + ":" + apiConfig.getPort());
beanConfig.setBasePath("/" + apiConfig.getWebContext() + "/api");
beanConfig.setScan(true);
ScannerFactory.setScanner(beanConfig);
register(io.swagger.jaxrs.listing.ApiListingResource.class);
register(io.swagger.jaxrs.listing.SwaggerSerializers.class);
log.info("Initialisation Swagger [OK]");
}
}
log.info("Initialisation WebAPI [OK]");
}
private void enableAuthenticationFilter() {
FF4jAuthenticationFilter.setApiConfig(apiConfig);
register(FF4jAuthenticationFilter.class);
log.info("WebService Authentication is now enabled");
}
private void enableAuthorizationFilter() {
FF4jAuthorizationFilter.setApiConfig(apiConfig);
register(FF4jAuthorizationFilter.class);
log.info("WebService Authorization is now enabled");
}
}