/* * 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.policyengine; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.ObjectUtils; import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef; public class RangerAccessResourceImpl implements RangerMutableResource { private String ownerUser; private Map<String, String> elements; private String stringifiedValue; private String stringifiedCacheKeyValue; private String leafName; private RangerServiceDef serviceDef; public RangerAccessResourceImpl() { this(null, null); } public RangerAccessResourceImpl(Map<String, String> elements) { this(elements, null); } public RangerAccessResourceImpl(Map<String, String> elements, String ownerUser) { this.elements = elements; this.ownerUser = ownerUser; } @Override public String getOwnerUser() { return ownerUser; } @Override public boolean exists(String name) { return elements != null && elements.containsKey(name); } @Override public String getValue(String name) { String ret = null; if(elements != null && elements.containsKey(name)) { ret = elements.get(name); } return ret; } @Override public Set<String> getKeys() { Set<String> ret = null; if(elements != null) { ret = elements.keySet(); } return ret; } @Override public void setOwnerUser(String ownerUser) { this.ownerUser = ownerUser; } @Override public void setValue(String name, String value) { if(value == null) { if(elements != null) { elements.remove(name); if(elements.isEmpty()) { elements = null; } } } else { if(elements == null) { elements = new HashMap<>(); } elements.put(name, value); } // reset, so that these will be computed again with updated elements stringifiedValue = stringifiedCacheKeyValue = leafName = null; } @Override public void setServiceDef(final RangerServiceDef serviceDef) { this.serviceDef = serviceDef; this.stringifiedValue = this.stringifiedCacheKeyValue = this.leafName = null; } @Override public RangerServiceDef getServiceDef() { return this.serviceDef; } @Override public String getLeafName() { String ret = leafName; if(ret == null) { if(serviceDef != null && serviceDef.getResources() != null) { List<RangerResourceDef> resourceDefs = serviceDef.getResources(); for(int idx = resourceDefs.size() - 1; idx >= 0; idx--) { RangerResourceDef resourceDef = resourceDefs.get(idx); if(resourceDef != null && exists(resourceDef.getName())) { ret = leafName = resourceDef.getName(); break; } } } } return ret; } @Override public String getAsString() { String ret = stringifiedValue; if(ret == null) { if(serviceDef != null && serviceDef.getResources() != null) { StringBuilder sb = new StringBuilder(); for(RangerResourceDef resourceDef : serviceDef.getResources()) { if(resourceDef == null || !exists(resourceDef.getName())) { continue; } if(sb.length() > 0) { sb.append(RESOURCE_SEP); } sb.append(getValue(resourceDef.getName())); } if(sb.length() > 0) { ret = stringifiedValue = sb.toString(); } } } return ret; } @Override public String getCacheKey() { String ret = stringifiedCacheKeyValue; if(ret == null) { if(serviceDef != null && serviceDef.getResources() != null) { StringBuilder sb = new StringBuilder(); for(RangerResourceDef resourceDef : serviceDef.getResources()) { if(resourceDef == null || !exists(resourceDef.getName())) { continue; } if(sb.length() > 0) { sb.append(RESOURCE_SEP); } sb.append(resourceDef.getName()).append(RESOURCE_NAME_VAL_SEP).append(getValue(resourceDef.getName())); } if(sb.length() > 0) { ret = stringifiedCacheKeyValue = sb.toString(); } } } return ret; } @Override public Map<String, String> getAsMap() { return elements == null ? Collections.EMPTY_MAP : Collections.unmodifiableMap(elements); } @Override public RangerAccessResource getReadOnlyCopy() { return new RangerAccessResourceReadOnly(this); } @Override public boolean equals(Object obj) { if(obj == null || !(obj instanceof RangerAccessResourceImpl)) { return false; } if(this == obj) { return true; } RangerAccessResourceImpl other = (RangerAccessResourceImpl) obj; return ObjectUtils.equals(ownerUser, other.ownerUser) && ObjectUtils.equals(elements, other.elements); } @Override public int hashCode() { int ret = 7; ret = 31 * ret + ObjectUtils.hashCode(ownerUser); ret = 31 * ret + ObjectUtils.hashCode(elements); return ret; } @Override public String toString( ) { StringBuilder sb = new StringBuilder(); toString(sb); return sb.toString(); } public StringBuilder toString(StringBuilder sb) { sb.append("RangerResourceImpl={"); sb.append("ownerUser={").append(ownerUser).append("} "); sb.append("elements={"); if(elements != null) { for(Map.Entry<String, String> e : elements.entrySet()) { sb.append(e.getKey()).append("=").append(e.getValue()).append("; "); } } sb.append("} "); sb.append("}"); return sb; } }