net.cbtltd.client.widget.review.ReviewWidget.java Source code

Java tutorial

Introduction

Here is the source code for net.cbtltd.client.widget.review.ReviewWidget.java

Source

/**
 * @author   bookingnet
 * @
 * @version   4.0.0
 */
package net.cbtltd.client.widget.review;

import java.util.ArrayList;

import net.cbtltd.client.AbstractRoot;
import net.cbtltd.client.Component;
import net.cbtltd.client.Components;
import net.cbtltd.client.GuardedRequest;
import net.cbtltd.client.HasComponents;
import net.cbtltd.client.field.AbstractField;
import net.cbtltd.client.field.AbstractField.Level;
import net.cbtltd.client.field.ListField;
import net.cbtltd.client.widget.NameIdWidgetItems;
import net.cbtltd.client.widget.RazorWidget;
import net.cbtltd.shared.Error;
import net.cbtltd.shared.Event;
import net.cbtltd.shared.JSONRequest;
import net.cbtltd.shared.License;
import net.cbtltd.shared.NameId;
import net.cbtltd.shared.NameIdAction;
import net.cbtltd.shared.Service;
import net.cbtltd.shared.Table;
import net.cbtltd.shared.api.HasTable;
import net.cbtltd.client.resource.Hosts;
import net.cbtltd.shared.rate.RateNote;
import net.cbtltd.shared.rate.RateNoteTable;

import com.allen_sauer.gwt.log.client.Log;
import com.bookingnet.config.RazorConfig;
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.jsonp.client.JsonpRequestBuilder;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
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.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;

/** The Class ReviewWidget is to display and enter guest feedback via a widget that can be hosted by a web page. */
public class ReviewWidget extends VerticalPanel implements ChangeHandler, HasComponents {

    private static final ReviewConstants CONSTANTS = GWT.create(ReviewConstants.class);
    private static final Hosts HOSTS = GWT.create(Hosts.class);
    private static final Components COMPONENTS = new Components();
    private static final Image loader = new Image(AbstractField.BUNDLE.loader());

    private static ListField productField;
    private static VerticalPanel form = new VerticalPanel();
    private boolean rpc;
    private String pos;

    /* (non-Javadoc)
     * @see net.cbtltd.client.HasComponents#addComponent(net.cbtltd.client.Component)
     */
    public void addComponent(Component component) {
        COMPONENTS.add(component);
    }

    /* (non-Javadoc)
     * @see net.cbtltd.client.HasComponents#onRefresh()
     */
    public void onRefresh() {
        COMPONENTS.onRefresh();
    }

    /* (non-Javadoc)
     * @see net.cbtltd.client.HasComponents#hasChanged()
     */
    public boolean hasChanged() {
        return COMPONENTS.hasChanged();
    }

    /* (non-Javadoc)
     * @see net.cbtltd.client.HasComponents#onReset(java.lang.String)
     */
    public void onReset(String state) {
        COMPONENTS.onReset();
    }

    /* (non-Javadoc)
     * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent)
     */
    public void onClick(ClickEvent click) {
    }

    /* (non-Javadoc)
     * @see com.google.gwt.event.dom.client.ChangeHandler#onChange(com.google.gwt.event.dom.client.ChangeEvent)
     */
    public void onChange(ChangeEvent change) {
        getReview();
    }

    /* A timer to schedule periodic refreshes of the widget. */
    private final Timer refreshTimer = new Timer() {
        public void run() {
            getReview();
        }
    };

    /**
     * Instantiates a new review widget.
     * If GWT RPC is used the widget must be in an iFrame in the host HTML page to prevent cross-site problems.
     * If JSONP is used the widget JavaScript must be served from the same site as the host HTML page.
     *
     * @param rpc is true if GWT RPC is to be used, else JSONP is used.
     * @param pos the point of sale code of the organization hosting the widget.
     * @param productid the ID of the product to be reviewed.
     */
    public ReviewWidget(boolean rpc, String pos, String productid) {
        try {
            if (productid == null || productid.isEmpty()) {
                throw new RuntimeException(Error.product_id.getMessage());
            }
            this.rpc = rpc;
            this.pos = pos;
            this.setStylePrimaryName("ReviewWidget");

            int tab = 0;

            //-----------------------------------------------
            // Product field
            //-----------------------------------------------
            productField = new ListField(this, null, new NameIdAction(Service.PRODUCT), CONSTANTS.productLabel(),
                    false, tab++);
            productField.setFieldStyle("Field");
            productField.setLabelStyle("Label");
            productField.setAllOrganizations(true);
            productField.setIds(NameId.getCdlist(productid));
            productField.setVisible(productid.split(",").length > 1); // multiple properties
            productField.setHelpText(CONSTANTS.productHelp());

            loader.setVisible(false);

            final HorizontalPanel bar = new HorizontalPanel();
            bar.add(productField);
            bar.add(loader);
            this.add(bar);

            final Label label = new Label(CONSTANTS.reviewLabel());
            label.addStyleName("Label");
            this.add(label);

            this.add(form);

            this.add(RazorWidget.getHome());

            getProduct(productid);
            refreshTimer.cancel();
            refreshTimer.schedule(RazorWidget.delay);
        } catch (Throwable x) {
            x.printStackTrace();
            throw new RuntimeException(Error.widget_review.getMessage() + " " + x.getMessage());
        }
    }

