public static String getFormattedDateTime(
      String sDay,
      String sMonth,
      String sYear,
      String sHour,
      String sMin,
      String sSec,
      String sMillisec,
      String sDateTimeFormatType)
      throws Exception {
    String sFormattedDT = "";
    try {
      String sTmpFormattedDT = "";

      if (sDateTimeFormatType.equals("DTF_DEC")) {
        sTmpFormattedDT += sYear + "-";
        sTmpFormattedDT += sMonth + "-";
        sTmpFormattedDT += sDay + "T";
        sTmpFormattedDT += sHour + ":";
        sTmpFormattedDT += sMin + ":";
        sTmpFormattedDT += sSec + ".";
        sTmpFormattedDT += sMillisec;
      }

      sFormattedDT = sTmpFormattedDT;
    } catch (Exception e) {
      mLogger.error(
          "Component CM perform operation getCurrentDateTime. It has not been executed correctly. Exception: "
              + e.getMessage()
              + ".");
    }

    return sFormattedDT;
  }
  public boolean removeThing(List<String> sThingList) {
    boolean bCorrect = true;
    String sNameThread;
    try {
      mLogger.debug(
          "Component CM perform operation removeThing. Items: " + sThingList.size() + ".");
      for (int i = 0; i < sThingList.size(); i++) {
        String sThingName = sThingList.get(i);
        String sInstanceID = "sensor_" + sThingName + "_" + sThingName;
        String sThingServiceName = cmservice.getThingServiceName(sInstanceID);
        try {
          qosservice.unreachable(sThingServiceName);
        } catch (Exception e) {
          mLogger.error(
              "Component CM perform operation removeThing. It has not been executed correctly the call to qosservice.unreachable("
                  + sThingServiceName
                  + "). The following exception has been returned: "
                  + e.getMessage()
                  + ".");
        }

        List<String> sThingServiceList = new ArrayList<String>();
        sThingServiceList.add(sThingServiceName);
        //      TODO - Javi aún no lo ha hecho
        //      try { rmservice.unreachable(sThingServiceList);}
        //      catch (Exception e) { mLogger.error("Component CM perform operation removeThing. It
        // has not been executed correctly the call to TaaSRM.deleteThingServices. Exception: " +
        // e.getMessage() + ".");}

        java.util.Date date = new java.util.Date();
        sNameThread = "threadRemove_" + sThingName + "_" + new Timestamp(date.getTime());

        mLogger.debug(
            "Component CM perform operation removeThing, starting " + sNameThread + " thread");
        new ReminderReachableRemove(2, sThingName, cmservice); // TODO!!!! 5m
      }
    } catch (Exception e) {
      mLogger.error(
          "Component CM perform operation removeThing. It has not been executed correctly the call to QoSservice.thingRemoved or TaaSRM.deleteThingServices. Exception: "
              + e.getMessage()
              + ".");
    }
    return bCorrect;
  }
  public boolean removeThingUnreachable(String sThingName) {
    boolean bCorrect = true;
    try {
      mLogger.debug(
          "Component CM perform operation removeThingUnreachable. Item: " + sThingName + ".");
      String sThingServiceName = cmservice.sparqlRemoveDevice(sThingName);

      try {
        qosservice.thingRemoved(sThingServiceName);
      } catch (Exception e) {
        mLogger.error(
            "Component CM perform operation removeThing. It has not been executed correctly the call to qosservice.thingRemoved("
                + sInstanceID
                + "). Exception: "
                + e.getMessage()
                + ".");
      }

      List<String> sThingServiceList = new ArrayList<String>();
      sThingServiceList.add(sThingServiceName);

      try {
        rmservice.deleteThingServices(sThingServiceList);
      } catch (Exception e) {
        mLogger.error(
            "Component CM perform operation removeThing. It has not been executed correctly the call to TaaSRM.deleteThingServices("
                + sThingServiceList.get(0)
                + "). Exception: "
                + e.getMessage()
                + ".");
      }

    } catch (Exception e) {
      mLogger.error(
          "Component CM perform operation removeThing. It has not been executed correctly the call to QoSservice.thingRemoved or TaaSRM.deleteThingServices. Exception: "
              + e.getMessage()
              + ".");
      oConfigOSGi.sendData(
          "The Thing Service " + sThingName + " has been removed unsucessfully!.",
          "error",
          "AdaptationCM");
    }
    oConfigOSGi.sendData(
        "The Thing Service " + sThingName + " has been removed sucessfully!.",
        "info",
        "AdaptationCM");
    return bCorrect;
  }
  private static String getCurrentDateTime(String sDateTimeLocation, String sDateTimeFormatType)
      throws Exception {
    String sCurrentDateTime = "";

    try {
      Calendar cCalendar = null;
      if (sDateTimeLocation.equals("DTL_LOCAL")) {
        cCalendar = Calendar.getInstance();
      } else if (sDateTimeLocation.equals("DTL_GMT")) {
        cCalendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
      }

      String sDate = "" + cCalendar.get(Calendar.DATE);
      if (sDate.length() == 1) {
        sDate = "0" + sDate;
      }

      String sMonth = "" + (cCalendar.get(Calendar.MONTH) + 1);
      if (sMonth.length() == 1) {
        sMonth = "0" + sMonth;
      }

      String sYear = (new Integer(cCalendar.get(Calendar.YEAR))).toString();

      String sHourOfDay = "" + (cCalendar.get(Calendar.HOUR_OF_DAY));
      if (sHourOfDay.length() == 1) {
        sHourOfDay = "0" + sHourOfDay;
      }

      String sMinute = "" + (cCalendar.get(Calendar.MINUTE));
      if (sMinute.length() == 1) {
        sMinute = "0" + sMinute;
      }

      String sSecond = "" + (cCalendar.get(Calendar.SECOND));
      if (sSecond.length() == 1) {
        sSecond = "0" + sSecond;
      }

      String sMillisecond = "" + (cCalendar.get(Calendar.MILLISECOND));
      if (sMillisecond.length() == 2) {
        sMillisecond = "0" + sMillisecond;
      } else if (sMillisecond.length() == 1) {
        sMillisecond = "00" + sMillisecond;
      }

      sCurrentDateTime =
          getFormattedDateTime(
              sDate,
              sMonth,
              sYear,
              sHourOfDay,
              sMinute,
              sSecond,
              sMillisecond,
              sDateTimeFormatType);
    } catch (Exception e) {
      mLogger.error(
          "[CM] Adaptation Context Manager, sparqlRemoveStatement function. Exception "
              + e.getMessage());
    }

    return sCurrentDateTime;
  }
  public String publishThing_local(ArrayList<ThingsData> oThingsDataList, String sMode)
      throws Exception {
    boolean bResults = true;
    boolean bSubscribe = false;
    JsonObject jResultType = null;
    String sNewThingServiceName = "";

    bdservice = oConfigOSGi.getBdservice();
    rmservice = oConfigOSGi.getRmservice();
    qosservice = oConfigOSGi.getQosservice();
    sGwIdLocal = oConfigOSGi.getGwId();

    Date date = new Date();
    Timestamp ts = new Timestamp(date.getTime());
    String sEnvironmentOnto = null;

    try {

      ThingsData oThingsData;
      for (int i = 0; i < oThingsDataList.size(); i++) {
        oThingsData = oThingsDataList.get(i);
        boolean bOutput = oThingsData.isOutput();
        boolean bDigital = oThingsData.isDigital();
        String sMaximumResponseTime = oThingsData.getMaximumResponseTime();
        String sMemoryStatus = oThingsData.getMemoryStatus();
        String sComputationalCost = oThingsData.getComputationalCost();
        String sBatteryLevel = oThingsData.getBatteryLevel();
        String sBatteryCost = oThingsData.getBatteryCost();
        String sMeasurement = oThingsData.getMeasurement();
        String sProtocol = oThingsData.getProtocol();
        String sDeviceID = oThingsData.getDeviceID();
        String sThingID = oThingsData.getThingId();
        sThingID = oThingsData.getThingId();
        String sType = oThingsData.getType().toLowerCase();
        String sTypeClass = sType.substring(0, 1).toUpperCase() + sType.substring(1);
        String sUnit = oThingsData.getUnit().toLowerCase();
        boolean bEnvironment = oThingsData.getEnvironment(); // PUBLIC 1 = true
        // PRIVATE 0 = false
        if (bEnvironment) sEnvironmentOnto = PUBLIC;
        else sEnvironmentOnto = PRIVATE;
        String sLatitude = oThingsData.getLatitude().replace(" ", "");
        String sLongitude = oThingsData.getLongitude().replace(" ", "");
        String sAltitude = oThingsData.getAltitude().replace(" ", "");
        String sFloor = oThingsData.getFloor();
        String sLocationKeyword = oThingsData.getLocationKeyword().replace(" ", "");
        sLocationKeyword = sLocationKeyword.toLowerCase();
        sLocationKeyword =
            sLocationKeyword.substring(0, 1).toUpperCase() + sLocationKeyword.substring(1);
        String sLocationIdentifier = oThingsData.getLocationIdentifier().replace(" ", "");
        sLocationIdentifier = sLocationIdentifier.toLowerCase();
        if (!sLocationIdentifier.isEmpty()) {
          sLocationIdentifier =
              sLocationIdentifier.substring(0, 1).toUpperCase() + sLocationIdentifier.substring(1);
        }
        mLogger.info(
            "Component CM perform operation publishThing. Data comming from TA:"
                + "          Output: "
                + oThingsData.isOutput()
                + ".          Digital: "
                + oThingsData.isDigital()
                + ".          MaximumResponseTime: "
                + oThingsData.getMaximumResponseTime()
                + ".          MemoryStatus: "
                + oThingsData.getMemoryStatus()
                + ".          ComputationalCost: "
                + oThingsData.getComputationalCost()
                + ".          BatteryLevel: "
                + oThingsData.getBatteryLevel()
                + ".          BatteryCost: "
                + oThingsData.getBatteryCost()
                + ".          Measurement: "
                + oThingsData.getMeasurement()
                + ".          Protocol: "
                + oThingsData.getProtocol()
                + ".          DeviceID: "
                + oThingsData.getDeviceID()
                + ".          ThingID: "
                + oThingsData.getThingId()
                + ".          Type: "
                + oThingsData.getType()
                + ".          Unit: "
                + oThingsData.getUnit()
                + ".          Environment: "
                + oThingsData.getEnvironment()
                + ".          Latitude: "
                + oThingsData.getLatitude()
                + ".          Longitude: "
                + oThingsData.getLongitude()
                + ".          Altitude: "
                + oThingsData.getAltitude()
                + ".          Floor: "
                + oThingsData.getFloor()
                + ".          LocationKeyword: "
                + oThingsData.getLocationKeyword()
                + ".          LocationIdentifier: "
                + oThingsData.getLocationIdentifier()
                + ".");

        String sCurrentDateTime = getCurrentDateTime("DTL_GMT", "DTF_DEC");

        checkBlankThingsData(
            bOutput,
            bDigital,
            sMaximumResponseTime,
            sMemoryStatus,
            sComputationalCost,
            sBatteryLevel,
            sBatteryCost,
            sMeasurement,
            sProtocol,
            sDeviceID,
            sThingID,
            sType,
            sUnit,
            bEnvironment,
            sLatitude,
            sLongitude,
            sAltitude,
            sFloor,
            sLocationKeyword,
            sLocationIdentifier);

        mLogger.info("Checking Thing Type families on the ontology for the type: " + sTypeClass);
        jResultType = cmservice.checkThingType(sType, oThingsData.isOutput()); // TODO

        mLogger.info(
            "Checking Location families on the ontology for the locationKeyword: "
                + sLocationKeyword);
        JsonObject jResultLocation = cmservice.checkThingLocation(sLocationKeyword); // TODO

        String sPrefixThingService;
        if (bOutput) sPrefixThingService = "get";
        else sPrefixThingService = "set";

        String sID = sThingID + "_" + sDeviceID;
        String sPointInstance = "point_" + sID;
        String sHWInstance = "hwProperties_" + sID;
        String sSensorInstance = "sensor_" + sID;
        String sObservationInstanceID = "observation_" + sID;
        sInstanceID = sObservationInstanceID;

        String sDeviceInstance = "device_" + sDeviceID;
        String sFloorInstance = "floor_" + sFloor; // "_1" vs "floor_1"
        String sRoomInstance =
            "_" + sLocationIdentifier.toLowerCase() + sLocationKeyword.toLowerCase();
        String sArea = "_" + sLocationIdentifier.toLowerCase() + sLocationKeyword.toLowerCase();

        String sThingServiceName =
            sPrefixThingService
                + sLocationIdentifier
                + sLocationKeyword
                + sTypeClass; // setMainKitchenPresence
        sNewThingServiceName =
            sThingServiceName + "_" + sDeviceID + "_" + sGwIdLocal; // setMainKitchenPresence_999_01

        if (sMode.equals(CHECK)) {
          bSubscribe = cmservice.checkSubscribeService(sNewThingServiceName);
        } else bSubscribe = true;

        if (bSubscribe) {
          if (!sMode.equals(INIT)) {
            String subject = "http://www.betaas.eu/2013/betaasOnt#" + sInstanceID;
            cmservice.sparqlRemoveStatement(subject);
          }

          if (bEnvironment) {
            if (!sLatitude.equals("")) lat = Double.parseDouble(sLatitude);

            if (!sLongitude.equals("")) lng = Double.parseDouble(sLongitude);

            if (!(sLatitude.equals("")
                || sLongitude.equals("")
                || sLatitude.equals("0.0") && sLongitude.equals("0.0")))
              sPhysicalPlace = getPhysicalPlaceOnGeonames(lat, lng);
          }

          cmservice.addResource(sTypeClass);

          sQueryUpdate =
              ""
                  + "PREFIX BETaaS: <http://www.betaas.eu/2013/betaasOnt#> "
                  + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> "
                  + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "
                  + "INSERT DATA { "
                  + "BETaaS:"
                  + sObservationInstanceID
                  + " a BETaaS:Observation; "
                  + "BETaaS:observation_result_time \""
                  + sCurrentDateTime
                  + "\"^^xsd:dateTime; "
                  + "BETaaS:measurement '"
                  + sMeasurement
                  + "'; "
                  + "BETaaS:observedProperty BETaaS:"
                  + sType
                  + "; "
                  + "BETaaS:hasUnit '"
                  + sUnit
                  + "'; ";
          if (bEnvironment) {
            // sQueryUpdate = sQueryUpdate + "BETaaS:hasPoint " + sPointInstance
            // + "/point>; "
            sQueryUpdate =
                sQueryUpdate
                    + "BETaaS:hasPoint BETaaS:"
                    + sPointInstance
                    + "; "
                    + "BETaaS:hasLocation BETaaS:"
                    + sArea
                    + "; ";
            if (!sPhysicalPlace.isEmpty())
              sQueryUpdate = sQueryUpdate + "BETaaS:nearTo " + sPhysicalPlace + "; ";
          } else {
            sQueryUpdate =
                sQueryUpdate
                    // + "BETaaS:hasLocation BETaaS:" + sFloorInstance +"; "
                    + "BETaaS:hasLocation BETaaS:"
                    + sRoomInstance
                    + "; ";
          }
          sQueryUpdate =
              sQueryUpdate
                  + "BETaaS:observedBy BETaaS:"
                  + sSensorInstance
                  + ". "
                  + "BETaaS:"
                  + sSensorInstance
                  + " a <"
                  + PREFIX_BETAAS
                  + "#"
                  + sTypeClass
                  + "Sensor>; " // OJO
                  + "BETaaS:thingID '"
                  + sThingID
                  + "'; "
                  + "BETaaS:maximum_response_time '"
                  + sMaximumResponseTime
                  + "'; "
                  + "BETaaS:digital '"
                  + bDigital
                  + "'; "
                  + "BETaaS:output '"
                  + bOutput
                  + "'; "
                  + "BETaaS:hasHwProperties BETaaS:"
                  + sHWInstance
                  + "; "
                  + "BETaaS:onPlatform BETaaS:"
                  + sDeviceInstance
                  + "; "
                  + "BETaaS:hasService BETaaS:"
                  + sNewThingServiceName
                  + ". ";
          if (bEnvironment) {
            sQueryUpdate =
                sQueryUpdate
                    + "BETaaS:"
                    + sPointInstance
                    + " a BETaaS:GeographicalPoint; "
                    + "BETaaS:latitude \'"
                    + sLatitude
                    + "'; "
                    + "BETaaS:longitude \'"
                    + sLongitude
                    + "'; "
                    + "BETaaS:altitude \'"
                    + sAltitude
                    + "'. ";
            if (!sPhysicalPlace.isEmpty()) {
              sQueryUpdate =
                  sQueryUpdate
                      + sPhysicalPlace
                      + "a BETaaS:GeographicalPlace; "
                      + "BETaaS:label "
                      + sPhysicalPlace
                      + ". ";
            }
            sQueryUpdate =
                sQueryUpdate
                    + "BETaaS:"
                    + sArea
                    + " a BETaaS:Area; "
                    + "BETaaS:location_keyword '"
                    + sLocationKeyword
                    + "'; "
                    + "BETaaS:location_identifier '"
                    + sLocationIdentifier
                    + "'. ";
          } else
            sQueryUpdate =
                sQueryUpdate
                    + "BETaaS:"
                    + sFloorInstance
                    + " a BETaaS:Floor; "
                    + "BETaaS:level '"
                    + sFloor
                    + "'; "
                    + "BETaaS:hasRoom BETaaS:"
                    + sRoomInstance
                    + ". "
                    + "BETaaS:"
                    + sRoomInstance
                    + " a BETaaS:Room; "
                    + "BETaaS:location_keyword '"
                    + sLocationKeyword
                    + "'; "
                    + "BETaaS:location_identifier '"
                    + sLocationIdentifier
                    + "'; "
                    + "BETaaS:isInFloor BETaaS:"
                    + sFloorInstance
                    + ". ";

          sQueryUpdate =
              sQueryUpdate
                  + "BETaaS:"
                  + sHWInstance
                  + " a BETaaS:HwProperties; "
                  + "BETaaS:connection_description '"
                  + sProtocol
                  + "'; "
                  + "BETaaS:memory_status '"
                  + sMemoryStatus
                  + "'; "
                  + "BETaaS:computational_cost '"
                  + sComputationalCost
                  + "'; "
                  + "BETaaS:battery_level '"
                  + sBatteryLevel
                  + "'; "
                  + "BETaaS:battery_cost '"
                  + sBatteryCost
                  + "'. "
                  + "BETaaS:"
                  + sDeviceInstance
                  + " a BETaaS:Platform; "
                  + "BETaaS:deviceID '"
                  + sDeviceID
                  + "'. ";
          if (bOutput)
            sQueryUpdate =
                sQueryUpdate + "BETaaS:" + sNewThingServiceName + " a BETaaS:SensorService. ";
          // + "BETaaS:SensorService rdfs:subClassOf* BETaaS:PhysicalService. ";
          else
            sQueryUpdate =
                sQueryUpdate + "BETaaS:" + sNewThingServiceName + " a BETaaS:ActuatorService. ";
          // +
          // "BETaaS:ActuatorService rdfs:subClassOf* BETaaS:PhysicalService. ";
          sQueryUpdate =
              sQueryUpdate
                  + "BETaaS:"
                  + sNewThingServiceName
                  + " BETaaS:environment '"
                  + sEnvironmentOnto
                  + "'. ";
          if (sMode.equals(INIT))
            sQueryUpdate =
                sQueryUpdate + "BETaaS:" + sNewThingServiceName + " BETaaS:subscription 'false'. ";
          sQueryUpdate =
              sQueryUpdate
                  + "BETaaS:"
                  + sNewThingServiceName
                  + " BETaaS:thingserviceID '"
                  + sNewThingServiceName
                  + "'. "
                  + " }";

          //          String sNameThread = "ontology update";
          //          mLogger.debug("Component CM perform operation publishThing, starting
          // "+sNameThread+" thread");
          cmservice.sparqlUpdate(sQueryUpdate);

          // Check for null values
          if (!((oThingsData.getDeviceID() == null) && (oThingsData.getThingId() == null))) {
            JsonObject thing = new JsonObject();
            thing.addProperty("timestamp", ts.toString());
            thing.addProperty("is_output", oThingsData.isOutput());
            thing.addProperty("is_digital", oThingsData.isDigital());
            thing.addProperty("maximum_response_time", oThingsData.getMaximumResponseTime());
            thing.addProperty("memory_status", oThingsData.getMemoryStatus());
            thing.addProperty("computational_cost", oThingsData.getComputationalCost());
            thing.addProperty("battery_level", oThingsData.getBatteryLevel());
            thing.addProperty("battery_cost", oThingsData.getBatteryCost());
            thing.addProperty("measurement", oThingsData.getMeasurement());
            thing.addProperty("protocol", oThingsData.getProtocol());
            thing.addProperty("deviceID", oThingsData.getDeviceID());
            thing.addProperty("thingID", oThingsData.getThingId());
            thing.addProperty("type", oThingsData.getType());
            thing.addProperty("unit", oThingsData.getUnit());
            thing.addProperty("environment", oThingsData.getEnvironment());
            thing.addProperty("latitude", oThingsData.getLatitude());
            thing.addProperty("longitude", oThingsData.getLongitude());
            thing.addProperty("altitude", oThingsData.getAltitude());
            thing.addProperty("floor", oThingsData.getFloor());
            thing.addProperty("location_keyword", oThingsData.getLocationKeyword());
            thing.addProperty("location_identifier", oThingsData.getLocationIdentifier());

            try {
              mLogger.debug(
                  "Component CM call service ITaasBigDataManager.setThingsBDM. sDeviceID: "
                      + sDeviceID
                      + ", thing: "
                      + thing.toString()
                      + ".");
              bdservice.setThingsBDM(sDeviceID, thing);
            } catch (Exception e) {
              bResults = false;
              mLogger.error(
                  "Component CM perform operation publishThingInit. Exception comming from ITaasBigDataManager.setThingsBDM: "
                      + e.getMessage()
                      + ".");
            }
          } else {
            bResults = false;
            mLogger.error(
                "Component CM perform operation publishThing. NOT call service ITaasBigDataManager.setThingsBDM FUNCTION because some parameters are null!.");
          }

          if (sMode.equals(INIT)) {
            try {
              mLogger.debug(
                  "Component CM call service TaaSRMservice.registerThingsServices. ThingID: "
                      + sThingID
                      + ", ThingService: "
                      + sNewThingServiceName
                      + ".");
              rmservice.registerThingsServices(sThingID, sNewThingServiceName);
            } catch (Exception e) {
              bResults = false;
              mLogger.error(
                  "Component CM perform operation publishThingInit. Exception comming from TaaSRMservice.registerThingsServices: "
                      + e.getMessage()
                      + ".");
            }
          } else {
            try {
              mLogger.debug(
                  "Component CM call service TaaSRMservice.notifyNewMeasurement. ThingID: "
                      + sThingID
                      + ", ThingService: "
                      + sNewThingServiceName
                      + ".");
              rmservice.notifyNewMeasurement(sNewThingServiceName, oThingsData);
            } catch (Exception e) {
              bResults = false;
              mLogger.error(
                  "Component CM perform operation publishThingInit. Exception comming from TaaSRMservice.registerThingsServices: "
                      + e.getMessage()
                      + ".");
            }
          }

        } // subscribe
        else {
          mLogger.error(
              "Component CM perform operation publishThingCheck. NO SUBSCRIPTION: "
                  + sNewThingServiceName);
        }
      } // for
    } catch (InterruptedException ie) {

    } catch (Exception e) {
      bResults = false;
      mLogger.error(
          "Component CM perform operation publishThingInit. It has not been executed correctly. Exception: "
              + e.getMessage()
              + ".");
    }
    mLogger.debug("Component CM perform operation publishThingInit. Results: " + bResults);
    if (bResults)
      oConfigOSGi.sendData(
          "The Thing Service " + sNewThingServiceName + " has been published sucessfully!.",
          "info",
          "AdaptationCM");
    else
      oConfigOSGi.sendData(
          "The Thing Service " + sNewThingServiceName + " has not been published sucessfully!.",
          "error",
          "AdaptationCM");
    return jResultType.toString();
  }