package com.aol.micro.server.module;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import cyclops.collections.immutable.PStackX;
import org.springframework.context.ApplicationContext;
import org.springframework.web.filter.DelegatingFilterProxy;
import com.aol.micro.server.auto.discovery.JaxRsResource;
import com.aol.micro.server.auto.discovery.JaxRsResourceWrapper;
import com.aol.micro.server.servers.model.FilterData;
import com.aol.micro.server.servers.model.ServerData;
import com.aol.micro.server.servers.model.ServletData;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class ModuleDataExtractor {
private final Module module;
public PStackX getRestResources(ApplicationContext rootContext){
List resources = new ArrayList<>();
module.getRestResourceClasses().forEach(it -> resources.addAll(rootContext.getBeansOfType(it).values()));
module.getRestAnnotationClasses().forEach(it -> resources.addAll(rootContext.getBeansWithAnnotation(it).values()));
rootContext.getBeansWithAnnotation(JaxRsResource.class).forEach((n,it)->resources.add(it));
rootContext.getBeansOfType(JaxRsResourceWrapper.class).forEach((n,it)->resources.add(it.getResource()));
resources.addAll(module.getJaxRsResourceObjects());
return PStackX.fromCollection(resources);
}
public List<FilterData> createFilteredDataList(ServerData data) {
Map<String,Filter> filterMap = module.getFilters(data);
return filterMap.entrySet().stream().map( e -> {
return new FilterData(e.getKey(), e.getValue().getClass().getName(), new DelegatingFilterProxy(e.getValue()));
}).collect(Collectors.toList());
}
public List<ServletData> createServletDataList(ServerData data) {
Map<String,Servlet> servletMap = module.getServlets(data);
return servletMap.entrySet().stream().map( e -> {
return new ServletData( e.getValue().getClass().getName(), e.getValue().getClass(), e.getKey());
}).collect(Collectors.toList());
}
}