Java tutorial
/*############################################################################ # Copyright 2010 North Carolina State University # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # # You may obtain a copy of the License at # # # # http://www.apache.org/licenses/LICENSE-2.0 # # # # Unless required by applicable law or agreed to in writing, software # # distributed under the License is distributed on an "AS IS" BASIS, # # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # # See the License for the specific language governing permissions and # # limitations under the License. # ############################################################################*/ package opus.gwt.management.console.client.deployer; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import opus.gwt.management.console.client.ClientFactory; import opus.gwt.management.console.client.JSVariableHandler; import opus.gwt.management.console.client.event.AsyncRequestEvent; import opus.gwt.management.console.client.event.ImportAppListEvent; import opus.gwt.management.console.client.event.ImportAppListEventHandler; import opus.gwt.management.console.client.event.PanelTransitionEvent; import opus.gwt.management.console.client.event.UpdateFeaturedListEvent; import opus.gwt.management.console.client.event.UpdateFeaturedListEventHandler; import opus.gwt.management.console.client.overlays.Application; import opus.gwt.management.console.client.overlays.DjangoPackage; import opus.gwt.management.console.client.overlays.ProjectData; import opus.gwt.management.console.client.overlays.VersionData; import opus.gwt.management.console.client.resources.AppBrowserCss.AppBrowserStyle; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.shared.EventBus; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DeckPanel; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.LayoutPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class AppBrowserPanel extends Composite { private static AppBrowserPanelUiBinder uiBinder = GWT.create(AppBrowserPanelUiBinder.class); interface AppBrowserPanelUiBinder extends UiBinder<Widget, AppBrowserPanel> { } private final String tokenURL = "/project/configuration/token/?callback="; private JSVariableHandler JSVarHandler; private int[] featured; private ArrayList<AppIcon> featuredIcons; private int navigationselection; private boolean featuredListLoaded; private boolean gridPopulationDelayed; private HashMap<String, Application> applicationData; private AppIcon currentSelection; private ArrayList<AppIcon> deployList; private EventBus eventBus; private ClientFactory clientFactory; private HashMap<String, AppIcon> IconMap; private HashMap<String, AppIcon> DeployListMap; private HashMap<String, AppIcon> FeaturedIconMap; @UiField VerticalPanel VersionInfo; @UiField VerticalPanel allVersionInfo; @UiField HTML AppInfo; @UiField HTML allAppInfo; @UiField Button AppActionButton; @UiField Button allAppActionButton; @UiField Button DeployButton; @UiField Button RemoveButton; @UiField FlowPanel DeployListFlowPanel; @UiField DeckPanel mainDeckPanel; @UiField Label allAppsLabel; @UiField Label featuredAppsLabel; @UiField Label djangoPackagesLabel; @UiField AppBrowserStyle style; @UiField FlowPanel featuredAppFlowPanel; @UiField FlowPanel appFlowPanel; @UiField LayoutPanel djangoPackagesHTMLPanel; @UiField HTMLPanel featuredAppsPanel; @UiField HTMLPanel appsPanel; @UiField(provided = true) DPCellTable djangoPackagesTable; public AppBrowserPanel(ClientFactory clientFactory) { this.clientFactory = clientFactory; djangoPackagesTable = new DPCellTable(clientFactory); initWidget(uiBinder.createAndBindUi(this)); this.featuredListLoaded = false; this.gridPopulationDelayed = false; this.eventBus = clientFactory.getEventBus(); this.JSVarHandler = clientFactory.getJSVariableHandler(); registerHandlers(); deployList = new ArrayList<AppIcon>(); IconMap = new HashMap<String, AppIcon>(); FeaturedIconMap = new HashMap<String, AppIcon>(); DeployListMap = new HashMap<String, AppIcon>(); mainDeckPanel.showWidget(0); navigationselection = 1; featuredIcons = new ArrayList<AppIcon>(); eventBus.fireEvent(new AsyncRequestEvent("getFeatured")); } private void registerHandlers() { eventBus.addHandler(UpdateFeaturedListEvent.TYPE, new UpdateFeaturedListEventHandler() { public void onUpdateFeaturedList(UpdateFeaturedListEvent event) { populateFeaturedList(event.getFeaturedList()); } }); eventBus.addHandler(ImportAppListEvent.TYPE, new ImportAppListEventHandler() { public void onImportAppList(ImportAppListEvent event) { importAppList(event.getProjectData()); } }); } public void reset() { DeployListMap.clear(); DeployListFlowPanel.clear(); currentSelection = null; djangoPackagesTable.selectionModel.getSelectedSet().clear(); allAppsLabel.setStyleName(style.allAppsLabel()); featuredAppsLabel.setStyleName(style.featuredAppsLabelActive()); djangoPackagesLabel.setStyleName(style.allAppsLabel()); mainDeckPanel.showWidget(0); navigationselection = 2; VersionInfo.clear(); allVersionInfo.clear(); AppInfo.setHTML(""); allAppInfo.setHTML(""); } public void populateAppGrid(HashMap<String, Application> applications) { this.applicationData = applications; for (Application app : applicationData.values()) { try { String name = app.getName(); String desc = app.getDescription(); String email = app.getEmail(); String author = app.getAuthor(); int pk = app.getPk(); String iconPath = app.getIconURL(); String path = app.getPath(); String type = app.getType(); String appName = app.getAppName(); if (iconPath.equals("")) { iconPath = "https://opus-dev.cnl.ncsu.edu/gwt/defaulticon.png"; } else if (iconPath.split("//").length < 2) { iconPath = JSVarHandler.getCommunityBaseURL() + iconPath; } AppIcon appIcon = createAppIcon(name, email, author, desc, pk, iconPath, path, type, appName); for (int j = 0; j < featured.length; j++) { //Window.alert(String.valueOf(featured.length)); if (featured[j] == pk) { featuredIcons.add(appIcon); //featuredIcons.set(j, appIcon); } } appFlowPanel.add(appIcon); IconMap.put(appIcon.getAppPk(), appIcon); //Window.alert(appIcon.getAppPk()); } catch (Exception e) { //DOTO:need to handle these exceptions somehow // Not sure; } } for (int j = 0; j < featured.length; j++) { AppIcon icon = IconMap.get(String.valueOf(featured[j])); AppIcon featuredIcon = createAppIcon(icon.getName(), icon.getEmail(), icon.getAuthor(), icon.getDescription(), Integer.valueOf(icon.getAppPk()), icon.getIcon(), icon.getPath(), icon.getType(), icon.getAppName()); FeaturedIconMap.put(featuredIcon.getAppPk(), featuredIcon); featuredAppFlowPanel.add(featuredIcon); } } public AppIcon createAppIcon(String name, String email, String author, String info, int pk, String iconPath, String appPath, String type, String appName) { final AppIcon icon = new AppIcon(name, email, author, iconPath, info, pk, appPath, type, appName, clientFactory); icon.setIconHTML( "<img align='left' src='" + iconPath + "'/><b>" + name + "</b><br/>" + icon.getShortDescription()); icon.setStyleName(style.appIcon()); icon.iconPanel.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { //if the icon is already selected don't do anything //if the icon is selected and it is in AppList, make style appIconActive and set icon as currentSelection and display info, change previous selection back to inactive //if the icon is selected and it is in the DeployList, make style appIconSmallActive and set icon as currentSelection and display info, change previous selection to inactive if (currentSelection != icon) { if (currentSelection != null) { IconMap.get(currentSelection.getAppPk()).setStyleName(style.appIcon()); if (DeployListMap.containsKey((currentSelection.getAppPk()))) { DeployListMap.get(currentSelection.getAppPk()).setStyleName(style.appIconSmall()); RemoveButton.setEnabled(true); } else { RemoveButton.setEnabled(false); } if (FeaturedIconMap.containsKey(currentSelection.getAppPk())) { FeaturedIconMap.get(currentSelection.getAppPk()).setStyleName(style.appIcon()); } } /*if (deployListReplacements.contains(icon)){ int index = deployListReplacements.indexOf(icon); deployList.get(index).setStyleName(style.appIconSmallActive()); }*/ if (DeployListMap.containsKey(icon.getAppPk()) == false) { IconMap.get(icon.getAppPk()).setStyleName(style.appIconActive()); if (FeaturedIconMap.containsKey(icon.getAppPk())) { FeaturedIconMap.get(icon.getAppPk()).setStyleName(style.appIconActive()); } setAppInfo(icon); AppActionButton.setText("Add to Deploy List"); AppActionButton.setStyleName(style.AppActionButton()); AppActionButton.setVisible(true); allAppActionButton.setText("Add to Deploy List"); allAppActionButton.setStyleName(style.AppActionButton()); allAppActionButton.setVisible(true); RemoveButton.setEnabled(false); } else { DeployListMap.get(icon.getAppPk()).setStyleName(style.appIconSmallActive()); IconMap.get(icon.getAppPk()).setStyleName(style.appIconActive()); if (FeaturedIconMap.containsKey(icon.getAppPk())) { FeaturedIconMap.get(icon.getAppPk()).setStyleName(style.appIconActive()); } currentSelection = icon; //setAppInfo(icon.getDescription(), icon.getVersions()); setAppInfo(icon); AppActionButton.setText("Remove from Deploy List"); AppActionButton.setVisible(false); allAppActionButton.setText("Remove from Deploy List"); allAppActionButton.setVisible(false); RemoveButton.setEnabled(true); } currentSelection = icon; icon.iconPanel.setFocus(false); AppActionButton.setStyleName(style.AppActionButton()); allAppActionButton.setStyleName(style.AppActionButton()); } } }); return icon; } public void setAppInfo(AppIcon icon) { AppInfo.setHTML("<div class='" + style.appInfoContainer() + "'><img align='left' src='" + icon.getIcon() + "' />" + "<h1>" + icon.getName() + "</h1><h2>Author: " + icon.getAuthor() + "</h2>" + "<h2>Email: " + icon.getEmail() + "</h2><br />" + icon.getDescription() + "</div>"); allAppInfo.setHTML("<div class='" + style.appInfoContainer() + "'><img align='left' src='" + icon.getIcon() + "' />" + "<h1>" + icon.getName() + "</h1><h2>Author: " + icon.getAuthor() + "</h2>" + "<h2>Email: " + icon.getEmail() + "</h2><br />" + icon.getDescription() + "</div>"); VersionInfo.clear(); allVersionInfo.clear(); VersionInfo.add(icon.getVersions()); allVersionInfo.add(icon.getVersions()); } @UiHandler("DeployButton") void handleNextButton(ClickEvent event) { eventBus.fireEvent(new PanelTransitionEvent(PanelTransitionEvent.TransitionTypes.NEXT, this)); } @UiHandler("RemoveButton") void handleRemoveButton(ClickEvent event) { AppActionButton.click(); if (DeployListMap.containsKey(currentSelection.getAppPk())) { RemoveButton.setEnabled(true); } else { RemoveButton.setEnabled(false); } } @UiHandler("allAppsLabel") void handleAllAppsLabel(ClickEvent event) { allAppsLabel.setStyleName(style.allAppsLabelActive()); featuredAppsLabel.setStyleName(style.featuredAppsLabel()); djangoPackagesLabel.setStyleName(style.allAppsLabel()); mainDeckPanel.showWidget(1); navigationselection = 1; } @UiHandler("featuredAppsLabel") void handleFeaturedAppsLabel(ClickEvent event) { allAppsLabel.setStyleName(style.allAppsLabel()); featuredAppsLabel.setStyleName(style.featuredAppsLabelActive()); djangoPackagesLabel.setStyleName(style.allAppsLabel()); mainDeckPanel.showWidget(0); navigationselection = 2; } @UiHandler("djangoPackagesLabel") void handleDjangoPackagesLabel(ClickEvent event) { allAppsLabel.setStyleName(style.allAppsLabel()); featuredAppsLabel.setStyleName(style.featuredAppsLabel()); djangoPackagesLabel.setStyleName(style.allAppsLabelActive()); mainDeckPanel.showWidget(2); navigationselection = 3; } @UiHandler("AppActionButton") void handleAppActionButton(ClickEvent event) { if (DeployListMap.containsKey(currentSelection.getAppPk())) { DeployListFlowPanel.remove(DeployListMap.get(currentSelection.getAppPk())); DeployListMap.remove(currentSelection.getAppPk()); AppActionButton.setText("Add to Deploy List"); AppActionButton.setVisible(true); } else { //create new icon and add it to the deploy list AppIcon iconForDeployList = createAppIcon(currentSelection.getName(), currentSelection.getEmail(), currentSelection.getAuthor(), currentSelection.getDescription(), Integer.valueOf(currentSelection.getAppPk()), currentSelection.getIcon(), currentSelection.getPath(), currentSelection.getType(), currentSelection.getAppName()); iconForDeployList.setStyleName(style.appIconSmallActive()); iconForDeployList.setIconHTML( "<img src='" + currentSelection.getIcon() + "'><br/>" + currentSelection.getName()); DeployListMap.put(iconForDeployList.getAppPk(), iconForDeployList); DeployListFlowPanel.add(iconForDeployList); //Remove from featuredIcons if it is one. AppActionButton.setText("Remove from Deploy List"); AppActionButton.setVisible(false); RemoveButton.setEnabled(true); } if (DeployListMap.size() > 0) { DeployButton.setEnabled(true); } else { DeployButton.setEnabled(false); } } @UiHandler("allAppActionButton") void handleAllAppActionButton(ClickEvent event) { AppActionButton.click(); } public void populateFeaturedList(JavaScriptObject jso) { featured = new int[20]; String[] s = jso.toString().split(",\\s*"); featured = new int[s.length]; //Window.alert(String.valueOf(s.length)); for (int i = 0; i < s.length; i++) { featured[i] = Integer.valueOf(s[i]); } populateAppGrid(clientFactory.getApplications()); } public void importAppList(JsArray<ProjectData> projectData) { JsArray<VersionData> versions = projectData.get(0).getVersions(); //Window.alert("got inside importAppList"); DeployListMap.clear(); for (int i = 0; i < versions.length(); i++) { for (Entry<String, AppIcon> e : IconMap.entrySet()) if (e.getValue().getAppPk().equals(versions.get(i).getAppPk())) { AppIcon match = e.getValue(); match.setSelectedVersion(Integer.valueOf(versions.get(i).getVersionPk())); match.setStyleName(style.appIconSmall()); match.setIconHTML("<img src='" + match.getIcon() + "'><br/>" + match.getName()); DeployListMap.put(match.getAppPk(), match); DeployListFlowPanel.add(match); AppActionButton.setText("Remove from Deploy List"); AppActionButton.setVisible(false); RemoveButton.setEnabled(false); break; } } } //Iterates through all icons in the deploy list and returns a list of all app paths public ArrayList<String> getAppPaths() { ArrayList<String> paths = new ArrayList<String>(); for (Entry<String, AppIcon> e : DeployListMap.entrySet()) { paths.add(e.getValue().getPath()); } Iterator<DjangoPackage> dpIter = djangoPackagesTable.selectionModel.getSelectedSet().iterator(); while (dpIter.hasNext()) { DjangoPackage dp = dpIter.next(); if (dp.getType().equals("git")) paths.add(dp.getPath() + ".git"); dpIter.remove(); } return paths; } public ArrayList<String> getAppTypes() { ArrayList<String> types = new ArrayList<String>(); for (Entry<String, AppIcon> e : DeployListMap.entrySet()) { types.add(e.getValue().getType()); } Iterator<DjangoPackage> dpIter = djangoPackagesTable.selectionModel.getSelectedSet().iterator(); while (dpIter.hasNext()) { types.add(dpIter.next().getType()); dpIter.remove(); } return types; } public ArrayList<String> getApps() { ArrayList<String> apps = new ArrayList<String>(); for (Entry<String, AppIcon> e : DeployListMap.entrySet()) { apps.add(e.getValue().getName()); } Iterator<DjangoPackage> dpIter = djangoPackagesTable.selectionModel.getSelectedSet().iterator(); while (dpIter.hasNext()) { apps.add(dpIter.next().getAppName()); dpIter.remove(); } return apps; } public ArrayList<String> getAppNames() { ArrayList<String> names = new ArrayList<String>(); for (Entry<String, AppIcon> e : DeployListMap.entrySet()) { String name = e.getValue().getAppName(); names.add(name); } Iterator<DjangoPackage> dpIter = djangoPackagesTable.selectionModel.getSelectedSet().iterator(); while (dpIter.hasNext()) { names.add(dpIter.next().getAppName()); dpIter.remove(); } return names; } }