/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.web.internal.cors;
import com.google.common.collect.Lists;
import com.thetransactioncompany.cors.CORSFilter;
import io.nuun.kernel.api.plugin.InitState;
import io.nuun.kernel.api.plugin.context.InitContext;
import org.seedstack.seed.core.internal.AbstractSeedPlugin;
import org.seedstack.seed.web.WebConfig;
import org.seedstack.seed.web.spi.FilterDefinition;
import org.seedstack.seed.web.spi.ListenerDefinition;
import org.seedstack.seed.web.spi.SeedFilterPriority;
import org.seedstack.seed.web.spi.ServletDefinition;
import org.seedstack.seed.web.spi.WebProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WebCORSPlugin extends AbstractSeedPlugin implements WebProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(WebCORSPlugin.class);
private WebConfig.CORSConfig corsConfig;
@Override
public String name() {
return "web-cors";
}
@Override
protected InitState initialize(InitContext initContext) {
corsConfig = getConfiguration(WebConfig.CORSConfig.class);
return InitState.INITIALIZED;
}
@Override
public Object nativeUnitModule() {
if (corsConfig.isEnabled()) {
return new WebCORSModule();
} else {
return null;
}
}
@Override
public List<ServletDefinition> servlets() {
return null;
}
@Override
public List<FilterDefinition> filters() {
if (corsConfig.isEnabled()) {
LOGGER.info("CORS support enabled on {}", corsConfig.getPath());
FilterDefinition filterDefinition = new FilterDefinition("web-cors", CORSFilter.class);
filterDefinition.setPriority(SeedFilterPriority.CORS);
filterDefinition.setAsyncSupported(true);
filterDefinition.addInitParameters(buildCorsParameters());
filterDefinition.addMappings(new FilterDefinition.Mapping(corsConfig.getPath()));
return Lists.newArrayList(filterDefinition);
} else {
return null;
}
}
private Map<String, String> buildCorsParameters() {
Map<String, String> corsParameters = new HashMap<>();
for (Map.Entry<String, String> entry : corsConfig.getProperties().entrySet()) {
corsParameters.put("cors." + entry.getKey(), entry.getValue());
}
return corsParameters;
}
@Override
public List<ListenerDefinition> listeners() {
return null;
}
}