Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.anritsu.mcreleaseportal.client; import com.anritsu.mcreleaseportal.shared.MCPackage; import com.anritsu.mcreleaseportal.shared.MCPackageAvailabilities; import com.anritsu.mcreleaseportal.shared.MCPackageDependency; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FileUpload; import com.google.gwt.user.client.ui.FormPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.ListDataProvider; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.gwtbootstrap3.client.shared.event.ModalHideEvent; import org.gwtbootstrap3.client.shared.event.ModalHideHandler; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.Container; import org.gwtbootstrap3.client.ui.Heading; import org.gwtbootstrap3.client.ui.Image; import org.gwtbootstrap3.client.ui.Modal; import org.gwtbootstrap3.client.ui.ModalBody; import org.gwtbootstrap3.client.ui.Panel; import org.gwtbootstrap3.client.ui.PanelBody; import org.gwtbootstrap3.client.ui.constants.IconType; import org.gwtbootstrap3.client.ui.gwt.CellTable; import org.gwtbootstrap3.client.ui.html.Paragraph; import org.gwtbootstrap3.extras.notify.client.constants.NotifyType; import org.gwtbootstrap3.extras.notify.client.ui.Notify; import org.gwtbootstrap3.extras.notify.client.ui.NotifySettings; /** * * @author ro100051 */ public class UploadFile extends Composite { @UiField FormPanel fileUploadFormPanel; @UiField FileUpload fileUpload; @UiField Button submitFileUpload; @UiField Button selectFile; @UiField Button serviceDescription; @UiField HorizontalPanel hPanel; @UiField Image loadingGif; @UiField Modal serviceDescriptionModal; @UiField ModalBody confirmMCPackageInfoUpdateBody; @UiField Modal confirmMCPackageInfoUpdate; @UiField Container containerFileUpload; @UiField Paragraph submitStatus; @UiField Panel mcPackageInfoPanel; @UiField Panel mcPackageDependencyInfo; @UiField Heading mcPackageInfoPanelheaderHeading; @UiField PanelBody mcPackageInfoPanelBody; @UiField PanelBody mcPackageDependenciesInfoPanelBody; @UiField Button updateMCPackageInfo; @UiField Button closeOverwriteConfirmation; @UiField HTML serviceDescriptionHtml; private static UploadFileUiBinder uiBinder = GWT.create(UploadFileUiBinder.class); interface UploadFileUiBinder extends UiBinder<Widget, UploadFile> { } public UploadFile() { initWidget(uiBinder.createAndBindUi(this)); getService().enableChangesXMLUpload(enableChangesXMLUploadCallback); serviceDescription.setIcon(IconType.INFO_CIRCLE); serviceDescription.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { getService().getSchemaLink(getSchemaLinkCallback); serviceDescriptionModal.show(); } }); confirmMCPackageInfoUpdate.addHideHandler(new ModalHideHandler() { public void onHide(ModalHideEvent evt) { loadingGif.setVisible(false); hPanel.setVisible(true); mcPackageInfoPanel.setVisible(true); mcPackageDependencyInfo.setVisible(true); } }); selectFile.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { mcPackageInfoPanel.setVisible(false); mcPackageDependencyInfo.setVisible(false); submitFileUpload.setEnabled(false); fileUpload.click(); } }); fileUpload.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { if (fileUpload.getFilename().contains("xml")) { fileUploadFormPanel.setEncoding(FormPanel.ENCODING_MULTIPART); fileUploadFormPanel.setMethod(FormPanel.METHOD_POST); fileUploadFormPanel.setAction(GWT.getModuleBaseURL() + "fileupload"); fileUploadFormPanel.submit(); hPanel.setVisible(false); loadingGif.setVisible(true); } else { Notify.notify("", "Wrong file type selected!", IconType.THUMBS_DOWN, NotifyType.INFO); } } }); fileUploadFormPanel.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { @Override public void onSubmitComplete(FormPanel.SubmitCompleteEvent event) { fileUploadFormPanel.reset(); hPanel.setVisible(true); loadingGif.setVisible(false); getService().validateChangesXML(validateChangesXMLAsyncCallback); } }); submitFileUpload.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { hPanel.setVisible(false); loadingGif.setVisible(true); mcPackageInfoPanel.setVisible(false); mcPackageDependencyInfo.setVisible(false); getService().isMCPackagePresentInDB(isMCPackagePresentInDBCallback); } }); updateMCPackageInfo.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { updateMCPackageInfo.setText("Inserting data to DB..."); closeOverwriteConfirmation.setVisible(false); updateMCPackageInfo.setEnabled(false); getService().addMCPackageToDB(addMCPackageToDBCallback); } }); } private AsyncCallback<String> getSchemaLinkCallback = new AsyncCallback<String>() { @Override public void onFailure(Throwable caught) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void onSuccess(String result) { SafeHtmlBuilder sHtmlBuilder = new SafeHtmlBuilder(); sHtmlBuilder.appendHtmlConstant("<p>Schema Location: </p><a href='" + result + "'>"); sHtmlBuilder.appendEscaped(result); sHtmlBuilder.appendHtmlConstant("</a><br/>"); serviceDescriptionHtml.setHTML(sHtmlBuilder.toSafeHtml()); } }; private String getAvailabilities(MCPackage mcPackage) { StringBuilder availabilities = new StringBuilder("<br><Strong>Availabilities: </Strong><br />"); for (MCPackageAvailabilities mcpa : mcPackage.getAvailabilities()) { StringBuilder customers = new StringBuilder(); for (String customer : mcpa.getCustomers()) { customers.append(customer).append(" "); } availabilities.append("<Strong>").append(mcpa.getAvailability()) .append("</Strong> for MasterClaw <Strong>").append(mcpa.getMcVersion()) .append("</Strong> for ").append(customers).append("<br/>"); } return availabilities.toString(); } private AsyncCallback<String> validateChangesXMLAsyncCallback = new AsyncCallback<String>() { @Override public void onFailure(Throwable caught) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void onSuccess(String result) { NotifySettings settings = NotifySettings.newSettings(); settings.setType(NotifyType.INFO); settings.setDelay(0); if (!result.equals("")) { Notify.notify("Wrong XML file format!", result, IconType.THUMBS_DOWN, settings); } else { Notify.notify("XML file succesfully validated aginst the schema!", result, IconType.THUMBS_O_UP, NotifyType.INFO); getService().getMCPackageInfo(getMCPackageInfoAsyncCallback); } } }; private AsyncCallback<MCPackage> isMCPackagePresentInDBCallback = new AsyncCallback<MCPackage>() { @Override public void onFailure(Throwable caught) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void onSuccess(MCPackage result) { if (result.getPackageName() == null) { // Probably there were some errors while connecting to DB hPanel.setVisible(true); loadingGif.setVisible(false); mcPackageInfoPanel.setVisible(true); mcPackageDependencyInfo.setVisible(true); updateMCPackageInfo.setEnabled(true); submitFileUpload.setEnabled(true); Notify.notify("DB connectivity problems!", "Please try again. If upload still fails contact the administrator!", IconType.THUMBS_O_DOWN, NotifyType.INFO); return; } // Modal ask for confirmation if (result.getPackageName().equals("None")) { getService().addMCPackageToDB(addMCPackageToDBCallback); } else { confirmMCPackageInfoUpdateBody.clear(); HTML html = new HTML("Package " + result.getPackageName() + "-" + result.getPackageVersion() + " is already present in DB. Overwrite?"); confirmMCPackageInfoUpdateBody.add(html); closeOverwriteConfirmation.setVisible(true); confirmMCPackageInfoUpdate.show(); } } }; private AsyncCallback<String> addMCPackageToDBCallback = new AsyncCallback<String>() { @Override public void onFailure(Throwable caught) { Notify.notify("", "Error while connecting to server!\n" + caught.getMessage(), IconType.OBJECT_GROUP, NotifyType.INFO); loadingGif.setVisible(false); submitFileUpload.setEnabled(true); } @Override public void onSuccess(String result) { Notify.notify("", result, IconType.THUMBS_O_UP, NotifyType.INFO); hPanel.setVisible(true); loadingGif.setVisible(false); mcPackageInfoPanel.setVisible(true); mcPackageDependencyInfo.setVisible(true); mcPackageInfoPanelheaderHeading.setText(result); confirmMCPackageInfoUpdate.hide(); updateMCPackageInfo.setText("Overwrite"); updateMCPackageInfo.setEnabled(true); submitFileUpload.setEnabled(false); } }; private AsyncCallback<MCPackage> getMCPackageInfoAsyncCallback = new AsyncCallback<MCPackage>() { @Override public void onFailure(Throwable caught) { Notify.notify("", "Error while connecting to server!\n" + caught.getMessage(), IconType.OBJECT_GROUP, NotifyType.INFO); } @Override public void onSuccess(MCPackage result) { mcPackageDependenciesInfoPanelBody.clear(); mcPackageInfoPanelheaderHeading.clear(); mcPackageInfoPanelBody.clear(); if (result != null) { //Notify.notify("", result.getPackageName() + "-" + result.getPackageVersion() + " will be updated in DB!", IconType.OBJECT_GROUP, NotifyType.INFO); submitFileUpload.setEnabled(true); mcPackageInfoPanel.setVisible(true); mcPackageInfoPanelheaderHeading .setText(result.getPackageName() + "-" + result.getPackageVersion() + " details:"); Paragraph p = new Paragraph("<Strong>Date: </Strong>" + result.getDate() + "<br/><Strong>Author: </Strong>" + result.getAuthor() + "<br/><Strong>Email: </Strong>" + result.getAuthorEmail() + "<br/><Strong>Status: </Strong>" + result.getStatus() + "<br/><Strong>Tier: </Strong>" + result.getTier() + getAvailabilities(result)); mcPackageInfoPanelBody.add(p); mcPackageDependencyInfo.setVisible(true); ArrayList<CellTable> dependencyTables = getDependencyTables(result); for (CellTable ct : dependencyTables) { mcPackageInfoPanelBody.add(ct); mcPackageDependenciesInfoPanelBody.add(ct); } } else { Notify.notify("", "Error occured while parsing changes.xml!", IconType.OBJECT_GROUP, NotifyType.INFO); } } }; private AsyncCallback<String> enableChangesXMLUploadCallback = new AsyncCallback<String>() { @Override public void onFailure(Throwable caught) { Window.alert("Failed to retrive enableChangesXMLUpload parameter!"); } @Override public void onSuccess(String result) { if (result.equalsIgnoreCase("true")) { submitFileUpload.setVisible(true); } } }; private ArrayList<CellTable> getDependencyTables(MCPackage m) { ArrayList<CellTable> dependencyTables = new ArrayList<>(); Set<String> baselines = new HashSet<String>(); for (MCPackageDependency p : m.getDependencies()) { baselines.add(p.getBaseline()); } for (String s : baselines) { CellTable<MCPackageDependency> mcPackageDependencies = new CellTable<MCPackageDependency>(); TextColumn<MCPackageDependency> packageBaselineColumn = new TextColumn<MCPackageDependency>() { @Override public String getValue(MCPackageDependency object) { return object.getBaseline(); } }; TextColumn<MCPackageDependency> packageNameColumn = new TextColumn<MCPackageDependency>() { @Override public String getValue(MCPackageDependency object) { return object.getPackageName(); } }; TextColumn<MCPackageDependency> packageVersionColumn = new TextColumn<MCPackageDependency>() { @Override public String getValue(MCPackageDependency object) { return object.getPackageVersion(); } }; mcPackageDependencies.addColumn(packageBaselineColumn, "Baseline"); mcPackageDependencies.addColumn(packageNameColumn, "Package name"); mcPackageDependencies.addColumn(packageVersionColumn, "Package version"); ListDataProvider<MCPackageDependency> dataProvider = new ListDataProvider<MCPackageDependency>(); dataProvider.addDataDisplay(mcPackageDependencies); List<MCPackageDependency> list = dataProvider.getList(); for (MCPackageDependency mcpd : m.getDependencies()) { if (mcpd.getBaseline().equals(s)) { list.add(mcpd); } } dependencyTables.add(mcPackageDependencies); } return dependencyTables; } public static GWTServiceAsync getService() { // Create the client proxy. Note that although you are creating the // service interface proper, you cast the result to the asynchronous // version of the interface. The cast is always safe because the // generated proxy implements the asynchronous interface automatically. return GWT.create(GWTService.class); } }