package netflix.admin;
import com.google.inject.Injector;
import com.netflix.config.ConfigurationManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.servlet.Filter;
@Singleton
public class AdminConfigImpl implements AdminContainerConfig {
private static final Logger logger = LoggerFactory.getLogger(AdminConfigImpl.class);
public static final String NETFLIX_ADMIN_TEMPLATE_CONTEXT = "netflix.admin.template.context";
public static final String TEMPLATE_CONTEXT_DEFAULT = "/admin";
public static final String NETFLIX_ADMIN_RESOURCE_CONTEXT = "netflix.admin.resource.context";
public static final String RESOURCE_CONTEXT_DEFAULT = "/webadmin";
private static final String JERSEY_CORE_RESOURCES = "netflix.platform.admin.resources.core.packages";
public static final String JERSEY_CORE_RESOURCES_DEFAULT = "netflix.adminresources;com.netflix.explorers.resources;com.netflix.explorers.providers";
private static final String JERSEY_VIEWABLE_RESOURCES = "netflix.platform.admin.resources.viewable.packages";
public static final String JERSEY_VIEWABLE_RESOURCES_DEFAULT = "netflix.admin;netflix.adminresources.pages;com.netflix.explorers.resources";
public static final String CONTAINER_LISTEN_PORT = "netflix.platform.admin.resources.port";
public static final int LISTEN_PORT_DEFAULT = 8077;
public static final String SERVER_ENABLE_PROP_NAME = "netflix.platform.admin.resources.enable";
public static final boolean SERVER_ENABLE_DEFAULT = true;
public static final String NETFLIX_ADMIN_RESOURCES_ISOLATE = "netflix.admin.resources.isolate";
public static final boolean ISOLATE_RESOURCES_DEFAULT = false;
public static final String NETFLIX_ADMIN_CTX_FILTERS = "netflix.admin.additional.filters";
public static final String DEFAULT_CONTEXT_FILTERS = "";
private final Injector injector;
public AdminConfigImpl() {
this(null);
}
@Inject
public AdminConfigImpl(Injector injector) {
this.injector = injector;
}
@Override
public boolean shouldIsolateResources() {
return ConfigurationManager.getConfigInstance().getBoolean(NETFLIX_ADMIN_RESOURCES_ISOLATE, ISOLATE_RESOURCES_DEFAULT);
}
@Override
public boolean shouldEnable() {
return ConfigurationManager.getConfigInstance().getBoolean(SERVER_ENABLE_PROP_NAME, SERVER_ENABLE_DEFAULT);
}
@Override
public String templateResourceContext() {
return ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_TEMPLATE_CONTEXT, TEMPLATE_CONTEXT_DEFAULT);
}
@Override
public String ajaxDataResourceContext() {
return ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_RESOURCE_CONTEXT, RESOURCE_CONTEXT_DEFAULT);
}
@Override
public String jerseyResourcePkgList() {
return ConfigurationManager.getConfigInstance().getString(JERSEY_CORE_RESOURCES, JERSEY_CORE_RESOURCES_DEFAULT);
}
@Override
public String jerseyViewableResourcePkgList() {
return ConfigurationManager.getConfigInstance().getString(JERSEY_VIEWABLE_RESOURCES, JERSEY_VIEWABLE_RESOURCES_DEFAULT);
}
@Override
public boolean shouldScanClassPathForPluginDiscovery() {
return true;
}
@Override
public int listenPort() {
return ConfigurationManager.getConfigInstance().getInt(CONTAINER_LISTEN_PORT, LISTEN_PORT_DEFAULT);
}
@Override
public List<Filter> additionalFilters() {
String rootContextFilters = ConfigurationManager.getConfigInstance().getString(NETFLIX_ADMIN_CTX_FILTERS, DEFAULT_CONTEXT_FILTERS);
if (rootContextFilters.isEmpty()) {
return Collections.emptyList();
}
List<Filter> filters = new ArrayList<>();
final String[] filterClasses = rootContextFilters.split(",");
for (String filterClass : filterClasses) {
try {
final Class<?> filterCls = Class.forName(filterClass, false, getClass().getClassLoader());
if (Filter.class.isAssignableFrom(filterCls)) {
filters.add((Filter)(injector == null ? filterCls.newInstance() : injector.getInstance(filterCls)));
}
} catch (InstantiationException | IllegalAccessException e) {
logger.warn("Filter class can not be instantiated " + filterClass);
} catch (ClassNotFoundException e) {
logger.warn("Filter class not found " + filterClass);
}
}
return filters;
}
}