teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui; ingo@901: ingo@909: import com.google.gwt.core.client.GWT; ingo@909: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@909: ingo@909: import com.smartgwt.client.util.SC; ingo@909: import com.smartgwt.client.widgets.events.ClickEvent; ingo@909: teichmann@5835: import org.dive4elements.river.client.client.Config; teichmann@5835: import org.dive4elements.river.client.client.FLYS; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.event.StepForwardEvent; teichmann@5835: import org.dive4elements.river.client.client.services.LoadArtifactService; teichmann@5835: import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; teichmann@5835: import org.dive4elements.river.client.shared.model.Artifact; teichmann@5835: import org.dive4elements.river.client.shared.model.Collection; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.Recommendation; teichmann@5835: import org.dive4elements.river.client.shared.model.Recommendation.Facet; teichmann@5835: import org.dive4elements.river.client.shared.model.Recommendation.Filter; teichmann@5835: import org.dive4elements.river.client.shared.model.ToLoad; teichmann@5835: import org.dive4elements.river.client.shared.model.User; ingo@901: christian@4130: import java.util.List; christian@4130: import java.util.Map; christian@4130: import java.util.Set; ingo@909: ingo@901: ingo@901: public class WspDatacagePanel extends DatacagePanel { ingo@901: christian@4130: private static final long serialVersionUID = 2494432743877141135L; christian@4130: ingo@1278: public static final String WATERLEVEL_OUTS = "waterlevels"; ingo@901: ingo@909: public static final FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@909: ingo@909: ingo@909: protected LoadArtifactServiceAsync loadService = ingo@909: GWT.create(LoadArtifactService.class); ingo@909: ingo@909: protected Recommendation recommendation; ingo@909: protected Artifact artifact; ingo@909: ingo@901: ingo@901: public WspDatacagePanel() { ingo@901: super(); ingo@901: } ingo@901: ingo@901: ingo@901: public WspDatacagePanel(User user) { ingo@901: super(user); ingo@901: } ingo@901: ingo@901: ingo@901: @Override ingo@901: public String getOuts() { ingo@901: return WATERLEVEL_OUTS; ingo@901: } ingo@901: ingo@901: ingo@1268: @Override ingo@1268: protected void createWidget() { ingo@1268: super.createWidget(); ingo@1268: widget.setIsMutliSelectable(false); ingo@1268: } ingo@1268: ingo@1268: ingo@909: /** ingo@909: * We need to override this method (defined in AbstractUIProvider) because felix@6580: * we have to create a new Artifact specified by the Datacage selection via ingo@909: * Async request. ingo@909: * felix@3363: * @param e The ClickEvent. ingo@909: */ ingo@909: @Override ingo@909: public void onClick(ClickEvent e) { ingo@909: List errors = validate(); ingo@909: if (errors == null || errors.isEmpty()) { felix@7570: // 1) Fetch selected recommendation. ingo@909: Config config = Config.getInstance(); ingo@909: final String locale = config.getLocale(); ingo@909: final Collection c = this.collection; ingo@909: final Recommendation r = getSelectedRecommendation(); ingo@909: christian@4130: christian@4130: if (r == null) { christian@4130: SC.warn(MSG.warning_no_wsp_selected()); christian@4130: return; christian@4130: } christian@4130: felix@7570: // TODO: This could eventually be handled server-side. felix@7570: // 2) Create, load Artifact and fire event. ingo@909: loadService.load( felix@7570: c, r, r.getFactory(), locale, ingo@909: new AsyncCallback() { christian@4130: @Override ingo@909: public void onFailure(Throwable caught) { christian@4130: GWT.log("WspDatacagePanel", caught); christian@4130: SC.warn(FLYS.getExceptionString(MSG, caught)); ingo@909: } ingo@909: christian@4130: @Override felix@7570: public void onSuccess(Artifact newArtifact) { felix@7570: GWT.log("Created new artifact."); ingo@909: fireStepForwardEvent(new StepForwardEvent( felix@7570: getData(r, newArtifact))); ingo@909: } ingo@909: } ingo@909: ); ingo@909: } ingo@909: else { ingo@909: showErrors(errors); ingo@909: } ingo@909: } ingo@909: ingo@909: ingo@909: protected Recommendation getSelectedRecommendation() { ingo@909: ToLoad toLoad = widget.getSelection(); ingo@909: List recoms = toLoad.toRecommendations(); ingo@909: christian@3521: return recoms.size() > 0 ? recoms.get(0) : null; ingo@909: } ingo@909: ingo@909: ingo@909: /** ingo@909: * Nothing is done in this method. It returns null, because we serve the ingo@909: * Data another way! ingo@909: * ingo@909: * @return always null! ingo@909: */ ingo@901: @Override ingo@901: protected Data[] getData() { ingo@909: // do nothing here, the Data is fetched on another way in this panel. ingo@909: return null; ingo@909: } ingo@909: ingo@909: felix@6580: /** Returns a Data Array with one default item. */ ingo@909: protected Data[] getData(Recommendation r, Artifact newArtifact) { ingo@909: String uuid = newArtifact.getUuid(); ingo@909: r.setMasterArtifact(uuid); ingo@909: felix@7570: String value = createDataString(uuid, r); ingo@909: ingo@901: DataItem item = new DefaultDataItem(dataName, dataName, value); ingo@901: return new Data[] { new DefaultData( ingo@901: dataName, null, null, new DataItem[] { item }) }; ingo@901: } ingo@909: ingo@909: felix@7570: protected String createDataString(String artifact, Recommendation recommendation) { ingo@909: Facet f = null; felix@7570: felix@7570: // The filter will only be available or previous calculation artifacts. felix@7570: Filter filter = recommendation.getFilter(); ingo@909: felix@7570: if (filter != null) { felix@7570: Map> outs = filter.getOuts(); felix@7570: Set>> entries = outs.entrySet(); ingo@909: felix@7570: for (Map.Entry> entry: entries) { felix@7570: List fs = entry.getValue(); felix@7570: felix@7570: f = fs.get(0); felix@7570: if (f != null) { felix@7570: break; felix@7570: } ingo@909: } felix@7570: felix@7570: return "[" + artifact + ";" + f.getName() + ";" + f.getIndex() + "]"; ingo@909: } felix@7570: else { felix@7570: return "[" + artifact + ";" + recommendation.getFactory() + ";" + 0 + "]"; felix@7570: } ingo@909: } ingo@901: } ingo@901: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :