org.pentaho.mantle.client.solutionbrowser.filepicklist.AbstractFilePickList.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.solutionbrowser.filepicklist.AbstractFilePickList.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * 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 Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.mantle.client.solutionbrowser.filepicklist;

import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;

import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox;
import org.pentaho.mantle.client.messages.Messages;

import java.util.ArrayList;

public abstract class AbstractFilePickList<T extends IFilePickItem> {

    private static final String FILE_PICK_ADD = "add";
    private static final String FILE_PICK_REMOVE = "remove";

    private ArrayList<T> filePickList;
    private int maxSize = 0; // 0 size equals no limit
    private ArrayList<IFilePickListListener<T>> listeners = new ArrayList<IFilePickListListener<T>>();

    public AbstractFilePickList() {
        this.filePickList = new ArrayList<T>(10);
    }

    public AbstractFilePickList(ArrayList<T> filePickList) {
        this.filePickList = filePickList;
        fireItemsChangedEvent();
    }

    public AbstractFilePickList(JSONArray jsonFilePickList) {
        filePickList = new ArrayList<T>();
        T filePickItem;
        for (int i = 0; i < jsonFilePickList.size(); i++) {
            filePickItem = createFilePickItem(jsonFilePickList.get(i).isObject());
            filePickList.add(filePickItem);
        }
        fireItemsChangedEvent();
    }

    abstract T createFilePickItem(JSONObject jsonFilePickItem);

    public abstract boolean contains(String fileNameWithPath);

    /**
     * @return JSONArray representation of list suitable for storage
     */
    public JSONArray toJson() {
        JSONArray jsa = new JSONArray();
        T filePickItem;
        for (int i = 0; i < filePickList.size(); i++) {
            filePickItem = filePickList.get(i);
            jsa.set(i, filePickItem.toJson());
        }
        return jsa;
    }

    public int size() {
        return filePickList.size();
    }

    public void add(T pickListItem) {
        reloadFavorites(pickListItem, FILE_PICK_ADD);
    }

    /**
     * If the object is already in the list it will be removed first and the index adjusted accordingly. If maxSize
     * is positive and adding the item would exceed maxSize, then the item will not be added.
     * 
     * @param index
     * @param pickListItem
     */
    public void add(int index, T pickListItem) {
        int i = filePickList.indexOf(pickListItem);
        if (i != -1) {
            if (i < index) {
                index--;
            }
            filePickList.remove(i);
        }
        if (maxSize <= 0 || filePickList.size() < maxSize) {
            filePickList.add(index, pickListItem);
        }
        fireItemsChangedEvent();
    }

    public void remove(T pickListItem) {
        if (pickListItem instanceof FavoritePickItem) {
            reloadFavorites(pickListItem, FILE_PICK_REMOVE);
        } else if (pickListItem instanceof RecentPickItem) {
            reloadRecents(pickListItem, FILE_PICK_REMOVE);
        }
    }

    public T remove(int index) {
        T removed = filePickList.remove(index);
        fireItemsChangedEvent();
        return removed;
    }

    public void clear() {
        filePickList.clear();
        fireItemsChangedEvent();
    }

    public boolean contains(T pickListItem) {
        return filePickList.contains(pickListItem);
    }

    public void fireItemsChangedEvent() {
        for (IFilePickListListener<T> listener : listeners) {
            listener.itemsChanged(this);
        }
    }

    public void addPickListListener(IFilePickListListener<T> listener) {
        listeners.add(listener);
    }

    public void removePickListListener(IFilePickListListener<T> listener) {
        listeners.remove(listener);
    }

    /**
     * @return serialize to JSON String suitable for storage
     */
    public String stringify() {
        return toJson().toString();
    }

    /**
     * helper method for debugging. Use <code>stringify()</code> for formal JSON conversion.
     */
    public String toString() {
        return toJson().toString();
    }

    /**
     * 
     * @return true if the list was truncated
     */
    private boolean truncateToMaxSize() {
        boolean result = false;
        if (maxSize > 0) {
            if (filePickList.size() > maxSize) {
                while (filePickList.size() > maxSize) {
                    filePickList.remove(filePickList.size() - 1);
                }
                result = true;
            }
        }
        return result;
    }

