use of org.eclipse.smarthome.core.thing.Thing in project smarthome by eclipse.
the class FirmwareUpdateService method cancelFirmwareUpdate.
/**
* Cancels the firmware update of the thing having the given thing UID by invoking the operation
* {@link FirmwareUpdateHandler#cancel()} of the thingĀ“s firmware update handler.
*
* @param thingUID the thing UID (must not be null)
*/
public void cancelFirmwareUpdate(final ThingUID thingUID) {
Objects.requireNonNull(thingUID, "Thing UID must not be null.");
final FirmwareUpdateHandler firmwareUpdateHandler = getFirmwareUpdateHandler(thingUID);
if (firmwareUpdateHandler == null) {
throw new IllegalArgumentException(String.format("There is no firmware update handler for thing with UID %s.", thingUID));
}
final ProgressCallbackImpl progressCallback = getProgressCallback(thingUID);
logger.debug("Cancelling firmware update for thing with UID {}.", thingUID);
safeCaller.create(firmwareUpdateHandler, FirmwareUpdateHandler.class).withTimeout(timeout).withAsync().onTimeout(() -> {
logger.error("Timeout occurred while cancelling firmware update of thing with UID {}.", thingUID);
progressCallback.failedInternal("timeout-error-during-cancel");
}).onException(e -> {
logger.error("Unexpected exception occurred while cancelling firmware update of thing with UID {}.", thingUID, e.getCause());
progressCallback.failedInternal("unexpected-handler-error-during-cancel");
}).withIdentifier(new Object()).build().cancel();
}
use of org.eclipse.smarthome.core.thing.Thing in project smarthome by eclipse.
the class InboxResource method approve.
@POST
@Path("/{thingUID}/approve")
@Consumes(MediaType.TEXT_PLAIN)
@ApiOperation(value = "Approves the discovery result by adding the thing to the registry.")
@ApiResponses(value = { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 404, message = "Thing not found in the inbox."), @ApiResponse(code = 409, message = "No binding found that supports this thing.") })
public Response approve(@HeaderParam(HttpHeaders.ACCEPT_LANGUAGE) @ApiParam(value = "language") String language, @PathParam("thingUID") @ApiParam(value = "thingUID", required = true) String thingUID, @ApiParam(value = "thing label") String label) {
ThingUID thingUIDObject = new ThingUID(thingUID);
String notEmptyLabel = label != null && !label.isEmpty() ? label : null;
Thing thing = null;
try {
thing = inbox.approve(thingUIDObject, notEmptyLabel);
} catch (IllegalArgumentException e) {
return JSONResponse.createErrorResponse(Status.NOT_FOUND, "Thing not found in inbox");
}
// inbox.approve returns null if no handler is found that supports this thing
if (thing == null) {
return JSONResponse.createErrorResponse(Status.CONFLICT, "No binding found that can create the thing");
}
return Response.ok(null, MediaType.TEXT_PLAIN).build();
}
use of org.eclipse.smarthome.core.thing.Thing in project smarthome by eclipse.
the class ThingResource method getByUID.
@GET
@RolesAllowed({ Role.ADMIN })
@Path("/{thingUID}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Gets thing by UID.")
@ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = ThingDTO.class), @ApiResponse(code = 404, message = "Thing not found.") })
public Response getByUID(@HeaderParam(HttpHeaders.ACCEPT_LANGUAGE) @ApiParam(value = "language") String language, @PathParam("thingUID") @ApiParam(value = "thingUID") String thingUID) {
final Locale locale = LocaleUtil.getLocale(language);
Thing thing = thingRegistry.get((new ThingUID(thingUID)));
// return Thing data if it does exist
if (thing != null) {
return getThingResponse(Status.OK, thing, locale, null);
} else {
return getThingNotFoundResponse(thingUID);
}
}
use of org.eclipse.smarthome.core.thing.Thing in project smarthome by eclipse.
the class ThingResource method update.
/**
* Update Thing.
*
* @param thingUID
* @param thingBean
* @return Response with the updated Thing or error information
* @throws IOException
*/
@PUT
@RolesAllowed({ Role.ADMIN })
@Path("/{thingUID}")
@Consumes(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Updates a thing.")
@ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = ThingDTO.class), @ApiResponse(code = 404, message = "Thing not found."), @ApiResponse(code = 409, message = "Thing could not be updated as it is not editable.") })
public Response update(@HeaderParam(HttpHeaders.ACCEPT_LANGUAGE) @ApiParam(value = "language") String language, @PathParam("thingUID") @ApiParam(value = "thingUID") String thingUID, @ApiParam(value = "thing", required = true) ThingDTO thingBean) throws IOException {
final Locale locale = LocaleUtil.getLocale(language);
ThingUID thingUIDObject = new ThingUID(thingUID);
// ask whether the Thing exists at all, 404 otherwise
Thing thing = thingRegistry.get(thingUIDObject);
if (null == thing) {
logger.info("Received HTTP PUT request for update at '{}' for the unknown thing '{}'.", uriInfo.getPath(), thingUID);
return getThingNotFoundResponse(thingUID);
}
// ask whether the Thing exists as a managed thing, so it can get
// updated, 409 otherwise
Thing managed = managedThingProvider.get(thingUIDObject);
if (null == managed) {
logger.info("Received HTTP PUT request for update at '{}' for an unmanaged thing '{}'.", uriInfo.getPath(), thingUID);
return getThingResponse(Status.CONFLICT, thing, locale, "Cannot update Thing " + thingUID + " as it is not editable.");
}
// check configuration
thingBean.configuration = normalizeConfiguration(thingBean.configuration, thing.getThingTypeUID(), thing.getUID());
normalizeChannels(thingBean, thing.getUID());
thing = ThingHelper.merge(thing, thingBean);
// update, returns null in case Thing cannot be found
Thing oldthing = managedThingProvider.update(thing);
if (null == oldthing) {
return getThingNotFoundResponse(thingUID);
}
// everything went well
return getThingResponse(Status.OK, thing, locale, null);
}
use of org.eclipse.smarthome.core.thing.Thing in project smarthome by eclipse.
the class ThingResource method remove.
/**
* Delete a Thing, if possible. Thing deletion might be impossible if the
* Thing is not managed, will return CONFLICT. Thing deletion might happen
* delayed, will return ACCEPTED.
*
* @param thingUID
* @param force
* @return Response with status/error information
*/
@DELETE
@RolesAllowed({ Role.ADMIN })
@Path("/{thingUID}")
@ApiOperation(value = "Removes a thing from the registry. Set \'force\' to __true__ if you want the thing te be removed immediately.")
@ApiResponses(value = { @ApiResponse(code = 200, message = "OK, was deleted."), @ApiResponse(code = 202, message = "ACCEPTED for asynchronous deletion."), @ApiResponse(code = 404, message = "Thing not found."), @ApiResponse(code = 409, message = "Thing could not be deleted because it's not editable.") })
public Response remove(@HeaderParam(HttpHeaders.ACCEPT_LANGUAGE) @ApiParam(value = "language") String language, @PathParam("thingUID") @ApiParam(value = "thingUID") String thingUID, @DefaultValue("false") @QueryParam("force") @ApiParam(value = "force") boolean force) {
final Locale locale = LocaleUtil.getLocale(language);
ThingUID thingUIDObject = new ThingUID(thingUID);
// check whether thing exists and throw 404 if not
Thing thing = thingRegistry.get(thingUIDObject);
if (thing == null) {
logger.info("Received HTTP DELETE request for update at '{}' for the unknown thing '{}'.", uriInfo.getPath(), thingUID);
return getThingNotFoundResponse(thingUID);
}
// ask whether the Thing exists as a managed thing, so it can get
// updated, 409 otherwise
Thing managed = managedThingProvider.get(thingUIDObject);
if (null == managed) {
logger.info("Received HTTP DELETE request for update at '{}' for an unmanaged thing '{}'.", uriInfo.getPath(), thingUID);
return getThingResponse(Status.CONFLICT, thing, locale, "Cannot delete Thing " + thingUID + " as it is not editable.");
}
// only move on if Thing is known to be managed, so it can get updated
if (force) {
if (null == thingRegistry.forceRemove(thingUIDObject)) {
return getThingResponse(Status.INTERNAL_SERVER_ERROR, thing, locale, "Cannot delete Thing " + thingUID + " for unknown reasons.");
}
} else {
if (null != thingRegistry.remove(thingUIDObject)) {
return getThingResponse(Status.ACCEPTED, thing, locale, null);
}
}
return Response.ok(null, MediaType.TEXT_PLAIN).build();
}
Aggregations