package fi.otavanopisto.muikku.plugins.workspace;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import org.apache.commons.lang3.StringUtils;
import org.ocpsoft.rewrite.annotation.RewriteConfiguration;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.config.Direction;
import org.ocpsoft.rewrite.context.EvaluationContext;
import org.ocpsoft.rewrite.param.ParameterStore;
import org.ocpsoft.rewrite.param.ParameterValueStore;
import org.ocpsoft.rewrite.param.Parameterized;
import org.ocpsoft.rewrite.servlet.config.HttpCondition;
import org.ocpsoft.rewrite.servlet.config.HttpConfigurationProvider;
import org.ocpsoft.rewrite.servlet.config.Path;
import org.ocpsoft.rewrite.servlet.config.Substitute;
import org.ocpsoft.rewrite.servlet.config.rule.Join;
import org.ocpsoft.rewrite.servlet.http.event.HttpServletRewrite;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.plugins.material.model.Material;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial;
import fi.otavanopisto.muikku.schooldata.WorkspaceController;
@RewriteConfiguration
public class WorkspaceMaterialRewriteRules extends HttpConfigurationProvider {
@Inject
private WorkspaceController workspaceController;
@Inject
private WorkspaceMaterialController workspaceMaterialController;
@Override
public Configuration getConfiguration(ServletContext context) {
ConfigurationBuilder configuration = ConfigurationBuilder.begin();
configuration.addRule()
.when(Direction.isInbound()
.and(Path.matches("/workspace/{workspaceUrlName}/materials/{materialPath}"))
.and(new WorkspaceMaterialTypeRule("workspaceUrlName", "materialPath", "materialType")))
.perform(Substitute.with("/workspace/{workspaceUrlName}/materials.{materialType}/{materialPath}"))
.where("materialPath").matches("[a-zA-Z0-9/_.\\-]*");
configuration
.addRule(Join.path("/workspace/{workspaceUrlName}/materials.binary/{materialPath}").to("/workspaceBinaryMaterialsServlet?workspaceUrlname={workspaceUrlName}&workspaceMaterialUrlName={materialPath}")).where("materialPath")
.matches("[a-zA-Z0-9/_.\\-]*");
return configuration;
}
@Override
public int priority() {
return 0;
}
private class WorkspaceMaterialTypeRule extends HttpCondition implements Parameterized {
public WorkspaceMaterialTypeRule(String workspaceUrlNameParam, String materialPathParam, String materialTypeParam) {
this.workspaceUrlNameParam = workspaceUrlNameParam;
this.materialPathParam = materialPathParam;
this.materialTypeParam = materialTypeParam;
}
@Override
public Set<String> getRequiredParameterNames() {
Set<String> result = new HashSet<>();
result.add(workspaceUrlNameParam);
result.add(materialPathParam);
result.add(materialTypeParam);
return result;
}
@Override
public void setParameterStore(ParameterStore store) {
this.parameterStore = store;
}
@Override
public boolean evaluateHttp(HttpServletRewrite event, EvaluationContext context) {
ParameterValueStore parameterValueStore = (ParameterValueStore) context.get(ParameterValueStore.class);
String workspaceUrlName = parameterValueStore.retrieve(parameterStore.get(this.workspaceUrlNameParam));
String materialPath = parameterValueStore.retrieve(parameterStore.get(this.materialPathParam));
if (StringUtils.isNotBlank(workspaceUrlName) && StringUtils.isNotBlank(materialPath)) {
WorkspaceEntity workspaceEntity = workspaceController.findWorkspaceEntityByUrlName(workspaceUrlName);
if (workspaceEntity == null) {
return false;
}
WorkspaceMaterial workspaceMaterial = workspaceMaterialController.findWorkspaceMaterialByWorkspaceEntityAndPath(workspaceEntity, materialPath);
if (workspaceMaterial == null) {
return false;
}
Material material = workspaceMaterialController.getMaterialForWorkspaceMaterial(workspaceMaterial);
if (material == null) {
return false;
}
parameterValueStore.submit(event, context, parameterStore.get(this.materialTypeParam), material.getType());
return true;
}
return false;
}
private ParameterStore parameterStore;
private String workspaceUrlNameParam;
private String materialPathParam;
private String materialTypeParam;
}
}