package codeine.servlets.api_servlets.projects;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import codeine.ConfigurationManagerServer;
import codeine.api.NodeAggregator;
import codeine.jsons.project.CodeineProject;
import codeine.jsons.project.ProjectJson;
import codeine.permissions.IUserWithPermissions;
import codeine.permissions.UserPermissionsGetter;
import codeine.plugins.AfterProjectModifyPlugin;
import codeine.plugins.AfterProjectModifyPlugin.StatusChange;
import codeine.servlet.AbstractApiServlet;
import codeine.utils.JsonUtils;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
public class ProjectsListApiServlet extends AbstractApiServlet
{
private static final Logger log = Logger.getLogger(ProjectsListApiServlet.class);
private static final long serialVersionUID = 1L;
@Inject private ConfigurationManagerServer configurationManager;
@Inject private UserPermissionsGetter permissionsManager;
@Inject private NodeAggregator aggregator;
@Inject private AfterProjectModifyPlugin afterProjectModifyPlugin;
@Override
protected void myGet(HttpServletRequest request, HttpServletResponse response) {
String query = getParameter(request, "projectSearch");
List<ProjectJson> configuredProjects = filter(configurationManager.getConfiguredProjects(), query);
Comparator<ProjectJson> c = new Comparator<ProjectJson>() {
@Override
public int compare(ProjectJson o1, ProjectJson o2) {
return o1.name().compareTo(o2.name());
}
};
Collections.sort(configuredProjects, c);
List<CodeineProject> projects = Lists.newArrayList();
IUserWithPermissions user = permissionsManager.user(request);
for (ProjectJson projectJson : configuredProjects) {
if (user.canRead(projectJson.name())){
try {
projects.add(new CodeineProject(projectJson.name(), aggregator.count(projectJson.name()), projectJson.description()));
} catch (Exception e) {
log.error("failed to add project " + projectJson.name(), e);
}
}
}
writeResponseJson(response, projects);
}
@Override
protected void myPost(HttpServletRequest request, HttpServletResponse response) {
try {
CreateNewProjectJson newProjectParamsJson = readBodyJson(request, CreateNewProjectJson.class);
log.info("creating project " + newProjectParamsJson);
ProjectJson newProject = new ProjectJson();
if (newProjectParamsJson.type == NewProjectType.Copy) {
ProjectJson projectForCopy = configurationManager.getProjectForName(newProjectParamsJson.selected_project);
newProject = JsonUtils.cloneJson(projectForCopy, ProjectJson.class);
}
newProject.name(newProjectParamsJson.project_name);
configurationManager.createNewProject(newProject);
afterProjectModifyPlugin.call(newProject, StatusChange.add, getUser(request).user().username());
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
private List<ProjectJson> filter(List<ProjectJson> configuredProjects, final String query) {
if (null == query){
return configuredProjects;
}
Predicate<ProjectJson> type = new Predicate<ProjectJson>(){
@Override
public boolean apply(ProjectJson project){
return (project.name().toLowerCase().contains(query.toLowerCase()));
}
};
return Lists.newArrayList(Iterables.filter(configuredProjects, type));
}
@Override
protected boolean checkPermissions(HttpServletRequest request) {
if (request.getMethod().equals("POST")) {
if (!isAdministrator(request)) {
log.info("User can not define new project");
return false;
}
return true;
}
return true;
}
}