Package com.data2semantics.yasgui.client.helpers

Source Code of com.data2semantics.yasgui.client.helpers.SparqlQuery

package com.data2semantics.yasgui.client.helpers;

/*
* #%L
* YASGUI
* %%
* Copyright (C) 2013 Laurens Rietveld
* %%
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
* #L%
*/

import com.data2semantics.yasgui.client.View;
import com.data2semantics.yasgui.client.tab.QueryTab;
import com.data2semantics.yasgui.client.tab.optionbar.endpoints.EndpointInput;
import com.google.common.collect.HashMultimap;
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;

public class SparqlQuery {

  private static String corsNotification = "For information on CORS, and how to access your endpoint, "
      + "visit the <a href=\"http://laurensrietveld.nl/yasgui/help.html\" target=\"_blank\">YASGUI help page</a> for more information.";

 
  private View view;
  private String tabId;
  private String endpoint;
  private String queryString;
  private String acceptHeader;

  private HashMultimap<String, String> customQueryArgs;
  private RequestBuilder.Method queryRequestMethod;
  public SparqlQuery(View view) {
    this.view = view;
  }
 
  private void fetchProperties() {
    //onblur might not always fire (will have to check that). for now, store query in settings before query execution just to be sure
    view.getCallableJsMethods().storeQueryInCookie();
    queryString = view.getSelectedTabSettings().getQueryString();
    //the same happens whenever our endpointinput has focus
    EndpointInput endpointInput = view.getSelectedTab().getEndpointInput();
    if (endpointInput != null) {
      endpointInput.storeEndpointInSettings();
    }
    endpoint = view.getSelectedTabSettings().getEndpoint();
    view.checkAndAddEndpointToDs(endpoint);
   
   
    tabId = view.getSelectedTab().getID();
   
   
    if (view.getSelectedTab().getQueryType().equals("CONSTRUCT") || view.getSelectedTab().getQueryType().equals("DESCRIBE")) {
      //Change content type automatically for construct queries
      acceptHeader = view.getSelectedTabSettings().getConstructContentType();
    } else {
      acceptHeader = view.getSelectedTabSettings().getSelectContentType();
    }
    acceptHeader += ",*/*;q=0.9";
 
    customQueryArgs = view.getSelectedTabSettings().getQueryArgs();
    queryRequestMethod = (view.getSelectedTabSettings().getRequestMethod().equals("GET")? RequestBuilder.GET: RequestBuilder.POST);
  }
 
