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: gernotbelger@9220: import java.util.List; gernotbelger@9220: import java.util.Map; gernotbelger@9220: import java.util.Set; 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.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: gernotbelger@9220: import com.google.gwt.core.client.GWT; gernotbelger@9220: import com.google.gwt.user.client.rpc.AsyncCallback; gernotbelger@9220: import com.smartgwt.client.util.SC; gernotbelger@9220: import com.smartgwt.client.widgets.events.ClickEvent; ingo@901: ingo@901: public class WspDatacagePanel extends DatacagePanel { ingo@901: christian@4130: private static final long serialVersionUID = 2494432743877141135L; christian@4130: gernotbelger@9220: private static final String WATERLEVEL_OUTS = "waterlevels_panel"; ingo@901: gernotbelger@9220: private final LoadArtifactServiceAsync loadService = GWT.create(LoadArtifactService.class); ingo@901: gernotbelger@9220: public WspDatacagePanel(final User user) { gernotbelger@9220: super(user, WATERLEVEL_OUTS, null, false); ingo@901: } ingo@901: 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: * gernotbelger@9220: * @param e gernotbelger@9220: * The ClickEvent. ingo@909: */ ingo@909: @Override gernotbelger@9220: public void onClick(final ClickEvent e) { gernotbelger@9220: final List errors = validate(); ingo@909: if (errors == null || errors.isEmpty()) { felix@7570: // 1) Fetch selected recommendation. gernotbelger@9220: final Config config = Config.getInstance(); gernotbelger@9220: final String locale = config.getLocale(); gernotbelger@9220: final Collection c = this.collection; gernotbelger@9220: final Recommendation r = getSelectedRecommendation(); 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. gernotbelger@9220: this.loadService.load(c, r, r.getFactory(), locale, new AsyncCallback() { gernotbelger@9220: @Override gernotbelger@9220: public void onFailure(final Throwable caught) { gernotbelger@9220: GWT.log("WspDatacagePanel", caught); gernotbelger@9220: SC.warn(FLYS.getExceptionString(MSG, caught)); gernotbelger@9220: } ingo@909: gernotbelger@9220: @Override gernotbelger@9220: public void onSuccess(final Artifact newArtifact) { gernotbelger@9220: GWT.log("Created new artifact."); gernotbelger@9220: fireStepForwardEvent(new StepForwardEvent(getData(r, newArtifact))); ingo@909: } gernotbelger@9220: }); gernotbelger@9220: } else { ingo@909: showErrors(errors); ingo@909: } ingo@909: } ingo@909: ingo@909: protected Recommendation getSelectedRecommendation() { gernotbelger@9220: final ToLoad toLoad = getSelection(); gernotbelger@9220: final List recoms = toLoad.toRecommendations(); ingo@909: christian@3521: return recoms.size() > 0 ? recoms.get(0) : null; 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: felix@6580: /** Returns a Data Array with one default item. */ gernotbelger@9220: protected final Data[] getData(final Recommendation r, final Artifact newArtifact) { gernotbelger@9220: final String uuid = newArtifact.getUuid(); ingo@909: r.setMasterArtifact(uuid); ingo@909: gernotbelger@9220: final String value = createDataString(uuid, r); ingo@909: gernotbelger@9220: final String dataName = getMyDataName(); gernotbelger@9220: gernotbelger@9220: final DataItem item = new DefaultDataItem(dataName, dataName, value); gernotbelger@9220: return new Data[] { new DefaultData(dataName, null, null, new DataItem[] { item }) }; ingo@901: } ingo@909: gernotbelger@9220: private String createDataString(final String artifactId, final Recommendation recommendation) { teichmann@7885: felix@7570: // The filter will only be available or previous calculation artifacts. gernotbelger@9220: final Filter filter = recommendation.getFilter(); ingo@909: felix@7570: if (filter != null) { gernotbelger@9220: Facet f = null; ingo@909: gernotbelger@9220: final Map> outs = filter.getOuts(); gernotbelger@9220: final Set>> entries = outs.entrySet(); gernotbelger@9220: gernotbelger@9220: for (final Map.Entry> entry : entries) { gernotbelger@9220: final 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: gernotbelger@9220: return "[" + artifactId + ";" + f.getName() + ";" + f.getIndex() + "]"; ingo@909: } gernotbelger@9220: gernotbelger@9220: return "[" + artifactId + ";" + recommendation.getFactory() + ";" + 0 + "]"; ingo@909: } gernotbelger@9220: }