package org.vaadin.mideaas.app; import java.io.File; import java.io.IOException; import java.util.Set; import java.util.TreeSet; import org.eclipse.jgit.api.errors.GitAPIException; import org.vaadin.mideaas.app.MideaasConfig.Prop; import org.vaadin.mideaas.frontend.ClaraEditor; import org.vaadin.mideaas.frontend.JettyUtil; import org.vaadin.mideaas.frontend.MavenUtil; import org.vaadin.mideaas.model.GitRepository; import org.vaadin.mideaas.model.LobbyBroadcaster; import org.vaadin.mideaas.model.ProjectLog; import org.vaadin.mideaas.model.SharedProject; import org.vaadin.mideaas.model.User; import org.vaadin.mideaas.model.UserSettings; import org.vaadin.mideaas.model.ZipUtils; import com.google.gwt.editor.client.impl.Refresher; import com.vaadin.annotations.PreserveOnRefresh; import com.vaadin.annotations.Push; import com.vaadin.annotations.Theme; import com.vaadin.navigator.Navigator; import com.vaadin.server.CustomizedSystemMessages; import com.vaadin.server.SystemMessages; import com.vaadin.server.SystemMessagesInfo; import com.vaadin.server.SystemMessagesProvider; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinService; import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.UI; @PreserveOnRefresh @SuppressWarnings("serial") //@Theme("reindeer") @Theme("mideaas") //@Theme("mideaas") //@Theme("runo") @Push public class MideaasUI extends UI { private static TreeSet<User> loggedInUsers = new TreeSet<User>(); static void addUser(User user) { synchronized (MideaasUI.class) { loggedInUsers.add(user); } //LobbyView.getLobbyChat().addLine(user.getName()+" logged in"); LobbyBroadcaster.broadcastLoggedInUsersChanged(getLoggedInUsers(), user, true); } static void removeUser(User user) { synchronized (MideaasUI.class) { loggedInUsers.remove(user); } SharedProject.removeFromProjects(user); //LobbyView.getLobbyChat().addLine(user.getName()+" left"); LobbyBroadcaster.broadcastLoggedInUsersChanged(getLoggedInUsers(), user, false); } synchronized static TreeSet<User> getLoggedInUsers() { return new TreeSet<User>(loggedInUsers); } private Navigator navigator; private User user; private final UserSettings settings = MideaasConfig.getDefaultUserSettings(); static { applyConfig(); } private static void applyConfig() { ProjectLog.setLogDir(MideaasConfig.getLogDir()); JettyUtil.setPortRange( MideaasConfig.getPropertyInt(Prop.JETTY_PORT_MIN), MideaasConfig.getPropertyInt(Prop.JETTY_PORT_MAX)); JettyUtil.setStopPortRange( MideaasConfig.getPropertyInt(Prop.JETTY_STOP_PORT_MIN), MideaasConfig.getPropertyInt(Prop.JETTY_STOP_PORT_MAX)); JettyUtil.stopAllJettys(); // XXX TODO??? MavenUtil.setMavenHome(MideaasConfig.getMavenHome()); ClaraEditor.setVisualDesignerUrl(MideaasConfig .getProperty(Prop.VISUAL_DESIGNER_URL)); try { SharedProject.initializeProjectRoot( new File(MideaasConfig.getProperty(Prop.PROJECTS_DIR)), MideaasConfig.getProperty(Prop.APP_PACKAGE_BASE)); } catch (IOException e) { System.err.println("ERROR: could not initialize project dir: " + e.getMessage()); System.exit(-1); } } @Override protected void init(VaadinRequest request) { //System.out.println("init of MideeasUI is called"); navigator = new Navigator(this, this); navigator.addView("", new LoginView(this, "lobby")); navigator.addView("lobby", new LobbyView(this)); navigator.addProvider(new EditorViewProvider(this, settings)); //navigator.setErrorView(new LobbyView(this)); /* // cutomizing System messages VaadinService.getCurrent().setSystemMessagesProvider( new SystemMessagesProvider() { @Override public SystemMessages getSystemMessages( SystemMessagesInfo systemMessagesInfo) { // TODO Auto-generated method stub CustomizedSystemMessages messages = new CustomizedSystemMessages(); //messages.setSessionExpiredCaption("farshad"); //messages.setSessionExpiredMessage("ahmadi"); //messages.setSessionExpiredNotificationEnabled(false); //messages.setSessionExpiredURL("/mideaastest"); //messages.setSessionExpiredURL("/mideaas"); messages.setSessionExpiredNotificationEnabled(true); return messages; } }); */ } @Override public void detach() { super.detach(); logout(); //setPushConnection(null); } @Override public void attach() { //logout(); super.attach(); //System.out.println("UI attached"); } public void logout() { setUser(null); } public User getUser() { return user; } /** * Creates new project and returns false if fails. * */ public boolean newProject(String projectName, boolean createSkeleton) { if (SharedProject.getProjectNames().contains(projectName)) { Notification.show(projectName + " already exists", Notification.Type.HUMANIZED_MESSAGE); return false; } else { SharedProject project = SharedProject.createNewProject(projectName,settings); if (project == null) { return false; } // TODO: where should we do the git repository stuff... ?? try { GitRepository repo = GitRepository.initAt(project.getProjectDir()); repo.addSourceFilesToGit(); } catch (IOException | GitAPIException e) { System.err.println("WARNING: could not initialize Git repository at " + project.getProjectDir()); } broadcastNewProject(projectName); return true; } } /** * Clones project from git. * * @param gitUrl * the git url */ public void createGitProject(String gitUrl) { String projectName = GitRepository.defaultProjectNameFromGitUrl(gitUrl); SharedProject project = SharedProject.createEmptyProject(projectName); if (project != null) { GitRepository.cloneFrom(gitUrl, project.getProjectDir()); project.refreshFromDisk(); broadcastNewProject(projectName); } else { Notification.show("Could not clone project from Git :("); } } private void broadcastNewProject(String projectName) { LobbyBroadcaster.broadcastProjectsChanged(); LobbyView.getLobbyChat().addLine(getUser().getName()+" created project "+projectName); } /** * Shows removetion dialog and if confirmed, then removes the project and * directory. * * @param projectName * the name of the project to be destroyer */ public void removeProject(String projectName) { RemoveProjectWindow window = new RemoveProjectWindow(getUser(), projectName); UI.getCurrent().addWindow(window); } public void openMideaasEditor(String projectName) { navigator.navigateTo("edit/"+projectName); } public void uploadProject(File file) { try { String name = ZipUtils.projectNameInZip(file); if (SharedProject.projectExists(name)) { Notification.show("Project "+ name +" already exists. Please remove it first if you want to upload this.", Notification.Type.ERROR_MESSAGE); } File projectsRootDir = new File( MideaasConfig.getProperty(Prop.PROJECTS_DIR)); File projectDir = ZipUtils.unzip(file, projectsRootDir); SharedProject.addProjectFromFiles(projectDir); broadcastNewProject(projectDir.getName()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Notification.show("Unzipping failed :("); } } public void setUser(User user) { if (user==null ? this.user==null : user.equals(this.user)) { return; } if (this.user!=null) { removeUser(this.user); } this.user = user; if (user!=null) { addUser(user); } else { navigateTo(""); //getSession().close(); } } public void navigateTo(String nextView) { navigator.navigateTo(nextView); } }