    /* The request callback to refresh guest reviews. */
    private void getReview() {
        if (rpc) {
            reviewWidget.execute();
        } else {
            getJsonpReview();
        }
    }

    /* The RPC request callback to refresh guest reviews. */
    final GuardedRequest<Table<RateNote>> reviewWidget = new GuardedRequest<Table<RateNote>>() {
        protected boolean error() {
            return (RazorWidget.ifMessage(productField.noValue(), Level.TERSE, CONSTANTS.productError(),
                    productField));
        }

        protected void send() {
            super.send(new RateNoteTable(productField.getValue(), Event.DATE + HasTable.ORDER_BY_DESC, 0,
                    RazorWidget.getRows()));
        }

        protected void receive(Table<RateNote> response) {
            if (response == null || response.getValue() == null || response.getValue().isEmpty()) {
                AbstractField.addMessage(Level.ERROR, CONSTANTS.reviewError(), productField);
            } else {
                renderNotes(response.getValue());
            }
        }
    };

    /* The JSONP request callback to refresh guest reviews. */
    private void getJsonpReview() {
        if (productField.noValue()) {
            return;
        }

        JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
        String url = HOSTS.jsonUrl() + "?service=" + JSONRequest.REVIEW + "&pos=" + pos + "&productid="
                + productField.getValue() + "&rows=" + RazorWidget.getRows();

        loader.setVisible(true);
        jsonp.requestObject(url, new AsyncCallback<ReviewWidgetItems>() {

            @Override
            public void onFailure(Throwable x) {
                loader.setVisible(false);
                throw new RuntimeException(Error.widget_review.getMessage() + " " + x.getMessage());
            }

            @Override
            public void onSuccess(ReviewWidgetItems response) {
                loader.setVisible(false);
                if (response == null || response.getItems() == null || response.getItems().length() == 0) {
                    AbstractField.addMessage(Level.ERROR, CONSTANTS.reviewError(), productField);
                } else {
                    final ArrayList<RateNote> notes = new ArrayList<RateNote>();
                    for (int row = 0; row < response.getItems().length(); row++) {
                        ReviewWidgetItem value = response.getItems().get(row);
                        Log.debug("row " + row + " " + value.string());
                        final RateNote note = new RateNote();
                        note.setDate(RazorWidget.DF.parse(value.getDate().trim()));
                        note.setRating(value.getRating());
                        note.setNotes(value.getNotes());
                        notes.add(note);
                    }
                    renderNotes(notes);
                }
            }
        });
    }

    /* 
     * The request callback to get product name ID pairs.
     * 
     *  @param productid the ID of the selected product.
     */
    private void getProduct(String productid) {
        if (rpc) {
            productField.onRefresh();
        } else {
            getJsonpProductNameids(productid);
        }
    }

    /*
     * The JSONP request callback to refresh product name ID pairs.
     * 
     * @param productid the ID of the selected product.
     */
    private void getJsonpProductNameids(String productid) {

        JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
        String url = HOSTS.jsonUrl() + "?service=" + JSONRequest.NAMEID + "&pos=" + pos + "&model="
                + NameId.Type.Product.name() + "&id=" + productid;

        loader.setVisible(true);
        jsonp.requestObject(url, new AsyncCallback<NameIdWidgetItems>() {

            @Override
            public void onFailure(Throwable x) {
                loader.setVisible(false);
                throw new RuntimeException(Error.nameid_json.getMessage() + " " + x.getMessage());
            }

            @Override
            public void onSuccess(NameIdWidgetItems response) {
                loader.setVisible(false);
                if (response != null && response.getItems() != null && response.getItems().length() > 0) {
                    ArrayList<NameId> items = new ArrayList<NameId>();
                    for (int index = 0; index < response.getItems().length(); index++) {
                        items.add(new NameId(response.getItems().get(index).getName(),
                                response.getItems().get(index).getId()));
                    }
                    productField.setItems(items);
                    getJsonpReview();
                }
            }
        });
    }

    /* Render the review notes. */
    private void renderNotes(ArrayList<RateNote> notes) {
        form.clear();
        int row = 0;
        for (RateNote note : notes) {
            Label header = new Label("Date " + AbstractRoot.getDF().format(note.getDate()) + " Rating "
                    + AbstractField.QF.format(note.getRating()));
            header.setStylePrimaryName(AbstractField.CSS.cbtAbstractField());
            header.addStyleName("Header");
            form.add(header);
            TextArea text = new TextArea();
            text.setStylePrimaryName(AbstractField.CSS.cbtAbstractField());
            text.addStyleName(row % 2 == 0 ? "Odd" : "Even");
            text.setValue(note.getNotes());
            form.add(text);
            row++;
        }
        this.add(form);
    }

}