/** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    final DataTableRequestParam param = DataTablesParamUtility.getParam(request);

    String sEcho = param.sEcho;
    int iTotalRecords = 0; // total number of records (unfiltered)
    int iTotalDisplayRecords = 0; // value will be set when code filters companies by keyword
    // DBConnection dbconn = new DBConnection();
    ErateProducts erateProducts = new ErateProducts();
    HttpSession session = request.getSession();
    Connection conn = null;
    DBConn dbconn = new DBConn();
    if (conn == null) {
      conn = dbconn.open();
    }
    JSONArray data = new JSONArray(); // data that will be shown in the table
    try {
      iTotalRecords = erateProducts.getProductCount(conn);
    } catch (Exception e2) {
      // TODO Auto-generated catch block
      e2.printStackTrace();
    }
    // iTotalRecords = DataRepository.GetCompanies().size();
    // List<ProductDataDao> companies = new LinkedList<ProductDataDao>();
    List<ProductDataDao> companies = new LinkedList(Collections.nCopies(iTotalRecords, null));
    ProductDataDao dao = new ProductDataDao();
    System.out.println("company size" + DataRepository.GetCompanies().size());
    // for (int i=0;i<iTotalRecords;i++){
    // List arr ;

    boolean flag = false;
    String searchValue = param.sSearchKeyword.toLowerCase();
    //	System.out.println("testing search.."+param.sSearchKeyword.toLowerCase());
    USFEnv.getLog().writeDebug("testing search.." + param.sSearchKeyword.toLowerCase(), this, null);
    if (!searchValue.equals("")) {
      flag = true;

    } else {

    }
    String var = "NotInSearch";
    session.setAttribute("companySize", var);

    if (param.bSearchable[1] && flag) {
      try {
        dao = erateProducts.searchCRISProduct(param.sSearchKeyword.toLowerCase(), conn);

        if (dao.getProductCode() == null) {
          companies.clear();
        } else {
          session.removeAttribute("companySize");
          companies.clear();
          companies.add(dao);
          if (companies.size() > 0) {
            var = "inFilteredRecord";
            session.setAttribute("companySize", var);
          } else {
            var = "outSideFilteredRecord";
            session.setAttribute("companySize", var);
          }
          // session.setAttribute("companySize",companies.size());
        }
        //	iTotalDisplayRecords1 =companies.size();
      } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      if (dao.getProductCode() != null) {
        // boolean flag= true;
        // companies.add(dao);
      }
    }

    //	boolean flag = false;

    /*	if(	param.bSearchable[1])  {
    	try {
    		dao = dbconn.searchProduct(param.sSearchKeyword.toLowerCase());
    	} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	if(dao.getProductCode()!=null ){
    	boolean flag= true;
    	companies.add(dao);
    	}
    }*/
    //	param.sSearchKeyword.toLowerCase()
    // if(	param.bSearchable[1] &&
    //	c.getName().toLowerCase().contains(param.sSearchKeyword.toLowerCase())
    //	|| param.bSearchable[2] &&
    // c.getAddress().toLowerCase().contains(param.sSearchKeyword.toLowerCase())
    //	|| param.bSearchable[3] &&
    // c.getTown().toLowerCase().contains(param.sSearchKeyword.toLowerCase()))

    // }

    /*for(ProductDataDao c : iTotalRecords){
    	//Cannot search by column 0 (id)
    	if(	param.bSearchable[1] &&
    		c.getName().toLowerCase().contains(param.sSearchKeyword.toLowerCase())
    		||
    		param.bSearchable[2] &&
    		c.getAddress().toLowerCase().contains(param.sSearchKeyword.toLowerCase())
    		||
    		param.bSearchable[3] &&
    		c.getTown().toLowerCase().contains(param.sSearchKeyword.toLowerCase()))
    	{
    	//	companies.add(c); // Add a company that matches search criterion
    	}
    }*/

    try {
      iTotalDisplayRecords = erateProducts.getProductCount(conn);
      USFEnv.getLog().writeDebug("iTotalDisplayRecords" + iTotalDisplayRecords, this, null);
      //	System.out.println("iTotalDisplayRecords"+iTotalDisplayRecords);
    } catch (Exception e2) {
      // TODO Auto-generated catch block
      e2.printStackTrace();
    }
    // iTotalDisplayRecords = companies.size();//Number of companies that matches search criterion
    // should be returned
    USFEnv.getLog()
        .writeDebug(
            " before param.iDisplayStart"
                + param.iDisplayStart
                + "companies.size()"
                + companies.size(),
            this,
            null);

    //	System.out.println(" before
    // param.iDisplayStart"+param.iDisplayStart+"companies.size()"+companies.size());
    if (companies.size() < param.iDisplayStart + param.iDisplayLength) {

      companies = companies.subList(param.iDisplayStart, companies.size());
    } else {
      try {
        // System.out.println(" after
        // param.iDisplayStart"+param.iDisplayStart+"param.iDisplayLength"+param.iDisplayLength);
        companies =
            erateProducts.getProductInfo(
                param.iDisplayStart, param.iDisplayStart + param.iDisplayLength, conn);
        System.out.println("after");
        try {
          if (conn != null) {
            conn.close();
          }
        } catch (Exception e) {
          // TODO: handle exception
        }

      } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }
    }
    // System.out.println(" after
    // param.iDisplayStart"+param.iDisplayStart+"param.iDisplayLength"+param.iDisplayLength);

    USFEnv.getLog()
        .writeDebug(
            " after param.iDisplayStart"
                + param.iDisplayStart
                + "param.iDisplayLength"
                + param.iDisplayLength,
            this,
            null);

    session.putValue("param.iDisplayStart", param.iDisplayStart);
    session.putValue("param.length", param.iDisplayStart + param.iDisplayLength);

    try {
      JSONObject jsonResponse = new JSONObject();

      jsonResponse.put("sEcho", sEcho);
      jsonResponse.put("iTotalRecords", iTotalRecords);
      jsonResponse.put("iTotalDisplayRecords", iTotalDisplayRecords);

      for (ProductDataDao c : companies) {
        JSONArray row = new JSONArray();
        row.put(c.getSeq_id())
            .put(c.getProductCode())
            .put(c.getDescription())
            .put(c.getModifiedBy())
            .put((new SimpleDateFormat("MM/dd/yyyy")).format((java.util.Date) c.getModifiedDate()));
        data.put(row);
      }
      jsonResponse.put("aaData", data);

      response.setContentType("application/json");
      response.getWriter().print(jsonResponse.toString());
    } catch (JSONException e) {
      e.printStackTrace();
      response.setContentType("text/html");
      response.getWriter().print(e.getMessage());
    } finally {
      try {
        conn.close();
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  @SuppressWarnings("unchecked")
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    SecurityContextImpl securityContextImpl =
        (SecurityContextImpl) req.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
    String username = securityContextImpl.getAuthentication().getName();
    System.out.println("Username:"******"Credentials:" + password);
    UserDetails ud = (UserDetails) securityContextImpl.getAuthentication().getPrincipal();
    String userid = null;
    if (ud instanceof LoginUserDetailsImpl) {
      LoginUserDetailsImpl lud = (LoginUserDetailsImpl) ud;
      userid = lud.getUserid();
    }

    JQueryDataTableParamModel param = DataTablesParamUtility.getParam(req);

    String sEcho = param.sEcho;
    int iTotalRecords; // total number of records (unfiltered)
    int iTotalDisplayRecords; // value will be set when code filters companies by keyword
    JSONArray data = new JSONArray(); // data that will be shown in the table

    ArrayList<Device> list = new ArrayList<Device>();
    try {
      ArrayList<Entity> devs =
          (ArrayList<Entity>) client.get("/user/" + userid + "/devices", username, password);
      for (Entity e : devs) {
        Device dev = (Device) e;
        list.add(dev);
      }
    } catch (Exception e1) {
      e1.printStackTrace();
    }

    System.out.println("size:" + list.size());
    iTotalRecords = list.size();
    List<Device> devices = new LinkedList<Device>();
    for (Device d : list) {
      if (d.getName() == null) {
        continue;
      }
      if (d.getName().toLowerCase().contains(param.sSearch.toLowerCase())) {
        devices.add(d);
        continue;
      }

      if (d.getCode() == null) {
        continue;
      }
      if (d.getCode().toLowerCase().contains(param.sSearch.toLowerCase())) {
        devices.add(d);
        continue;
      }
      devices.add(d);
    }
    iTotalDisplayRecords =
        devices.size(); // Number of companies that matches search criterion should be returned

    final int sortColumnIndex = param.iSortColumnIndex;
    final int sortDirection = param.sSortDirection.equals("asc") ? -1 : 1;

    Collections.sort(
        devices,
        new Comparator<Device>() {
          @Override
          public int compare(Device c1, Device c2) {
            switch (sortColumnIndex) {
              case 1:
                return c1.getName().compareTo(c2.getName()) * sortDirection;
              case 3:
                return c1.getCode().compareTo(c2.getCode()) * sortDirection;
            }
            return 0;
          }
        });

    if (devices.size() < param.iDisplayStart + param.iDisplayLength)
      devices = devices.subList(param.iDisplayStart, devices.size());
    else devices = devices.subList(param.iDisplayStart, param.iDisplayStart + param.iDisplayLength);

    JSONObject jsonResponse = new JSONObject();

    jsonResponse.put("sEcho", sEcho);
    jsonResponse.put("iTotalRecords", iTotalRecords);
    jsonResponse.put("iTotalDisplayRecords", iTotalDisplayRecords);

    for (Device c : devices) {
      JSONArray row = new JSONArray();
      row.add(
          "<a href='img/demo/big.jpg' title='' class='lightbox'><img src='http://placehold.it/37x37' alt='' /></a>");
      row.add(c.getId());
      row.add(c.getName());
      row.add(c.getCode());
      row.add(
          "<ul class='table-controls'>"
              + "<li><a href='queryvariable.html?id="
              + c.getId()
              + "' class='btn tip' title='View'><i class='ico-eye-open'></i></a></li>"
              + "<li><a href='#' class='btn tip' onclick='disconnect("
              + c.getId()
              + ")' title='Disconnect'><i class=' ico-minus'></i></a></li>"
              + "<li><a href='#' class='btn tip' title='Share'><i class='ico-share'></i></a></li>"
              + "</ul>");
      data.add(row);
    }
    jsonResponse.put("aaData", data);
    System.out.println(jsonResponse.toJSONString());
    resp.setContentType("application/json");
    resp.getWriter().print(jsonResponse.toString());
  }