/*
* 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/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.webui;
import com.google.common.collect.ImmutableSet;
import com.vaadin.Application;
import com.vaadin.terminal.gwt.server.AbstractApplicationServlet;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.impl.identity.Authentication;
import ru.codeinside.adm.AdminService;
import ru.codeinside.adm.database.Role;
import ru.codeinside.gses.service.ActivitiService;
import ru.codeinside.gses.service.DeclarantService;
import ru.codeinside.gses.service.ExecutorService;
import ru.codeinside.jpa.LazyJtaTransactionContext;
import javax.annotation.Resource;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HttpConstraint;
import javax.servlet.annotation.ServletSecurity;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.transaction.UserTransaction;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
@WebServlet(
urlPatterns = {"/ui/*"},
initParams = {
@WebInitParam(name = "widgetset", value = "ru.codeinside.gses.vaadin.WidgetSet")
/*,@WebInitParam(name = "productionMode", value = "false")*/
})
@TransactionManagement(TransactionManagementType.BEAN)
public class ActivitiServlet extends AbstractApplicationServlet {
private static final long serialVersionUID = 2L;
@Inject
ActivitiService activitiService;
@Inject
Instance<ProcessEngine> processEngine;
@Inject
DeclarantService declarantService;
@Inject
ExecutorService executorService;
@Inject
AdminService adminService;
@PersistenceContext(unitName = "myPU")
EntityManager em;
@Resource
UserTransaction userTransaction;
@Override
protected Class<? extends Application> getApplicationClass() {
return ActivitiApp.class;
}
@Override
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
boolean success = false;
try {
Flash.set(new RequestContext(req));
String login = Flash.login();
Authentication.setAuthenticatedUserId(login);
super.service(req, res);
success = true;
} finally {
Authentication.setAuthenticatedUserId(null);
Flash.clear(success);
}
}
@Override
protected Application getNewApplication(HttpServletRequest request) throws ServletException {
URL serverUrl;
try {
// Attention - using HTTP !
serverUrl = new URL("http://" + request.getLocalName() + ":" + request.getLocalPort());
} catch (MalformedURLException e) {
throw new ServletException(e);
}
return new ActivitiApp(serverUrl, request.getContextPath() + "/logout.jsp");
}
final class RequestContext implements Flasher, Flasher.Closable {
final HttpServletRequest req;
final LazyJtaTransactionContext emContext = new LazyJtaTransactionContext(userTransaction, em);
ImmutableSet<Role> lazyRoles;
String lazyLogin;
public RequestContext(HttpServletRequest req) {
this.req = req;
}
@Override
public ImmutableSet<Role> getRoles() {
if (lazyRoles == null) {
ImmutableSet.Builder<Role> builder = ImmutableSet.builder();
for (Role role : Role.values()) {
if (req.isUserInRole(role.name())) {
builder.add(role);
}
}
lazyRoles = builder.build();
storeInSession("ROLES", lazyRoles);
}
return lazyRoles;
}
@Override
public ProcessEngine getProcessEngine() {
return processEngine.isUnsatisfied() ? null : processEngine.get();
}
@Override
public ActivitiService getActivitiService() {
return activitiService;
}
@Override
public String getLogin() {
if (lazyLogin == null) {
lazyLogin = req.getUserPrincipal().getName();
storeInSession("LOGIN", lazyLogin);
}
return lazyLogin;
}
@Override
public String getRemoteAddr() {
String ipAddress = req.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = req.getRemoteAddr();
}
return ipAddress;
}
@Override
public String getUserAgent() {
return req.getHeader("user-agent");
}
@Override
public EntityManager getEm() {
return emContext.getEntityManager();
}
@Override
public EntityManager getLogEm() {
throw new UnsupportedOperationException();
}
@Override
public DeclarantService getDeclarantService() {
return declarantService;
}
@Override
public ExecutorService getExecutorService() {
return executorService;
}
@Override
public AdminService getAdminService() {
return adminService;
}
private void storeInSession(String name, Object value) {
HttpSession session = req.getSession(false);
if (session != null) {
if (session.getAttribute(name) == null) {
session.setAttribute(name, value);
}
}
}
@Override
public void close(boolean success) {
emContext.close(success);
}
}
}