package org.jolokia.restrictor.policy;
import java.util.*;
import javax.management.ObjectName;
import org.jolokia.util.RequestType;
/*
* Copyright 2009-2011 Roland Huss
*
* Licensed 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.
*/
/**
* Class combining various maps for attributes, operations and name patterns. It is used
* internally by {@libk MBeanAccessChecker} to store the policy configuration.
*
* @author roland
* @since 03.09.11
*/
class MBeanPolicyConfig {
private Set<ObjectName> patterns = new HashSet<ObjectName>();
private Map<ObjectName,Set<String>> readAttributes = new HashMap<ObjectName, Set<String>>();
private Map<ObjectName,Set<String>> writeAttributes = new HashMap<ObjectName, Set<String>>();
private Map<ObjectName,Set<String>> operations = new HashMap<ObjectName, Set<String>>();
/**
* Add a object name pattern
*
* @param pObjectName pattern to add
*/
void addPattern(ObjectName pObjectName) {
patterns.add(pObjectName);
}
/**
* Add for a given MBean a set of read/write attributes and operations
*
* @param pOName MBean name (which should not be pattern)
* @param pReadAttributes read attributes
* @param pWriteAttributes write attributes
* @param pOperations operations
*/
void addValues(ObjectName pOName, Set<String> pReadAttributes, Set<String> pWriteAttributes, Set<String> pOperations) {
readAttributes.put(pOName,pReadAttributes);
writeAttributes.put(pOName,pWriteAttributes);
operations.put(pOName,pOperations);
if (pOName.isPattern()) {
addPattern(pOName);
}
}
/**
* Get the set of stored values for a given MBean and type (read/write/exec)
*
* @param pType request type for which the previously added values should be retrieved.
* @param pName MBean
* @return set of previously added value or <code>null</code> if none has been added for this MBean/type.
*/
Set<String> getValues(RequestType pType, ObjectName pName) {
if (RequestType.READ == pType) {
return readAttributes.get(pName);
} else if (RequestType.WRITE == pType) {
return writeAttributes.get(pName);
} else if (RequestType.EXEC == pType) {
return operations.get(pName);
} else {
throw new IllegalArgumentException("Invalid type " + pType);
}
}
/**
* Given a MBean name return a pattern previously added and which matches this MBean name. Note,
* that patterns might not overlap since the order in which they are tried is undefined.
*
* @param pName name to match against
* @return the pattern found or <code>null</code> if none has been found.
*/
ObjectName findMatchingMBeanPattern(ObjectName pName) {
// Check all stored patterns for a match and return the pattern if one is found
for (ObjectName pattern : patterns) {
if (pattern.apply(pName)) {
return pattern;
}
}
return null;
}
}