/**
   * takes a query object and calls the appropriate sub component that answers the given query
   *
   * @param query the query that has to be answered
   * @return a string in the answer exchange format that will be sent to the frontend
   */
  public static String handleQuery(Query query) {
    // interval search
    String answer;
    if (query.x_Search == null) {
      // check if necessary fields are given
      if (query.i_Start == -1 || query.i_End == -1) {
        // query.response_format = "Wrong interval given";
        return "Wrong interval given";
      } else if (query.s_Chromosome == -1) {
        // query.response_format = "No chromosome given";
        return "No chromosome given";
      } else if (query.s_Source == -1) {
        // query.response_format = "No source given";
        return "No source given";
      }
      // correct query format
      else {
        // Send query to IndexController
        // Translation from query to intervalst.query
        // needs to be unified
        /*
        short s_SourceNo=(short)0;
        if (query.source.equals("dbSNP")) {
          				s_SourceNo = (short) 0;
          			}
          			if (query.source.equals("1000GenomesProject")){
          				s_SourceNo =(short) 1;
          			}
          			*/

        Query[] q_Query = {query};
        QueryAnswer temp_answer = indexController.answerQuery(q_Query);
        answer = answerQuery(temp_answer);

        /*
          		//	byte temp = query.chromosome.get();
          		//	byte[] b={temp};
          			//CRITICAL PART. change query format into intervallst.query . answerquery throws nullpointer
          			byte[] b=new byte[0];
          			byte[] c=new byte[0];
          			int i=query.position[0];
          			int j=query.position[1];
        IntervalST.Query intervalst_query=new IntervalST.Query(1,i,j,s_SourceNo,Integer.toString(query.chromosome).getBytes(),null,null);
        IntervalST.Query[] queries={intervalst_query};
        IntervalST.Answer x_Result=indexController.answerQuery(queries);
                    System.out.println("Length of AnswerList: "+x_Result.x_List.size());
                    if (query.hasDetail) {
                    	String sequence = Chromosome_reader.retrieve_sequence(i,j,Integer.toString(query.chromosome));
                    }
                    return query;
                    */
      }
    }
    // gene name search
    else {
      // test for prefix query
      if (query.b_isPrefix) {
        /*
        // This needs to be replaced!
        String[] genenames = GeneTranslator.completeGeneName(query.search);
        */
        String[] genenames = {"FOXP2", "FOXP4"};
        JSONObject obj = new JSONObject();
        obj.put("source", query.s_Source);
        obj.put("chromosome", query.s_Chromosome);
        JSONArray names = new JSONArray();
        for (int i = 0; i < genenames.length; i++) {
          names.add(genenames[i]);
        }
        obj.put("prefix", names);
        StringWriter out = new StringWriter();
        try {
          obj.writeJSONString(out);
        } catch (IOException e) {
          e.printStackTrace();
        }
        answer = out.toString();

      } else {
        if (query.x_Search == "getInitialSources") {
          System.out.println("getInitialSources");
          return null;
        } else {
          String[] interval = GeneTranslator.translateToIntervall(query.x_Search);
          JSONObject pos_obj = new JSONObject();
          JSONObject obj = new JSONObject();
          pos_obj.put("from", Integer.valueOf(interval[0]));
          pos_obj.put("to", Integer.valueOf(interval[1]));
          obj.put("search", query.x_Search);
          obj.put("position", pos_obj);

          StringWriter out = new StringWriter();
          try {
            obj.writeJSONString(out);
          } catch (IOException e) {
            e.printStackTrace();
          }
          answer = out.toString();
        }
      }
    }
    // queryID_pool.add(query.queryID);
    return answer;
  }