Esempio n. 1
0
  public void doQuery(final OutputStream out, DoQueryParameters parameters) throws Exception {
    final CdaEngine engine = CdaEngine.getInstance();
    final QueryOptions queryOptions = new QueryOptions();

    final String path =
        getRelativePath(parameters.getPath(), parameters.getSolution(), parameters.getFile());
    final CdaSettings cdaSettings = SettingsManager.getInstance().parseSettingsFile(path);

    // Handle paging options
    // We assume that any paging options found mean that the user actively wants paging.
    final long pageSize = parameters.getPageSize();
    final long pageStart = parameters.getPageStart();
    final boolean paginate = parameters.isPaginateQuery();
    if (pageSize > 0 || pageStart > 0 || paginate) {
      if (pageSize > Integer.MAX_VALUE || pageStart > Integer.MAX_VALUE) {
        throw new ArithmeticException("Paging values too large");
      }
      queryOptions.setPaginate(true);
      queryOptions.setPageSize(pageSize > 0 ? (int) pageSize : paginate ? DEFAULT_PAGE_SIZE : 0);
      queryOptions.setPageStart(
          pageStart > 0 ? (int) pageStart : paginate ? DEFAULT_START_PAGE : 0);
    }

    // Support for bypassCache (we'll maintain the name we use in CDE
    /*if(requestParams.hasParameter("bypassCache")){
      queryOptions.setCacheBypass(Boolean.parseBoolean(requestParams.getStringParameter("bypassCache","false")));
    }*/

    queryOptions.setCacheBypass(parameters.isBypassCache());

    // Handle the query itself and its output format...
    queryOptions.setOutputType(parameters.getOutputType());
    queryOptions.setDataAccessId(parameters.getDataAccessId());
    try {
      queryOptions.setOutputIndexId(parameters.getOutputIndexId());
    } catch (NumberFormatException e) {
      logger.error("Illegal outputIndexId '" + parameters.getOutputIndexId() + "'");
    }

    final ArrayList<String> sortBy = new ArrayList<String>();
    String[] def = {};
    for (Object obj : parameters.getSortBy()) {
      if (!((String) obj).equals("")) {
        sortBy.add((String) obj);
      }
    }
    queryOptions.setSortBy(sortBy);

    // ... and the query parameters
    // We identify any pathParams starting with "param" as query parameters and extra settings
    // prefixed with "setting"
    @SuppressWarnings("unchecked")
    final Iterator settings = parameters.getExtraSettings().entrySet().iterator();
    while (settings.hasNext()) {
      Map.Entry<String, Object> pairs = (Map.Entry) settings.next();
      final String name = pairs.getKey();
      final Object parameter = pairs.getValue();
      queryOptions.addSetting(name, (String) parameter);
    }
    final Iterator params = parameters.getExtraParams().entrySet().iterator();
    while (params.hasNext()) {

      Map.Entry<String, Object> pairs = (Map.Entry) params.next();
      final String name = pairs.getKey();
      final Object parameter = pairs.getValue();
      queryOptions.addParameter(name, parameter);

      //      if(name.startsWith(PREFIX_PARAMETER)){
      //          queryOptions.addParameter(name.substring(PREFIX_PARAMETER.length()), parameter);
      //          logger.debug("##########"+name+"##############");

    }
    /*
    if (param.startsWith(PREFIX_PARAMETER))
    {
      queryOptions.addParameter(param.substring(PREFIX_PARAMETER.length()), requestParams.getParameter(param));
    }
    else if (param.startsWith(PREFIX_SETTING))
    {
      queryOptions.addSetting(param.substring(PREFIX_SETTING.length()), requestParams.getStringParameter(param, ""));
    }*/

    if (parameters.isWrapItUp()) {
      String uuid = engine.wrapQuery(out, cdaSettings, queryOptions);
      logger.debug("doQuery: query wrapped as " + uuid);
      writeOut(out, uuid);
      return;
    }

    // we'll allow for the special "callback" param to be used, and passed as settingcallback to
    // jsonp exports
    if (!parameters.getJsonCallback().equals("<blank>")) {
      queryOptions.addSetting(JSONP_CALLBACK, parameters.getJsonCallback());
    }
    Exporter exporter =
        ExporterEngine.getInstance()
            .getExporter(queryOptions.getOutputType(), queryOptions.getExtraSettings());

    String attachmentName = exporter.getAttachmentName();
    String mimeType = (attachmentName == null) ? null : getMimeType(attachmentName);
    if (StringUtils.isEmpty(mimeType)) {
      mimeType = exporter.getMimeType();
    }

    if (parameters != null) ; // XXX + FIXME ==  if (this.parameterProviders != null)
    {
      setResponseHeaders(mimeType, attachmentName);
    }
    // Finally, pass the query to the engine
    engine.doQuery(out, cdaSettings, queryOptions);
  }