/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.view.internal.application;
import java.util.ArrayList;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.eclipse.skalli.commons.UUIDUtils;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.model.User;
import org.eclipse.skalli.services.Services;
import org.eclipse.skalli.services.entity.EntityServices;
import org.eclipse.skalli.services.permit.PermitService;
import org.eclipse.skalli.services.project.ProjectService;
import org.eclipse.skalli.view.Consts;
import org.eclipse.skalli.view.internal.window.ProjectWindow;
import com.vaadin.terminal.gwt.server.HttpServletRequestListener;
import com.vaadin.ui.Window;
/**
* Project Portal Vaadin application. Implements the layout and screen flow of this application.
*/
@SuppressWarnings("serial")
public class ProjectApplication extends com.vaadin.Application implements HttpServletRequestListener {
public static final String DEFAULT_THEME = "simple"; //$NON-NLS-1$
public static final String WINDOW_TITLE = "ProjectPortal"; //$NON-NLS-1$
private String userId;
public ProjectApplication(User user) {
this.userId = user != null ? StringUtils.lowerCase(user.getUserId()) : null;
this.setUser(user);
}
@Override
public void init() {
setTheme(DEFAULT_THEME);
setMainWindow(new Window(WINDOW_TITLE));
}
public void refresh(Project project) {
if (project != null) {
ProjectWindow projectWindow = (ProjectWindow) getWindow(project.getProjectId());
if (projectWindow != null) {
projectWindow.setProject(project);
projectWindow.requestRepaint();
}
}
}
@Override
public Window getWindow(String name) {
Window window = super.getWindow(name);
if (window == null) {
ProjectService projectService = ((ProjectService)EntityServices.getByEntityClass(Project.class));
Project project = projectService.getProjectByProjectId(name);
if (project == null) {
UUID uuid = UUIDUtils.asUUID(name);
if (uuid != null) {
project = projectService.getByUUID(uuid);
if (project == null) {
project = projectService.getDeletedProject(uuid);
}
}
}
// make sure that we have no "dangling" template select views
if (project == null) {
ArrayList<Window> allWindows = new ArrayList<Window>(getWindows());
for (Window w : allWindows) {
removeWindow(w);
}
}
window = new ProjectWindow(this, project); // project==null opens create dialog
window.setName(name);
addWindow(window);
}
return window;
}
public String getLoggedInUser() {
return userId;
}
/**************************************
* Interface HttpServletRequestListener
***************************************/
@Override
public void onRequestStart(HttpServletRequest request, HttpServletResponse response) {
PermitService permitService = Services.getRequiredService(PermitService.class);
String windowName = request.getParameter(Consts.ATTRIBUTE_WINDOWNAME);
if (StringUtils.isNotBlank(windowName)) {
String prefix = Consts.URL_VAADIN_PROJECTS + windowName;
String requestUri = request.getRequestURI();
if (requestUri.startsWith(prefix)) {
String relativeUri = null;
if (requestUri.indexOf("/edit/") > 0) { //$NON-NLS-1$
relativeUri = "edit"; //$NON-NLS-1$
}
ProjectWindow window = (ProjectWindow) getWindow(windowName);
permitService.login(request, window.getProject());
window.handleRelativeURI(relativeUri);
}
} else {
permitService.login(request, null);
}
}
@Override
public void onRequestEnd(HttpServletRequest request, HttpServletResponse response) {
PermitService permitService = Services.getRequiredService(PermitService.class);
permitService.logout(request);
}
}