-
-
Notifications
You must be signed in to change notification settings - Fork 470
Item metadata REST endpoints: don't allow adding or removing semantics #5390
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 8 commits
da78b82
abab090
2648c75
8b392f7
fcb7522
0178239
355e1d3
6f1ea7c
97da6e1
1301f56
5e3a4a0
5b25110
6c4d37d
9ba5b7f
f962ed2
10267ae
de19943
39e195a
81b14fd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -750,7 +750,8 @@ public Response removeTag(@PathParam("itemName") @Parameter(description = "item | |
| @ApiResponse(responseCode = "200", description = "OK"), // | ||
| @ApiResponse(responseCode = "201", description = "Created"), // | ||
| @ApiResponse(responseCode = "404", description = "Item not found."), // | ||
| @ApiResponse(responseCode = "405", description = "Metadata not editable.") }) | ||
| @ApiResponse(responseCode = "405", description = "Metadata not editable."), | ||
| @ApiResponse(responseCode = "503", description = "Managed provider not available.") }) | ||
| public Response addMetadata(@PathParam("itemName") @Parameter(description = "item name") String itemName, | ||
| @PathParam("namespace") @Parameter(description = "namespace") String namespace, | ||
| @Parameter(description = "metadata", required = true) MetadataDTO metadata) { | ||
|
|
@@ -765,14 +766,22 @@ public Response addMetadata(@PathParam("itemName") @Parameter(description = "ite | |
| value = ""; | ||
| } | ||
|
|
||
| MetadataKey key = new MetadataKey(namespace, itemName); | ||
| Metadata md = new Metadata(key, value, metadata.config); | ||
| if (metadataRegistry.get(key) == null) { | ||
| metadataRegistry.add(md); | ||
| return Response.status(Status.CREATED).type(MediaType.TEXT_PLAIN).build(); | ||
| } else { | ||
| metadataRegistry.update(md); | ||
| return Response.ok(null, MediaType.TEXT_PLAIN).build(); | ||
| try { | ||
| MetadataKey key = new MetadataKey(namespace, itemName); | ||
| Metadata md = new Metadata(key, value, metadata.config); | ||
| if (metadataRegistry.get(key) == null) { | ||
| metadataRegistry.add(md); | ||
| return Response.status(Status.CREATED).type(MediaType.TEXT_PLAIN).build(); | ||
| } else { | ||
| metadataRegistry.update(md); | ||
| return Response.ok(null, MediaType.TEXT_PLAIN).build(); | ||
|
mherwege marked this conversation as resolved.
Outdated
|
||
| } | ||
| } catch (UnsupportedOperationException e) { | ||
| // Trying to add to a reserved namespace that is in an unmanaged provider | ||
| return JSONResponse.createErrorResponse(Status.METHOD_NOT_ALLOWED, e.getMessage()); | ||
| } catch (IllegalStateException e) { | ||
| // There is no managed provider available | ||
| return Response.status(Status.SERVICE_UNAVAILABLE).build(); | ||
| } | ||
|
Comment on lines
+768
to
785
|
||
| } | ||
|
|
||
|
|
@@ -782,8 +791,9 @@ public Response addMetadata(@PathParam("itemName") @Parameter(description = "ite | |
| @Operation(operationId = "removeMetadataFromItem", summary = "Removes metadata from an item.", security = { | ||
| @SecurityRequirement(name = "oauth2", scopes = { "admin" }) }, responses = { | ||
| @ApiResponse(responseCode = "200", description = "OK"), | ||
| @ApiResponse(responseCode = "404", description = "Item not found."), | ||
| @ApiResponse(responseCode = "405", description = "Meta data not editable.") }) | ||
| @ApiResponse(responseCode = "404", description = "Item or namespace not found."), | ||
| @ApiResponse(responseCode = "405", description = "Metadata not editable."), | ||
| @ApiResponse(responseCode = "503", description = "Managed provider not available.") }) | ||
| public Response removeMetadata(@PathParam("itemName") @Parameter(description = "item name") String itemName, | ||
| @Nullable @PathParam("namespace") @Parameter(description = "namespace") String namespace) { | ||
| Item item = getItem(itemName); | ||
|
|
@@ -795,13 +805,22 @@ public Response removeMetadata(@PathParam("itemName") @Parameter(description = " | |
| if (namespace == null) { | ||
| metadataRegistry.removeItemMetadata(itemName); | ||
| } else { | ||
| MetadataKey key = new MetadataKey(namespace, itemName); | ||
| if (metadataRegistry.get(key) != null) { | ||
| if (metadataRegistry.remove(key) == null) { | ||
| return Response.status(Status.CONFLICT).build(); | ||
| try { | ||
| MetadataKey key = new MetadataKey(namespace, itemName); | ||
| if (metadataRegistry.get(key) != null) { | ||
| if (metadataRegistry.remove(key) == null) { | ||
| // Exists, but not managed | ||
| return Response.status(Status.METHOD_NOT_ALLOWED).build(); | ||
| } | ||
| } else { | ||
| return Response.status(Status.NOT_FOUND).build(); | ||
| } | ||
| } else { | ||
| return Response.status(Status.NOT_FOUND).build(); | ||
| } catch (UnsupportedOperationException e) { | ||
| // Trying to remove from a reserved namespace that is in an unmanaged provider | ||
| return JSONResponse.createErrorResponse(Status.METHOD_NOT_ALLOWED, e.getMessage()); | ||
| } catch (IllegalStateException e) { | ||
| // There is no managed provider available | ||
| return Response.status(Status.SERVICE_UNAVAILABLE).build(); | ||
| } | ||
| } | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,10 +13,15 @@ | |
| package org.openhab.core.internal.items; | ||
|
|
||
| import java.util.Collection; | ||
| import java.util.Map; | ||
| import java.util.concurrent.ConcurrentHashMap; | ||
| import java.util.stream.Collectors; | ||
|
|
||
| import org.eclipse.jdt.annotation.NonNullByDefault; | ||
| import org.eclipse.jdt.annotation.Nullable; | ||
| import org.openhab.core.common.registry.AbstractRegistry; | ||
| import org.openhab.core.common.registry.ManagedProvider; | ||
| import org.openhab.core.common.registry.Provider; | ||
| import org.openhab.core.events.EventPublisher; | ||
| import org.openhab.core.items.ManagedMetadataProvider; | ||
| import org.openhab.core.items.Metadata; | ||
|
|
@@ -37,12 +42,15 @@ | |
| * keeps track of all declared metadata of all metadata providers. | ||
| * | ||
| * @author Kai Kreuzer - Initial contribution | ||
| * @author Mark Herwege - semantics namespace not in managed provider | ||
| */ | ||
| @Component(immediate = true, service = MetadataRegistry.class) | ||
| @NonNullByDefault | ||
| public class MetadataRegistryImpl extends AbstractRegistry<Metadata, MetadataKey, MetadataProvider> | ||
| implements MetadataRegistry { | ||
|
|
||
| private Map<String, MetadataProvider> reservedNamespaces = new ConcurrentHashMap<>(); | ||
|
mherwege marked this conversation as resolved.
Outdated
|
||
|
|
||
| @Activate | ||
| public MetadataRegistryImpl(final @Reference ReadyService readyService) { | ||
| super(MetadataProvider.class); | ||
|
|
@@ -114,4 +122,52 @@ public void removeItemMetadata(String itemName) { | |
| getManagedProvider() | ||
| .ifPresent(managedProvider -> ((ManagedMetadataProvider) managedProvider).removeItemMetadata(itemName)); | ||
| } | ||
|
|
||
| @Override | ||
| public Metadata add(Metadata element) { | ||
| String namespace = element.getUID().getNamespace(); | ||
| MetadataProvider provider = reservedNamespaces.get(namespace); | ||
| if (provider == null || provider instanceof ManagedProvider) { | ||
| return super.add(element); | ||
|
mherwege marked this conversation as resolved.
|
||
| } | ||
| throw new UnsupportedOperationException("Cannot add metadata to '" + namespace + "' namespace"); | ||
| } | ||
|
Comment on lines
+131
to
+139
|
||
|
|
||
| @Override | ||
| public @Nullable Metadata update(Metadata element) { | ||
| String namespace = element.getUID().getNamespace(); | ||
| MetadataProvider provider = reservedNamespaces.get(namespace); | ||
| if (provider == null || provider instanceof ManagedProvider) { | ||
| return super.update(element); | ||
| } | ||
| throw new UnsupportedOperationException("Cannot update metadata in '" + namespace + "' namespace"); | ||
| } | ||
|
|
||
| @Override | ||
| public @Nullable Metadata remove(MetadataKey key) { | ||
| String namespace = key.getNamespace(); | ||
| MetadataProvider provider = reservedNamespaces.get(namespace); | ||
| if (provider == null || provider instanceof ManagedProvider) { | ||
| return super.remove(key); | ||
| } | ||
| throw new UnsupportedOperationException("Cannot remove metadata from '" + namespace + "' namespace"); | ||
| } | ||
|
|
||
| @Override | ||
| protected void addProvider(Provider<Metadata> provider) { | ||
| if (provider instanceof MetadataProvider metadataProvider) { | ||
| metadataProvider.getReservedNamespaces().stream() | ||
| .forEach(namespace -> reservedNamespaces.put(namespace, metadataProvider)); | ||
| } | ||
|
mherwege marked this conversation as resolved.
|
||
| super.addProvider(provider); | ||
| } | ||
|
|
||
| @Override | ||
| protected void removeProvider(Provider<Metadata> provider) { | ||
| if (provider instanceof MetadataProvider metadataProvider) { | ||
| metadataProvider.getReservedNamespaces().stream() | ||
| .forEach(namespace -> reservedNamespaces.remove(namespace, metadataProvider)); | ||
| } | ||
|
mherwege marked this conversation as resolved.
mherwege marked this conversation as resolved.
|
||
| super.removeProvider(provider); | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.