    public ArrayList<T> getFilePickList() {
        return filePickList;
    }

    public void setFilePickList(ArrayList<T> filePickList) {
        this.filePickList = filePickList;
    }

    /**
     * @return the maxSize
     */
    public int getMaxSize() {
        return maxSize;
    }

    /**
     * @param maxSize
     *          Set Maximum number of entries in list, 0 = unlimited
     */
    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
        if (truncateToMaxSize()) {
            fireItemsChangedEvent();
        }
    }

    /**
     * Convert the FilePickList to JSON and save it to a user setting
     * 
     * @param settingName
     */
    public void save(String settingName) {
        final String url = GWT.getHostPageBaseURL() + "api/user-settings/" + settingName; //$NON-NLS-1$

        RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url);
        try {
            builder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
            builder.sendRequest(toJson().toString(), new RequestCallback() {

                public void onError(Request request, Throwable exception) {
                    MessageDialogBox dialog = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                            Messages.getString("couldNotSetUserSettings"), true, false, true); //$NON-NLS-1$
                    dialog.center();
                }

                public void onResponseReceived(Request request, Response response) {
                    fireOnSavedEvent();
                }
            });
        } catch (RequestException e) {
            // showError(e);
        }
    }

    public void reloadFavorites(final T pickListItem, final String command) {
        final String url = GWT.getHostPageBaseURL() + "api/user-settings/favorites"; //$NON-NLS-1$

        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        try {
            builder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
            builder.setHeader("accept", "application/json");
            builder.sendRequest(null, new RequestCallback() {
                public void onError(Request request, Throwable exception) {
                    // showError(exception);
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() == Response.SC_OK) {
                        try {
                            JSONArray jsonArr = (JSONArray) JSONParser.parse(response.getText());
                            filePickList = new ArrayList<T>();
                            T filePickItem;
                            for (int i = 0; i < jsonArr.size(); i++) {
                                filePickItem = createFilePickItem(jsonArr.get(i).isObject());
                                filePickList.add(filePickItem);
                            }
                            if (FILE_PICK_ADD.equals(command)) {
                                add(filePickList.size(), pickListItem);
                            } else if (FILE_PICK_REMOVE.equals(command)) {
                                filePickList.remove(pickListItem);
                                fireItemsChangedEvent();
                            }
                        } catch (Exception e) {
                            if (FILE_PICK_ADD.equals(command)) {
                                add(filePickList.size(), pickListItem);
                            } else if (FILE_PICK_REMOVE.equals(command)) {
                                filePickList.remove(pickListItem);
                                fireItemsChangedEvent();
                            }
                        }
                    }
                }
            });
        } catch (RequestException e) {
            // showError(e);
        }
    }

    public void reloadRecents(final T pickListItem, final String command) {
        final String url = GWT.getHostPageBaseURL() + "api/user-settings/recent"; //$NON-NLS-1$

        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        try {
            builder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
            builder.setHeader("accept", "application/json");
            builder.sendRequest(null, new RequestCallback() {
                public void onError(Request request, Throwable exception) {
                    // showError(exception);
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() == Response.SC_OK) {
                        try {
                            JSONArray jsonArr = (JSONArray) JSONParser.parse(response.getText());
                            filePickList = new ArrayList<T>();
                            T filePickItem;
                            for (int i = 0; i < jsonArr.size(); i++) {
                                filePickItem = createFilePickItem(jsonArr.get(i).isObject());
                                filePickList.add(filePickItem);
                            }
                            if (FILE_PICK_REMOVE.equals(command)) {
                                filePickList.remove(pickListItem);
                                fireItemsChangedEvent();
                            }
                        } catch (Exception e) {
                            if (FILE_PICK_REMOVE.equals(command)) {
                                filePickList.remove(pickListItem);
                                fireItemsChangedEvent();
                            }
                        }
                    }
                }
            });
        } catch (RequestException e) {
            // showError(e);
        }
    }

    private void fireOnSavedEvent() {
        for (IFilePickListListener<T> listener : listeners) {
            listener.onSaveComplete(this);
        }
    }
}