/**
  * 最近の作物状態を取得し,返す.このとき,DBの更新も行う.
  *
  * @param userId ユーザID
  * @return 作物状態のJSON
  */
 @GET
 @Produces({MediaType.APPLICATION_JSON})
 @Path("/getCurrentState")
 public Response getCurrentState(@QueryParam("user") String user) {
   State current = controller.getCurrentState(user);
   return Response.status(200).entity(current).build();
 }
 /**
  * stop schedule check.
  *
  * @return OK
  */
 @GET
 @Produces({MediaType.APPLICATION_JSON})
 @Path("/d")
 public Response createDummy() {
   controller.dum();
   return Response.status(200).entity(OK_STATUS).build();
 }
  // for hardware.
  @POST
  @Produces({MediaType.APPLICATION_JSON})
  @Path("/updateState")
  public Response updateState(SensorValue sensor) {
    controller.updateState(sensor);
    //		System.out.println("TEMP :"+sensor.getTemperature());
    //		System.out.println("HUMD :"+sensor.getHumidity());
    //		System.out.println("IMAGE :"+sensor.image);

    String ret;
    if (controller.needWatering) {
      ret = "{\"status\" : \"success\" , \"watering\" :\"true\" }";
      controller.needWatering = false;
    } else {
      ret = "{\"status\" : \"success\" , \"watering\" :\"false\" }";
    }
    return Response.status(200).entity(ret).build();
  }
 /**
  * アクティブな水やりスケジュールを削除する.
  *
  * @param id DBから削除するオブジェクトID
  * @return OK
  */
 @GET
 @Produces({MediaType.APPLICATION_JSON})
 @Path("/deleteSchedule")
 public Response deleteSchedule(@QueryParam("id") String id) {
   boolean isSuccess = controller.deleteActiveSchedule(id);
   if (isSuccess) {
     return Response.status(200).entity(OK_STATUS).build();
   } else {
     return Response.status(403).entity(ERR_STATUS).build();
   }
 }
 /**
  * 水やりスケジュールを作成し,DBに登録する
  *
  * @param user ユーザID
  * @param isRoutine ルーチンであるかどうか
  * @param date 時刻(1970年からの経過時間のミリ秒)
  * @return ok
  */
 @GET
 @Produces({MediaType.APPLICATION_JSON})
 @Path("/createSchedule")
 public Response createSchedule(
     @QueryParam("user") String user,
     @QueryParam("isRoutine") boolean isRoutine,
     @QueryParam("date") long date) {
   Schedule sc = new Schedule(user, date, isRoutine);
   controller.createActiveSchedule(sc);
   return Response.status(200).entity(OK_STATUS).build();
 }
 /**
  * 撮影した画像ファイルを返す
  *
  * @param 写真のid
  * @return png画像
  */
 @GET
 @Produces("image/png")
 @Path("/photo/{id}.png")
 public Response getPhoto(@PathParam("id") String id) {
   ByteArrayOutputStream baos = controller.getPhoto(id);
   if (baos == null) {
     return Response.status(403).entity("<error>photo not found</error>").build();
   }
   byte[] photoData = baos.toByteArray();
   return Response.ok(new ByteArrayInputStream(photoData)).build();
 }
 public void send(
     String functionName,
     Class[] paramTypes,
     Object[] funcArgValues,
     Object state,
     Class stateDType) {
   try {
     new Sending(new Pack(functionName, stateDType, state, funcArgValues, paramTypes)).send();
   } catch (Exception ex) {
     callingparent.setResult(null, null);
   }
 }
 /**
  * アクティブなスケジュールの配列を返す.
  *
  * @param user ユーザID
  * @return Scheduleの配列.時刻が若い順にソートしている.
  */
 @GET
 @Produces({MediaType.APPLICATION_JSON})
 @Path("/getActiveScheduleList")
 public Response getActiveScheduleList(@QueryParam("user") String user) {
   List<Schedule> list = controller.getActiveScheduleList(user);
   if (list.size() > 1) {
     Schedule[] ret = list.toArray(new Schedule[0]);
     ;
     return Response.status(200).entity(ret).build();
   } else if (list.size() == 1) {
     String ret = "{\"schedule\":[" + list.get(0).getJsonString() + "]}";
     return Response.status(200).entity(ret).build();
   } else {
     String ret = "{\"schedule\":[]}";
     return Response.status(200).entity(ret).build();
   }
 }
 /**
  * 指定日の後の日の作物状態を返す
  *
  * @param userId ユーザID
  * @param long 日付
  * @return 過去の作物状態の配列.ない場合はnull
  */
 @GET
 @Produces({MediaType.APPLICATION_JSON})
 @Path("/getPastNextState")
 public Response getPastNextState(
     @QueryParam("user") String userId, @QueryParam("date") long date) {
   State past = null;
   for (int i = 0; i < 15; i++) {
     past = controller.getPastNextState(userId, date);
     if (past != null) break;
     date = date + MILLSEC_OF_DAY;
   }
   if (past != null) {
     return Response.status(200).entity(past).build();
   } else {
     State nullState = new State("no", -1, 0, 0, "");
     return Response.status(200).entity(nullState).build();
   }
 }
  public boolean connect() {
    mysocket = new Socket();
    try {
      mysocket.connect(
          new InetSocketAddress(Inet4Address.getByAddress(serverAddress), portnum),
          NetInfo.waitTime);

      startTime = System.currentTimeMillis();
      in = mysocket.getInputStream();
      out = mysocket.getOutputStream();

      oos = new ObjectOutputStream(out);

      ois = new ObjectInputStream(in);
      return true;
    } catch (IOException ex) {
      callingparent.setResult(null, null);
      return false;
    }
  }