/*
* 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.event.EventRouter;
import com.vaadin.terminal.Terminal;
import com.vaadin.terminal.gwt.server.HttpServletRequestListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.Table;
import com.vaadin.ui.Window;
import eform.Form;
import eform.FormsHolder;
import ru.codeinside.adm.AdminService;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.adm.database.Role;
import ru.codeinside.gses.webui.components.api.Baseband;
import ru.codeinside.gses.webui.eventbus.SizePublisher;
import ru.codeinside.gses.webui.utils.RunProfile;
import ru.codeinside.log.Actor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URL;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ActivitiApp extends Application implements HttpServletRequestListener, Baseband, FormsHolder {
private static final long serialVersionUID = 1L;
final EventRouter eventRouter = new EventRouter();
final URL serverUrl;
final AtomicLong serial = new AtomicLong();
final Map<Long, Form> forms = new HashMap<Long, Form>();
public ActivitiApp(URL serverUrl, String logoutUrl) {
this.serverUrl = serverUrl;
setLogoutURL(logoutUrl);
}
public URL getServerUrl() {
return serverUrl;
}
public long nextId() {
return serial.getAndIncrement();
}
public Map<Long, Form> getForms() {
return forms;
}
@Override
public void init() {
try {
String userLogin = Flash.login();
Actor userActor = Flash.getActor();
ImmutableSet<Role> userRoles = Flash.flash().getRoles();
boolean productionMode = RunProfile.isProduction();
setUser(userLogin);
setTheme("custom");
setMainWindow(new Window("СИУ :: " + userLogin, createUi(userLogin, userRoles, productionMode)));
AdminServiceProvider.get().createLog(userActor, "application", userLogin, "userLogin", null, true);
} catch (Table.CacheUpdateException e) {
for (Throwable cause : e.getCauses()) {
Logger.getAnonymousLogger().log(Level.WARNING, "on table" + e.getTable(), cause);
}
}
}
private ComponentContainer createUi(final String userLogin, final Set<Role> userRoles, final boolean productionMode) {
if (!productionMode) {
getContext().addTransactionListener(new SizePublisher(eventRouter));
}
if (AdminServiceProvider.get().withEmployee(userLogin, new IsCertificateRequired()) && AdminServiceProvider.getBoolProperty(CertificateVerifier.LINK_CERTIFICATE)) {
return new CertificateSelection(userLogin, new CertificateSelector(userLogin, userRoles, productionMode));
}
return new Workplace(userLogin, userRoles, productionMode);
}
@Override
public void close() {
super.close();
AdminService adminService = AdminServiceProvider.tryGet();
if (adminService != null) {
try {
adminService.createLog(Flash.getActor(), "application", (String) getUser(), "logout", null, true);
} catch (Exception e) {
// Замечание: при выключении OSGI модуля JEE сервис МОЖЕТ быть не доступен.s
}
}
}
/**
* Вызывается ДО инициализации!
*/
@Override
public void onRequestStart(HttpServletRequest request, HttpServletResponse response) {
Flash.setCurrentApp(this);
}
@Override
public void onRequestEnd(HttpServletRequest request, HttpServletResponse response) {
Flash.clearCurrentApp();
}
@Override
public EventRouter getRouter() {
return eventRouter;
}
@SuppressWarnings("unused") // Vaadin Reflection API
public static SystemMessages getSystemMessages() {
CustomizedSystemMessages messages = new CustomizedSystemMessages();
messages.setSessionExpiredNotificationEnabled(false);
messages.setCommunicationErrorNotificationEnabled(false);
return messages;
}
@Deprecated
public Component activate(String name) {
return null;
}
@Deprecated
public void refresh(String... names) {
}
final class CertificateSelector implements CertificateListener {
final String userLogin;
final Set<Role> userRoles;
final boolean productionMode;
CertificateSelector(String userLogin, Set<Role> userRoles, boolean productionMode) {
this.userLogin = userLogin;
this.userRoles = userRoles;
this.productionMode = productionMode;
}
@Override
public void onCertificate(X509Certificate certificate) {
boolean ok = AdminServiceProvider.get().withEmployee(userLogin, new CertificateSetter(certificate));
if (!ok) {
close();
} else {
getMainWindow().setContent(new Workplace(userLogin, userRoles, productionMode));
}
}
}
@Override
public void terminalError(Terminal.ErrorEvent event) {
Throwable t = event.getThrowable();
if (t instanceof Table.CacheUpdateException) {
for (Throwable throwable : ((Table.CacheUpdateException) t).getCauses()) {
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Ошибка обновления кэша таблицы", throwable);
}
} else if (t.getCause() instanceof Table.CacheUpdateException) {
for (Throwable throwable : ((Table.CacheUpdateException) t.getCause()).getCauses()) {
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Ошибка обновления кэша таблицы", throwable);
}
} else {
super.terminalError(event);
}
}
}