Java tutorial
/* * Copyright 2005 JBoss Inc * * 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 org.drools.guvnor.client.packages; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import org.drools.guvnor.client.categorynav.CategoryExplorerWidget; import org.drools.guvnor.client.categorynav.CategorySelectHandler; import org.drools.guvnor.client.common.FormStylePopup; import org.drools.guvnor.client.common.GenericCallback; import org.drools.guvnor.client.common.ImageButton; import org.drools.guvnor.client.common.InfoPopup; import org.drools.guvnor.client.common.LoadingPopup; import org.drools.guvnor.client.common.PrettyFormLayout; import org.drools.guvnor.client.common.SmallLabel; import org.drools.guvnor.client.common.StatusChangePopup; import org.drools.guvnor.client.common.ValidationMessageWidget; import org.drools.guvnor.client.messages.Constants; import org.drools.guvnor.client.resources.Images; import org.drools.guvnor.client.rpc.PackageConfigData; import org.drools.guvnor.client.rpc.RepositoryServiceFactory; import org.drools.guvnor.client.rpc.ValidatedResponse; import org.drools.guvnor.client.rulelist.EditItemEvent; import org.drools.guvnor.client.util.Format; 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.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * This is the package editor and viewer for package configuration. * * @author Michael Neale */ public class PackageEditor extends PrettyFormLayout { private Constants constants = GWT.create(Constants.class); private static Images images = GWT.create(Images.class); private PackageConfigData conf; private HTML status; protected ValidatedResponse previousResponse; private Command close; private Command refreshPackageList; private EditItemEvent editEvent; public PackageEditor(PackageConfigData data, Command close, Command refreshPackageList, EditItemEvent editEvent) { this.conf = data; this.close = close; this.refreshPackageList = refreshPackageList; this.editEvent = editEvent; setWidth("100%"); refreshWidgets(); } private void refreshWidgets() { clear(); FlexTable headerWidgets = new FlexTable(); headerWidgets.setWidget(0, 0, new HTML("<b>" + constants.PackageName() + ":</b>")); //NON-NLS headerWidgets.setWidget(0, 1, new Label(this.conf.name)); if (!conf.isSnapshot) { headerWidgets.setWidget(1, 0, modifyWidgets()); headerWidgets.getFlexCellFormatter().setColSpan(1, 0, 2); } addHeader(images.packageLarge(), headerWidgets); startSection(constants.ConfigurationSection()); addRow(warnings()); addAttribute(constants.Configuration(), header()); addAttribute(constants.DescriptionColon(), description()); addAttribute(constants.CategoryRules(), getAddCatRules()); addAttribute("", getShowCatRules()); if (!conf.isSnapshot) { Button save = new Button(constants.SaveAndValidateConfiguration()); save.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { doSaveAction(null); } }); addAttribute("", save); } endSection(); if (!conf.isSnapshot) { startSection(constants.BuildAndValidate()); addRow(new PackageBuilderWidget(this.conf, editEvent)); endSection(); } startSection(constants.InformationAndImportantURLs()); if (!conf.isSnapshot) { addAttribute(constants.LastModified() + ":", new Label(getDateString(conf.lastModified))); } addAttribute(constants.LastContributor() + ":", new Label(this.conf.lasContributor)); addAttribute(constants.DateCreated(), new Label(getDateString(this.conf.dateCreated))); Button buildSource = new Button(constants.ShowPackageSource()); buildSource.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { PackageBuilderWidget.doBuildSource(conf.uuid, conf.name); } }); addAttribute(constants.ShowPackageSource() + ":", buildSource); HTML html0 = new HTML("<a href='" + getDocumentationDownload(this.conf) + "' target='_blank'>" + getDocumentationDownload(this.conf) + "</a>"); addAttribute(constants.URLForDocumention(), h(html0, constants.URLDocumentionDescription())); HTML html = new HTML("<a href='" + getSourceDownload(this.conf) + "' target='_blank'>" + getSourceDownload(this.conf) + "</a>"); addAttribute(constants.URLForPackageSource(), h(html, constants.URLSourceDescription())); HTML html2 = new HTML("<a href='" + getBinaryDownload(this.conf) + "' target='_blank'>" + getBinaryDownload(this.conf) + "</a>"); addAttribute(constants.URLForPackageBinary(), h(html2, constants.UseThisUrlInTheRuntimeAgentToFetchAPreCompiledBinary())); HTML html3 = new HTML( "<a href='" + getScenarios(this.conf) + "' target='_blank'>" + getScenarios(this.conf) + "</a>"); addAttribute(constants.URLForRunningTests(), h(html3, constants.URLRunTestsRemote())); HTML html4 = new HTML( "<a href='" + getChangeset(this.conf) + "' target='_blank'>" + getChangeset(this.conf) + "</a>"); addAttribute(constants.ChangeSet(), h(html4, constants.URLToChangeSetForDeploymentAgents())); status = new HTML(); HorizontalPanel statusBar = new HorizontalPanel(); Image editState = new ImageButton(images.edit()); editState.setTitle(constants.ChangeStatusDot()); editState.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { showStatusChanger((Widget) event.getSource()); } }); statusBar.add(status); if (!this.conf.isSnapshot) { statusBar.add(editState); } setState(conf.state); addAttribute(constants.Status() + ":", statusBar); endSection(); } private Widget h(Widget w, String string) { HorizontalPanel hp = new HorizontalPanel(); hp.add(w); hp.add(new InfoPopup(constants.Tip(), string)); return hp; } private Widget getShowCatRules() { if (conf.catRules != null && conf.catRules.size() > 0) { VerticalPanel vp = new VerticalPanel(); for (Iterator<Entry<String, String>> iterator = conf.catRules.entrySet().iterator(); iterator .hasNext();) { Entry<String, String> entry = iterator.next(); HorizontalPanel hp = new HorizontalPanel(); String m = Format.format(constants.AllRulesForCategory0WillNowExtendTheRule1(), (String) entry.getValue(), (String) entry.getKey()); hp.add(new SmallLabel(m)); hp.add(getRemoveCatRulesIcon((String) entry.getKey())); vp.add(hp); } return (vp); } return new HTML(" "); //NON-NLS } private Image getRemoveCatRulesIcon(final String rule) { Image remove = new Image(images.deleteItemSmall()); remove.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (Window.confirm(constants.RemoveThisCategoryRule())) { conf.catRules.remove(rule); refreshWidgets(); } } }); return remove; } private Widget getAddCatRules() { Image add = new ImageButton(images.edit()); add.setTitle(constants.AddCatRuleToThePackage()); add.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { showCatRuleSelector((Widget) event.getSource()); } }); HorizontalPanel hp = new HorizontalPanel(); hp.add(add); hp.add(new InfoPopup(constants.CategoryParentRules(), constants.CatRulesInfo())); return hp; } private void addToCatRules(String category, String rule) { if (null != category && null != rule) { if (conf.catRules == null) { conf.catRules = new HashMap<String, String>(); } conf.catRules.put(rule, category); } } protected void showCatRuleSelector(Widget w) { final FormStylePopup pop = new FormStylePopup(images.config(), constants.AddACategoryRuleToThePackage()); final Button addbutton = new Button(constants.OK()); final TextBox ruleName = new TextBox(); final CategoryExplorerWidget exw = new CategoryExplorerWidget(new CategorySelectHandler() { public void selected(String selectedPath) { //not needed } }); ruleName.setVisibleLength(15); addbutton.setTitle(constants.CreateCategoryRule()); addbutton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (exw.getSelectedPath().length() > 0 && ruleName.getText().trim().length() > 0) { addToCatRules(exw.getSelectedPath(), ruleName.getText()); } refreshWidgets(); pop.hide(); } }); pop.addAttribute(constants.AllTheRulesInFollowingCategory(), exw); pop.addAttribute(constants.WillExtendTheFollowingRuleCalled(), ruleName); pop.addAttribute("", addbutton); pop.show(); } private String getDateString(Date d) { if (d != null) return d.toLocaleString(); else return ""; } private Widget warnings() { if (this.previousResponse != null && this.previousResponse.hasErrors) { Image img = new Image(images.warning()); HorizontalPanel h = new HorizontalPanel(); h.add(img); HTML msg = new HTML("<b>" + constants.ThereWereErrorsValidatingThisPackageConfiguration() + "</b>"); //NON-NLS h.add(msg); Button show = new Button(constants.ViewErrors()); show.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { ValidationMessageWidget wid = new ValidationMessageWidget(previousResponse.errorHeader, previousResponse.errorMessage); wid.show(); } }); h.add(show); return h; } else { return new SimplePanel(); } } static String getDocumentationDownload(PackageConfigData conf) { return makeLink(conf) + "/documentation.pdf"; //NON-NLS } static String getSourceDownload(PackageConfigData conf) { return makeLink(conf) + ".drl"; //NON-NLS } static String getBinaryDownload(PackageConfigData conf) { return makeLink(conf); } static String getScenarios(PackageConfigData conf) { return makeLink(conf) + "/SCENARIOS"; //NON-NLS } static String getChangeset(PackageConfigData conf) { return makeLink(conf) + "/ChangeSet.xml"; //NON-NLS } /** * Get a download link for the binary package. */ public static String makeLink(PackageConfigData conf) { String hurl = GWT.getModuleBaseURL() + "package/" + conf.name; if (!conf.isSnapshot) { hurl = hurl + "/" + SnapshotView.LATEST_SNAPSHOT; } else { hurl = hurl + "/" + conf.snapshotName; } final String uri = hurl; return uri; } protected void showStatusChanger(Widget w) { final StatusChangePopup pop = new StatusChangePopup(conf.uuid, true); pop.setChangeStatusEvent(new Command() { public void execute() { setState(pop.getState()); } }); pop.show(); } private void setState(String state) { status.setHTML("<b>" + state + "</b>"); } /** * This will get the save widgets. */ private Widget modifyWidgets() { HorizontalPanel horiz = new HorizontalPanel(); Button copy = new Button(constants.Copy()); copy.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { showCopyDialog(); } }); horiz.add(copy); Button rename = new Button(constants.Rename()); rename.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { showRenameDialog(); } }); horiz.add(rename); Button archive = new Button(constants.Archive()); archive.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (Window.confirm(constants.AreYouSureYouWantToArchiveRemoveThisPackage())) { conf.archived = true; Command ref = new Command() { public void execute() { close.execute(); refreshPackageList.execute(); } }; doSaveAction(ref); } } }); horiz.add(archive); return horiz; } private void showRenameDialog() { final FormStylePopup pop = new FormStylePopup(images.newWiz(), constants.RenameThePackage()); pop.addRow(new HTML(constants.RenamePackageTip())); final TextBox name = new TextBox(); pop.addAttribute(constants.NewPackageNameIs(), name); Button ok = new Button(constants.OK()); pop.addAttribute("", ok); ok.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { RepositoryServiceFactory.getService().renamePackage(conf.uuid, name.getText(), new GenericCallback<String>() { public void onSuccess(String data) { refreshPackageList.execute(); conf.name = name.getText(); refreshWidgets(); Window.alert(constants.PackageRenamedSuccessfully()); pop.hide(); } }); } }); pop.show(); } /** * Will show a copy dialog for copying the whole package. */ private void showCopyDialog() { final FormStylePopup pop = new FormStylePopup(images.newWiz(), constants.CopyThePackage()); pop.addRow(new HTML(constants.CopyThePackageTip())); final TextBox name = new TextBox(); pop.addAttribute(constants.NewPackageNameIs(), name); Button ok = new Button(constants.OK()); pop.addAttribute("", ok); ok.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (!PackageNameValidator.validatePackageName(name.getText())) { Window.alert(constants.NotAValidPackageName()); return; } LoadingPopup.showMessage(constants.PleaseWaitDotDotDot()); RepositoryServiceFactory.getService().copyPackage(conf.name, name.getText(), new GenericCallback<Void>() { public void onSuccess(Void data) { refreshPackageList.execute(); Window.alert(constants.PackageCopiedSuccessfully()); pop.hide(); LoadingPopup.close(); } }); } }); pop.show(); } private void doSaveAction(final Command refresh) { LoadingPopup.showMessage(constants.SavingPackageConfigurationPleaseWait()); RepositoryServiceFactory.getService().savePackage(this.conf, new GenericCallback<ValidatedResponse>() { public void onSuccess(ValidatedResponse data) { previousResponse = data; reload(); LoadingPopup.showMessage(constants.PackageConfigurationUpdatedSuccessfullyRefreshingContentCache()); SuggestionCompletionCache.getInstance().refreshPackage(conf.name, new Command() { public void execute() { if (refresh != null) { refresh.execute(); } LoadingPopup.close(); } }); } }); } /** * Will refresh all the data. */ public void reload() { LoadingPopup.showMessage(constants.RefreshingPackageData()); RepositoryServiceFactory.getService().loadPackageConfig(this.conf.uuid, new GenericCallback<PackageConfigData>() { public void onSuccess(PackageConfigData data) { LoadingPopup.close(); conf = data; refreshWidgets(); } }); } private Widget header() { return new PackageHeaderWidget(this.conf); } private Widget description() { final TextArea box = new TextArea(); box.setText(conf.description); box.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { conf.description = box.getText(); } }); box.setWidth("400px"); return box; } }