/** * Copyright (C) 2011 BonitaSoft S.A. * BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2.0 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.bonitasoft.web.toolkit.client.ui.page; import static com.google.gwt.query.client.GQuery.$; import static org.bonitasoft.web.toolkit.client.common.i18n.AbstractI18n._; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.bonitasoft.web.toolkit.client.ViewController; import org.bonitasoft.web.toolkit.client.common.TreeIndexed; import org.bonitasoft.web.toolkit.client.common.exception.api.APIException; import org.bonitasoft.web.toolkit.client.common.json.JSonItemReader; import org.bonitasoft.web.toolkit.client.common.texttemplate.Arg; import org.bonitasoft.web.toolkit.client.data.APIID; import org.bonitasoft.web.toolkit.client.data.api.APICaller; import org.bonitasoft.web.toolkit.client.data.api.callback.APICallback; import org.bonitasoft.web.toolkit.client.data.item.IItem; import org.bonitasoft.web.toolkit.client.data.item.ItemDefinition; import org.bonitasoft.web.toolkit.client.ui.Page; import com.google.gwt.query.client.GQuery; import com.google.gwt.user.client.Element; /** * @author Séverin Moussel * */ public abstract class PageOnItem<T extends IItem> extends Page { protected ItemDefinition itemDefinition = null; public final static String PARAMETER_ITEM_ID = "id"; public PageOnItem(final ItemDefinition itemDefinition) { super(); this.itemDefinition = itemDefinition; } public PageOnItem(final String itemId, final ItemDefinition itemDefinition) { this(itemDefinition); setItemId(itemId); } public PageOnItem(final APIID itemId, final ItemDefinition itemDefinition) { this(itemDefinition); setItemId(itemId); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ITEM ID // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private APIID itemId = null; public final void setItemId(final String itemId) { this.itemId = APIID.makeAPIID(itemId); } public final void setItemId(final APIID itemId) { this.itemId = itemId; } protected APIID getItemId() { return this.itemId; } private T __pload = null; public final void __pload(final T item) { this.__pload = item; } protected List<String> defineDeploys() { return new ArrayList<String>(); } protected List<String> defineCounters() { return new ArrayList<String>(); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // OVERRIDES // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override public void setParameters(final Map<String, String> params) { super.setParameters(params); if (params.containsKey(PARAMETER_ITEM_ID)) { setItemId(params.get(PARAMETER_ITEM_ID)); } } @Override public void setParameters(final TreeIndexed<String> params) { super.setParameters(params); if (params.containsKey(PARAMETER_ITEM_ID)) { setItemId(params.getValue(PARAMETER_ITEM_ID)); } } @Override public void setParameters(final Arg... params) { super.setParameters(params); for (final Arg param : params) { if (PARAMETER_ITEM_ID.equals(param.getName())) { setItemId(param.getValue()); break; } } } @Override public void addParameter(final String name, final String value) { super.addParameter(name, value); if (PARAMETER_ITEM_ID.equals(name)) { setItemId(value); } } @Override public void addParameter(final String name, final String... values) { super.addParameter(name, values); if (PARAMETER_ITEM_ID.equals(name)) { setItemId(APIID.makeAPIID(values)); } } @Override public void refresh() { ViewController.showView(getToken(), getParentElement(), getParameters()); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // EXECUTION // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private T item = null; @Override protected final void _fillWidget(final Element rootElement) { if (this.__pload != null) { this.item = this.__pload; super._fillWidget(rootElement); return; } new APICaller(itemDefinition).get(this.itemId, defineDeploys(), defineCounters(), new APICallback() { @SuppressWarnings("unchecked") @Override public void onSuccess(final int httpStatusCode, final String response, final Map<String, String> headers) { // fix for IE. Sometime IE add element evenif not in parent anymore. if (!GQuery.contains(PageOnItem.this.getParentElement(), PageOnItem.this.getElement())) { return; } try { PageOnItem.this.item = (T) JSonItemReader.parseItem(response, PageOnItem.this.itemDefinition); } catch (final Exception e) { fail(e.getMessage()); return; } $(PageOnItem.this.getParentElement()).children().not(PageOnItem.this.getElement()).remove(); $(PageOnItem.this.getElement()).show(); PageOnItem.super._fillWidget(rootElement); ViewController.getInstance().triggerLoad(); ViewController.updateUI(PageOnItem.this.getElement()); } @Override public void onError(final String message, final Integer errorCode) { if (isNotFoundItem(errorCode)) { onItemNotFound(PageOnItem.this.itemId); } else if (isForbidden(errorCode)) { onForbidden(); } else { fail(message); } } }); } private boolean isNotFoundItem(final Integer errorCode) { return errorCode != null && errorCode.equals(HttpServletResponse.SC_NOT_FOUND); } private boolean isForbidden(final Integer errorCode) { return errorCode != null && errorCode.equals(HttpServletResponse.SC_FORBIDDEN); } protected void onItemNotFound(final APIID itemId) { fail(_("Item not found")); } protected void onForbidden() { fail(_("Permission denied: you do not have the rights to view this item.")); } protected abstract void defineTitle(T item); @Override public final void defineTitle() { defineTitle(this.item); } protected abstract void buildView(T item); @Override public final void buildView() { buildView(this.item); } protected void fail(final String message) { throw new APIException(message); } }