org.rest.client.ExternalEventsFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.rest.client.ExternalEventsFactory.java

Source

/*******************************************************************************
 * Copyright 2012 Pawe Pszty
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package org.rest.client;

import java.util.Date;

import org.rest.client.event.AddEncodingEvent;
import org.rest.client.event.ApplicationReadyEvent;
import org.rest.client.event.ClearFormEvent;
import org.rest.client.event.ClearHistoryEvent;
import org.rest.client.event.CustomEvent;
import org.rest.client.event.HttpEncodingChangeEvent;
import org.rest.client.event.HttpMethodChangeEvent;
import org.rest.client.event.ProjectChangeEvent;
import org.rest.client.event.ProjectDeleteEvent;
import org.rest.client.event.RequestEndEvent;
import org.rest.client.event.RequestStartActionEvent;
import org.rest.client.event.URLFieldToggleEvent;
import org.rest.client.event.UrlValueChangeEvent;
import org.rest.client.storage.store.objects.ProjectObject;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.xhr2.client.Response;
import com.google.web.bindery.event.shared.EventBus;

/**
 * This class is needed to register application events handlers and fire it on
 * browsers document object so external plugins can take action when other
 * action occur.
 * 
 * <p>
 * To handle applications events you need to register an handler for each type
 * of event you need to handle. <br/>
 * For example:
 * <pre>
 * document.addEventListener('arc:EVENT_NAME', function(e){ //do something... });
 * </pre>
 * For list of all custom events check {@link CustomEvent} enum.
 * </p>
 * 
 * @author Pawe Pszty
 * 
 */
public class ExternalEventsFactory {

    public final static String EXT_REQUEST_BEGIN = "requestBegin";
    public final static String EXT_GET_COLLECTED_REQUEST_DATA = "getRequestData";
    public final static String EXT_GET_EXTERNAL_REQUEST_DATA = "getExternalData";

    /**
     * Register handlers for all custom events available for application.
     * @param eventBus
     */
    public static void init(EventBus eventBus) {

        //
        // Register application's actions handlers
        //

        ApplicationReadyEvent.register(eventBus, new ApplicationReadyEvent.Handler() {
            @Override
            public void onReady() {
                fireDocumentEvent(CustomEvent.APPLICATION_READY.getValue());
            }
        });
        AddEncodingEvent.register(eventBus, new AddEncodingEvent.Handler() {
            @Override
            public void onAddEncoding(String encoding) {
                fireDocumentEvent(CustomEvent.ADD_ENCODING.getValue(), encoding);
            }
        });
        UrlValueChangeEvent.register(eventBus, new UrlValueChangeEvent.Handler() {
            @Override
            public void onUrlChange(String url) {
                fireDocumentEvent(CustomEvent.URL_CHANGE.getValue(), url);
            }
        });
        RequestStartActionEvent.register(eventBus, new RequestStartActionEvent.Handler() {
            @Override
            public void onStart(Date time) {
                double startTime = (double) time.getTime();
                fireDocumentEvent(CustomEvent.REQUEST_START_ACTION.getValue(), startTime);
            }
        });

        RequestEndEvent.register(eventBus, new RequestEndEvent.Handler() {
            @Override
            public void onResponse(boolean success, Response response, long requestTime) {
                JSONObject obj = new JSONObject();
                obj.put("error", JSONBoolean.getInstance(!success));
                obj.put("requesttime", new JSONNumber(requestTime));
                fireDocumentEvent(CustomEvent.REQUEST_STOP.getValue(), obj.getJavaScriptObject());
            }
        });
        HttpEncodingChangeEvent.register(eventBus, new HttpEncodingChangeEvent.Handler() {
            @Override
            public void onChange(String method) {
                fireDocumentEvent(CustomEvent.HTTP_ENCODING_CHANGE.getValue(), method);
            }
        });

        //
        // Register application's UI state change handlers
        //

        ClearFormEvent.register(eventBus, new ClearFormEvent.Handler() {
            @Override
            public void onClearForm() {
                fireDocumentEvent(CustomEvent.CLEAR_ALL.getValue());
            }
        });
        URLFieldToggleEvent.register(eventBus, new URLFieldToggleEvent.Handler() {
            @Override
            public void onClearForm(boolean isNowSimpleView) {
                String value = "simple";
                if (!isNowSimpleView) {
                    value = "detailed";
                }
                fireDocumentEvent(CustomEvent.URL_FIELD_TOGGLE.getValue(), value);
            }
        });
        HttpMethodChangeEvent.register(eventBus, new HttpMethodChangeEvent.Handler() {
            @Override
            public void onMethodChange(String method) {
                fireDocumentEvent(CustomEvent.HTTP_METHOD_CHANGE.getValue(), method);
            }
        });
        ClearHistoryEvent.register(eventBus, new ClearHistoryEvent.Handler() {
            @Override
            public void onClearForm() {
                fireDocumentEvent(CustomEvent.CLEAR_HISTORY.getValue());
            }
        });

        ProjectChangeEvent.register(eventBus, new ProjectChangeEvent.Handler() {
            @Override
            public void onProjectChange(ProjectObject project) {
                fireDocumentEvent(CustomEvent.PROJECT_CHANGE.getValue(), project);
            }
        });
        ProjectDeleteEvent.register(eventBus, new ProjectDeleteEvent.Handler() {
            @Override
            public void onProjectDelete(int projectId) {
                fireDocumentEvent(CustomEvent.PROJECT_DELETE.getValue(), projectId + "");
            }
        });
    }

    private final static native void fireDocumentEvent(String eventName) /*-{
                                                                         var e = $doc.createEvent('Events');
                                                                         e.initEvent(eventName);
                                                                         $doc.dispatchEvent(e);
                                                                         }-*/;

    private final static native void fireDocumentEvent(String eventName, JavaScriptObject passedData) /*-{
                                                                                                      var e = $doc.createEvent('Events');
                                                                                                      e.initEvent(eventName);
                                                                                                      if(passedData){
                                                                                                      e.data = passedData;
                                                                                                      }
                                                                                                      $doc.dispatchEvent(e);
                                                                                                      }-*/;

    private final static native void fireDocumentEvent(String eventName, double passedData) /*-{
                                                                                            var e = $doc.createEvent('Events');
                                                                                            e.initEvent(eventName);
                                                                                            if(passedData){
                                                                                            e.data = passedData;
                                                                                            }
                                                                                            $doc.dispatchEvent(e);
                                                                                            }-*/;

    private final static native void fireDocumentEvent(String eventName, String passedData) /*-{
                                                                                            var e = $doc.createEvent('Events');
                                                                                            e.initEvent(eventName);
                                                                                            if(passedData){
                                                                                            e.data = passedData;
                                                                                            }
                                                                                            $doc.dispatchEvent(e);
                                                                                            }-*/;

    private final static native void fireDocumentEvent(String eventName, Object obj) /*-{
                                                                                     var e = $doc.createEvent('Events');
                                                                                     e.initEvent(eventName);
                                                                                     e.data = obj;
                                                                                     $doc.dispatchEvent(e);
                                                                                     }-*/;
}