/*
* 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 ru.codeinside.adm.AdminService;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.adm.database.Role;
import ru.codeinside.adm.ui.AdminApp;
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.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.UserTransaction;
import java.io.IOException;
@WebServlet(urlPatterns = {"/admin/*"}, initParams = {@WebInitParam(name = "widgetset", value = "ru.codeinside.gses.vaadin.WidgetSet")})
@TransactionManagement(TransactionManagementType.BEAN)
public class AdminServlet extends AbstractApplicationServlet {
private static final long serialVersionUID = 3L;
@Inject
AdminServiceProvider registry;
@Resource
UserTransaction userTransaction;
@PersistenceContext(unitName = "myPU")
EntityManager em;
@PersistenceContext(unitName = "logPU")
EntityManager logEm;
@Override
protected Application getNewApplication(HttpServletRequest request) throws ServletException {
AdminApp app = new AdminApp();
app.setUser(request.getUserPrincipal().getName());
app.setLogoutURL(request.getContextPath() + "/logout.jsp");
return app;
}
@Override
protected Class<? extends Application> getApplicationClass() throws ClassNotFoundException {
return AdminApp.class;
}
@Override
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
boolean success = false;
try {
Flash.set(new RequestContext(req));
super.service(req, res);
success = true;
} finally {
Flash.clear(success);
}
}
final class RequestContext implements Flasher, Flasher.Closable {
private final HttpServletRequest req;
LazyJtaTransactionContext emProvider = new LazyJtaTransactionContext(userTransaction, em);
LazyJtaTransactionContext logEmProvider = new LazyJtaTransactionContext(userTransaction, logEm);
public RequestContext(HttpServletRequest req) {
this.req = req;
}
@Override
public String getLogin() {
return req.getUserPrincipal().getName();
}
@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");
}
public ImmutableSet<Role> getRoles() {
throw new UnsupportedOperationException();
}
public ActivitiService getActivitiService() {
throw new UnsupportedOperationException();
}
public ProcessEngine getProcessEngine() {
throw new UnsupportedOperationException();
}
public DeclarantService getDeclarantService() {
throw new UnsupportedOperationException();
}
public AdminService getAdminService() {
throw new UnsupportedOperationException();
}
@Override
public EntityManager getEm() {
return emProvider.getEntityManager();
}
@Override
public EntityManager getLogEm() {
return logEmProvider.getEntityManager();
}
@Override
public void close(boolean success) {
emProvider.close(success);
logEmProvider.close(success);
}
public ExecutorService getExecutorService() {
throw new UnsupportedOperationException();
}
}
}