Repository: incubator-ranger Updated Branches: refs/heads/tag-policy 26778304f -> 673b6d551
Added RangerTaggedResourceKey class representing <cluster-name, component-type, map-of-policyresources> tuple. Signed-off-by: Madhan Neethiraj <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/673b6d55 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/673b6d55 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/673b6d55 Branch: refs/heads/tag-policy Commit: 673b6d551c564bf04b5173f3f1a2d95a17e03d5f Parents: 2677830 Author: Abhay Kulkarni <[email protected]> Authored: Fri Jun 26 14:49:13 2015 -0700 Committer: Madhan Neethiraj <[email protected]> Committed: Fri Jun 26 23:51:44 2015 -0700 ---------------------------------------------------------------------- .../contextenricher/RangerTagProvider.java | 2 +- .../plugin/model/RangerTaggedResource.java | 59 ++++--------- .../plugin/model/RangerTaggedResourceKey.java | 90 ++++++++++++++++++++ .../ranger/plugin/store/TagPredicateUtil.java | 4 +- .../apache/ranger/plugin/store/TagStore.java | 6 +- .../ranger/plugin/store/file/TagFileStore.java | 35 ++++---- .../ranger/plugin/store/TestTagStore.java | 13 ++- .../java/org/apache/ranger/rest/TagREST.java | 18 +++- .../apache/ranger/rest/TagRESTConstants.java | 2 +- 9 files changed, 152 insertions(+), 77 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagProvider.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagProvider.java b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagProvider.java index 8896e6e..9f56c83 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagProvider.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagProvider.java @@ -120,7 +120,7 @@ public class RangerTagProvider extends RangerAbstractContextEnricher implements RangerDefaultPolicyResourceMatcher matcher = new RangerDefaultPolicyResourceMatcher(); matcher.setServiceDef(this.serviceDef); - matcher.setPolicyResources(taggedResource.getResourceSpec()); + matcher.setPolicyResources(taggedResource.getKey().getResourceSpec()); if (LOG.isDebugEnabled()) { LOG.debug("RangerTagProvider.setRangerTaggedResources() - Initializing matcher with (resource=" + taggedResource http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResource.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResource.java b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResource.java index b532ca5..b6927ad 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResource.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResource.java @@ -46,50 +46,28 @@ import java.util.*; public class RangerTaggedResource extends RangerBaseModelObject { private static final long serialVersionUID = 1L; - private String componentType = null; // one of any supported by any component - private String tagServiceName = null; - private Map<String, RangerPolicy.RangerPolicyResource> resourceSpec = null; - private List<RangerResourceTag> tags = null; - - public RangerTaggedResource(String componentType, String tagServiceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec, List<RangerResourceTag> tags) { - super(); - setComponentType(componentType); - setTagServiceName(tagServiceName); - setResourceSpec(resourceSpec); + private RangerTaggedResourceKey key; + private List<RangerResourceTag> tags; + + public RangerTaggedResource(RangerTaggedResourceKey key, List<RangerResourceTag> tags) { + setKey(key); setTags(tags); } public RangerTaggedResource() { - this(null, null, null, null); - } - - public String getComponentType() { - return componentType; - } - - public String getTagServiceName() { - return tagServiceName; + this(null, null); } - public Map<String, RangerPolicy.RangerPolicyResource> getResourceSpec() { - return resourceSpec; - } + public RangerTaggedResourceKey getKey() { return key; } public List<RangerResourceTag> getTags() { return tags; } // And corresponding set methods - public void setComponentType(String componentType) { - this.componentType = componentType; - } - public void setTagServiceName(String tagServiceName) { - this.tagServiceName = tagServiceName; - } - - public void setResourceSpec(Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) { - this.resourceSpec = resourceSpec == null ? new HashMap<String, RangerPolicy.RangerPolicyResource>() : resourceSpec; + public void setKey(RangerTaggedResourceKey key) { + this.key = key == null ? new RangerTaggedResourceKey() : key; } public void setTags(List<RangerResourceTag> tags) { @@ -109,16 +87,9 @@ public class RangerTaggedResource extends RangerBaseModelObject { sb.append("{ "); - sb.append("componentType={").append(componentType).append("} "); - sb.append("tagServiceName={").append(tagServiceName).append("} "); - - sb.append("RangerTaggedResource={"); - if(resourceSpec != null) { - for(Map.Entry<String, RangerPolicy.RangerPolicyResource> e : resourceSpec.entrySet()) { - sb.append(e.getKey()).append("={"); - e.getValue().toString(sb); - sb.append("} "); - } + sb.append("key={"); + if (key != null) { + key.toString(sb); } sb.append("} "); @@ -164,12 +135,16 @@ public class RangerTaggedResource extends RangerBaseModelObject { public String getName() { return name; } + public void setName(String name) { this.name = name; } public Map<String, String> getAttributeValues() { return attributeValues; } - public void setAttributeValues(Map<String, String> attributeValues) { this.attributeValues = attributeValues; } + + public void setAttributeValues(Map<String, String> attributeValues) { + this.attributeValues = attributeValues == null ? new HashMap<String, String>() : attributeValues; + } @Override public String toString( ) { http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResourceKey.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResourceKey.java b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResourceKey.java new file mode 100644 index 0000000..649c27d --- /dev/null +++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTaggedResourceKey.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.ranger.plugin.model; + +import java.util.HashMap; +import java.util.Map; + +public class RangerTaggedResourceKey implements java.io.Serializable { + private static final long serialVersionUID = 1L; + + private String componentType = null; // one of any supported by any component + private String tagServiceName = null; + private Map<String, RangerPolicy.RangerPolicyResource> resourceSpec = null; + + public RangerTaggedResourceKey() { this(null, null, null); } + + public RangerTaggedResourceKey(String componentType, String tagServiceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) { + super(); + + setComponentType(componentType); + setTagServiceName(tagServiceName); + setResourceSpec(resourceSpec); + } + + public String getComponentType() { return componentType;} + + public String getTagServiceName() { return tagServiceName; } + + public Map<String, RangerPolicy.RangerPolicyResource> getResourceSpec() { return resourceSpec; } + + public void setComponentType(String componentType) { + this.componentType = componentType; + } + + public void setTagServiceName(String tagServiceName) { + this.tagServiceName = tagServiceName; + } + + public void setResourceSpec(Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) { + this.resourceSpec = resourceSpec == null ? new HashMap<String, RangerPolicy.RangerPolicyResource>() : resourceSpec; + } + + @Override + public String toString( ) { + StringBuilder sb = new StringBuilder(); + + toString(sb); + + return sb.toString(); + } + + public StringBuilder toString(StringBuilder sb) { + + sb.append("{ "); + + sb.append("componentType={").append(componentType).append("} "); + sb.append("tagServiceName={").append(tagServiceName).append("} "); + + sb.append("resourceSpec={"); + if(resourceSpec != null) { + for(Map.Entry<String, RangerPolicy.RangerPolicyResource> e : resourceSpec.entrySet()) { + sb.append(e.getKey()).append("={"); + e.getValue().toString(sb); + sb.append("} "); + } + } + sb.append("} "); + + sb.append(" }"); + + return sb; + } +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java index 8347f7f..dc78855 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java @@ -130,7 +130,7 @@ public class TagPredicateUtil extends AbstractPredicateUtil { if (object instanceof RangerTaggedResource) { RangerTaggedResource rangerResource = (RangerTaggedResource) object; - ret = StringUtils.equals(name, rangerResource.getTagServiceName()); + ret = StringUtils.equals(name, rangerResource.getKey().getTagServiceName()); } return ret; @@ -162,7 +162,7 @@ public class TagPredicateUtil extends AbstractPredicateUtil { if (object instanceof RangerTaggedResource) { RangerTaggedResource rangerResource = (RangerTaggedResource) object; - ret = StringUtils.equals(type, rangerResource.getComponentType()); + ret = StringUtils.equals(type, rangerResource.getKey().getComponentType()); } return ret; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java index a0b14db..384251b 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java @@ -20,6 +20,7 @@ package org.apache.ranger.plugin.store; import org.apache.ranger.plugin.model.RangerPolicy; +import org.apache.ranger.plugin.model.RangerTaggedResourceKey; import org.apache.ranger.plugin.model.RangerTaggedResource; import org.apache.ranger.plugin.model.RangerTagDef; import org.apache.ranger.plugin.util.SearchFilter; @@ -59,8 +60,6 @@ public interface TagStore { RangerTaggedResource getResource(Long id) throws Exception; - public List<RangerTaggedResource> getResources(String componentType, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) throws Exception; - List<RangerTaggedResource> getResources(String tagServiceName, String componentType) throws Exception; List<RangerTaggedResource> getResources(SearchFilter filter) throws Exception; @@ -70,4 +69,7 @@ public interface TagStore { Set<String> getTags(String tagServiceName, String serviceType) throws Exception; Set<String> lookupTags(String tagServiceName, String serviceType, String tagNamePattern) throws Exception; + + //List<RangerTaggedResource> getResources(String componentType, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) throws Exception; + List<RangerTaggedResource> getResources(RangerTaggedResourceKey key) throws Exception; } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java index d7de976..b641902 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java @@ -27,10 +27,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.Path; import org.apache.ranger.authorization.hadoop.config.RangerConfiguration; -import org.apache.ranger.plugin.model.RangerPolicy; -import org.apache.ranger.plugin.model.RangerTaggedResource; -import org.apache.ranger.plugin.model.RangerServiceDef; -import org.apache.ranger.plugin.model.RangerTagDef; +import org.apache.ranger.plugin.model.*; import org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher; import org.apache.ranger.plugin.service.ResourceLookupContext; import org.apache.ranger.plugin.store.AbstractTagStore; @@ -304,7 +301,7 @@ public class TagFileStore extends AbstractTagStore { throw new Exception(resource.getId() + ": resource already exists (id=" + existing.getId() + ")"); } - List<RangerTaggedResource> existingResources = getResources(resource.getComponentType(), resource.getResourceSpec()); + List<RangerTaggedResource> existingResources = getResources(resource.getKey()); if (CollectionUtils.isNotEmpty(existingResources)) { throw new Exception("resource(s) with same specification already exists"); @@ -349,9 +346,9 @@ public class TagFileStore extends AbstractTagStore { try { preUpdate(existing); - existing.setComponentType(resource.getComponentType()); - existing.setResourceSpec(resource.getResourceSpec()); - existing.setTagServiceName(resource.getTagServiceName()); + existing.getKey().setComponentType(resource.getKey().getComponentType()); + existing.getKey().setResourceSpec(resource.getKey().getResourceSpec()); + existing.getKey().setTagServiceName(resource.getKey().getTagServiceName()); existing.setTags(resource.getTags()); ret = fileStoreUtil.saveToFile(existing, new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG_RESOURCE, existing.getId())), true); @@ -422,9 +419,10 @@ public class TagFileStore extends AbstractTagStore { } @Override - public List<RangerTaggedResource> getResources(String componentType, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) throws Exception { + public List<RangerTaggedResource> getResources(RangerTaggedResourceKey key) throws Exception { + if (LOG.isDebugEnabled()) { - LOG.debug("==> TagFileStore.getResources( " + componentType + " )"); + LOG.debug("==> TagFileStore.getResources( " + key.getTagServiceName() + ", " + key.getComponentType() + " )"); } if (this.svcStore == null) { @@ -436,16 +434,15 @@ public class TagFileStore extends AbstractTagStore { RangerServiceDef serviceDef = null; try { - serviceDef = svcStore.getServiceDefByName(componentType); + serviceDef = svcStore.getServiceDefByName(key.getComponentType()); } catch (Exception exception) { - LOG.error("TagFileStore.getResource - failed to get serviceDef for " + componentType); - throw new Exception("Invalid component-type: " + componentType); + LOG.error("TagFileStore.getResource - failed to get serviceDef for " + key.getComponentType()); + throw new Exception("Invalid component-type: " + key.getComponentType()); } - if (MapUtils.isNotEmpty(resourceSpec)) { - - ret = getResources(null, componentType); + if (MapUtils.isNotEmpty(key.getResourceSpec())) { + ret = getResources(key.getTagServiceName(), key.getComponentType()); List<RangerTaggedResource> notMatchedResources = new ArrayList<>(); if (CollectionUtils.isNotEmpty(ret)) { @@ -454,13 +451,13 @@ public class TagFileStore extends AbstractTagStore { RangerDefaultPolicyResourceMatcher policyResourceMatcher = new RangerDefaultPolicyResourceMatcher(); - policyResourceMatcher.setPolicyResources(resource.getResourceSpec()); + policyResourceMatcher.setPolicyResources(resource.getKey().getResourceSpec()); policyResourceMatcher.setServiceDef(serviceDef); policyResourceMatcher.init(); - boolean isMatch = policyResourceMatcher.isSingleAndExactMatch(resourceSpec); + boolean isMatch = policyResourceMatcher.isSingleAndExactMatch(key.getResourceSpec()); if (! isMatch) { notMatchedResources.add(resource); @@ -475,7 +472,7 @@ public class TagFileStore extends AbstractTagStore { ret = null; } if (LOG.isDebugEnabled()) { - LOG.debug("<== TagFileStore.getResources(" + componentType + ") = " + ret); + LOG.debug("==> TagFileStore.getResources( " + key.getTagServiceName() + ", " + key.getComponentType() + " )" + ret); } return ret; } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java ---------------------------------------------------------------------- diff --git a/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java b/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java index f93bb4c..65913f7 100644 --- a/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java +++ b/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java @@ -90,7 +90,6 @@ public class TestTagStore { tagStore.setServiceStore(new ServiceRESTStore()); tagStore.init(); */ - } //@AfterClass @@ -138,8 +137,8 @@ public class TestTagStore { int initResourceCount = taggedResources == null ? 0 : taggedResources.size(); RangerTaggedResource rr = new RangerTaggedResource(); - rr.setComponentType("hive"); - rr.setTagServiceName("tagdev"); + rr.getKey().setComponentType("hive"); + rr.getKey().setTagServiceName("tagdev"); Map<String, RangerPolicyResource> resourceSpec = new HashMap<>(); @@ -155,7 +154,7 @@ public class TestTagStore { policyResource.setValues(Arrays.asList("column1", "ssn", "vendor")); resourceSpec.put("column", policyResource); - rr.setResourceSpec(resourceSpec); + rr.getKey().setResourceSpec(resourceSpec); List<RangerTaggedResource.RangerResourceTag> tags = new ArrayList<>(); @@ -171,11 +170,11 @@ public class TestTagStore { taggedResources = tagStore.getResources(filter); assertEquals("createResource() failed", initResourceCount + 1, taggedResources == null ? 0 : taggedResources.size()); - taggedResources = tagStore.getResources("hive", resourceSpec); + taggedResources = tagStore.getResources(rr.getKey()); assertEquals("createResource() failed", initResourceCount + 1, taggedResources == null ? 0 : taggedResources.size()); - resourceSpec.remove("column"); - taggedResources = tagStore.getResources("hive", resourceSpec); + rr.getKey().getResourceSpec().remove("column"); + taggedResources = tagStore.getResources(rr.getKey()); assertEquals("createResource() failed", initResourceCount, taggedResources == null ? 0 : taggedResources.size()); */ } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java b/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java index e702961..7514d14 100644 --- a/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java +++ b/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java @@ -25,6 +25,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.ranger.biz.ServiceDBStore; import org.apache.ranger.common.RESTErrorUtil; import org.apache.ranger.plugin.model.RangerPolicy; +import org.apache.ranger.plugin.model.RangerTaggedResourceKey; import org.apache.ranger.plugin.model.RangerTaggedResource; import org.apache.ranger.plugin.model.RangerTagDef; import org.apache.ranger.plugin.store.file.TagFileStore; @@ -386,6 +387,8 @@ public class TagREST { return ret; } + // This API is typically used by plug-in to get all tagged resources from RangerAdmin + @GET @Path(TagRESTConstants.RESOURCES_RESOURCE) @Produces({ "application/json", "application/xml" }) @@ -424,6 +427,10 @@ public class TagREST { return ret; } + + // This API is typically used by GUI to get all available tags from RangerAdmin Can be used to validate configuration + // parameters of a tag-service + @GET @Path(TagRESTConstants.TAGNAMES_RESOURCE) @Produces({ "application/json", "application/xml" }) @@ -449,6 +456,9 @@ public class TagREST { return tagNames; } + // This API is typically used by GUI to help lookup available tags from RangerAdmin to help tag-policy writer. It + // may also be used to validate configuration parameters of a tag-service + @GET @Path(TagRESTConstants.LOOKUP_TAGS_RESOURCE) @Produces({ "application/json", "application/xml" }) @@ -474,10 +484,12 @@ public class TagREST { return matchingTagNames; } + // The following APIs will be typically used by tag-sync module + @GET - @Path(TagRESTConstants.RESOURCES_BY_SPEC_RESOURCE) + @Path(TagRESTConstants.RESOURCES_ALL_RESOURCE) @Produces({ "application/json", "application/xml" }) - public List<RangerTaggedResource> getResourcesBySpec(@QueryParam(TagRESTConstants.COMPONENT_TYPE_PARAM) String componentType) throws Exception { + public List<RangerTaggedResource> getAllTaggedResources() throws Exception { return null; } @@ -491,7 +503,7 @@ public class TagREST { @PUT @Path(TagRESTConstants.RESOURCES_SET_RESOURCE) @Produces({ "application/json", "application/xml" }) - public Map<String, RangerPolicy.RangerPolicyResource> setResources(List<RangerTaggedResource> resources, String componentType) { + public Map<String, RangerTaggedResource> setResources(List<RangerTaggedResource> resources, String componentType) { return null; } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/673b6d55/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java b/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java index 5dcc133..a7c8c60 100644 --- a/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java +++ b/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java @@ -25,10 +25,10 @@ public class TagRESTConstants { static final String TAGNAMES_RESOURCE = "tag-names"; static final String TAG_RESOURCE = "tag"; static final String RESOURCES_RESOURCE = "resources"; - static final String RESOURCES_BY_SPEC_RESOURCE = "resources-by-spec"; static final String RESOURCE_SET_RESOURCE = "set-resource"; static final String RESOURCES_SET_RESOURCE = "set-resources"; static final String RESOURCE_UPDATE_RESOURCE = "update-resource"; + static final String RESOURCES_ALL_RESOURCE = "all-resources"; static final String LOOKUP_TAGS_RESOURCE = "lookup-tags"; static final String RESOURCES_IF_UPDATED_RESOURCE = "resources";