  public void doRequest() {
    if (!view.getConnHelper().isOnline() && !JsMethods.corsEnabled(endpoint)) {
      //cors disabled and not online: problem!
      String errorMsg = "YASGUI is current not connected to the YASGUI server. " +
        "This mean you can only access endpoints on your own computer (e.g. localhost), which are <a href=\"http://enable-cors.org/\" target=\"_blank\">CORS enabled</a>.<br>" +
        "The endpoint you try to access is either not running on your computer, or not CORS-enabled.<br>" +
        corsNotification;
      view.getErrorHelper().onQueryError(errorMsg, endpoint, queryString, customQueryArgs);
      return;
    }
   
    view.getElements().onQueryStart();
    RequestBuilder builder;
    HashMultimap<String, String> queryArgs = customQueryArgs;
    RequestBuilder.Method requestMethod = queryRequestMethod;
    queryArgs.put("query", queryString);
    if (JsMethods.corsEnabled(endpoint)) {
      String params = Helper.getParamsAsString(queryArgs);
      String url = endpoint;
      if (queryRequestMethod == RequestBuilder.GET) {
        url += "?" + params;
      }
      builder = new RequestBuilder(queryRequestMethod, url);
      if (queryRequestMethod == RequestBuilder.POST) {
        builder.setHeader("Content-Type", "application/x-www-form-urlencoded");
        builder.setRequestData(params);
      }
    } else {
      requestMethod = RequestBuilder.POST;
      queryArgs.put("endpoint", endpoint);
      queryArgs.put("requestMethod", (queryRequestMethod == RequestBuilder.POST? "POST": "GET"));
      builder = new RequestBuilder(RequestBuilder.POST, GWT.getModuleBaseURL() + "sparql"); //send via proxy
      builder.setHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    builder.setHeader("Accept", acceptHeader);
    try {
      final long startTime = System.currentTimeMillis();
      builder.sendRequest((requestMethod == RequestBuilder.POST? Helper.getParamsAsString(queryArgs):null), new RequestCallback() {
        public void onError(Request request, Throwable e) {
          //e.g. a timeout
          queryErrorHandler(e);
        }
       
        @Override
        public void onResponseReceived(Request request, Response response) {
          view.getElements().onQueryFinish();
          if (!response.getStatusText().equals("Abort")) {
            //if user cancels query, textStatus will be 'abort'. No need to show error window then
            if (response.getStatusCode() >= 200 && response.getStatusCode() < 300) {
              if (view.getSettings().useGoogleAnalytics()) {
                long stopTime = System.currentTimeMillis();
                GoogleAnalytics.trackEvent(new GoogleAnalyticsEvent(endpoint, JsMethods.getUncommentedSparql(queryString), Integer.toString((int)(stopTime - startTime)), (int)(stopTime - startTime)));
              }
              drawResults(response.getText(), response.getHeader("Content-Type"));
            } else {
              queryErrorHandler(response);
             
            }
          }
         

        }
      });
    } catch (RequestException e) {
      queryErrorHandler(e);
    }
  }
 
  private void queryErrorHandler(Response response) {
    if (view.getSettings().useGoogleAnalytics()) {
      GoogleAnalytics.trackEvent(new GoogleAnalyticsEvent(endpoint, JsMethods.getUncommentedSparql(queryString), "-1", -1));
    }
    view.getElements().onQueryFinish();
   
    //clear query result
    QueryTab tab = (QueryTab)view.getTabs().getTab(tabId);
    view.getTabs().selectTab(tabId);
    if (tab != null) {
      view.getSelectedTab().getResultContainer().resetResultArea();
    }
   
    String errorMsg;
    if (response.getStatusCode() == 0 && (response.getStatusText() == null || response.getStatusText().trim().length() == 0)) {
      view.getConnHelper().checkOnlineStatus();
      errorMsg = "Error querying endpoint: empty response returned";
    } else {
      errorMsg = "Error querying endpoint: " + response.getStatusCode() + " - " + response.getStatusText();
    }
    if (!Helper.inDebugMode() && view.getSettings().getEnabledFeatures().endpointSelectionEnabled() && JsMethods.corsEnabled(endpoint) != true && Helper.isLocalhostDomain(endpoint)) {
//      //we were trying to access a local endpoint via the proxy: this won't work...
      errorMsg += "<br><br>A possible reason for this error (next to an incorrect endpoint URL) is that you tried to send a query to an endpoint installed on your computer.<br>" +
          "This only works when the endpoint is <a href=\"http://enable-cors.org/\" target=\"_blank\">CORS enabled</a>.<br>" +
          corsNotification;
     
    }
    view.getErrorHelper().onQueryError(errorMsg, endpoint, queryString, customQueryArgs);
  }
 
  private void queryErrorHandler(Throwable throwable) {
    view.getElements().onQueryFinish();
   
    if (view.getSettings().useGoogleAnalytics()) {
      GoogleAnalytics.trackEvent(new GoogleAnalyticsEvent(endpoint, JsMethods.getUncommentedSparql(queryString), "-1", -1));
    }
   
    //clear query result
    QueryTab tab = (QueryTab)view.getTabs().getTab(tabId);
    view.getTabs().selectTab(tabId);
    if (tab != null) {
      view.getSelectedTab().getResultContainer().resetResultArea();
    }
   
    view.getErrorHelper().onQueryError(throwable.getMessage(), endpoint, queryString, customQueryArgs);
  }


  private void preProcess() {
    //set history checkpoint (do before resetting resultcontainer, as we need this info)
    view.getHistory().setHistoryCheckpoint();
   
    //clear current result container -before- query, not after
    view.getSelectedTab().getResultContainer().resetResultArea();
   
    //disable string to download icon
    if (JsMethods.stringToDownloadSupported()) {
      view.getSelectedTab().getDownloadLink().showDisabledIcon();
    }
   
    //onblur might not always fire (will have to check that). for now, store query in settings before query execution just to be sure
    view.getCallableJsMethods().storeQueryInCookie();
    //the same happens whenever our endpointinput has focus
    EndpointInput endpointInput = view.getSelectedTab().getEndpointInput();
    if (endpointInput != null) {
      endpointInput.storeEndpointInSettings();
    }
    view.checkAndAddEndpointToDs(endpoint);
  }
 
  private void drawResults(String resultString, String contentType) {
    QueryTab tab = (QueryTab)view.getTabs().getTab(tabId);
    view.getTabs().selectTab(tabId);
    if (tab == null) {
      view.getErrorHelper().onError("No tab to draw results in");
    }
    tab.getResultContainer().drawResult(endpoint, queryString, resultString, contentType);
  }
 
  public static void exec(View view) {
    SparqlQuery query = new SparqlQuery(view);
    query.fetchProperties();
    query.preProcess();
    query.doRequest();
  }
}
TOP

Related Classes of com.data2semantics.yasgui.client.helpers.SparqlQuery

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.