blob: bb015c19d473c288f6f114720dc4d25d925bd9fc [file] [log] [blame]
/*
* 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.openaz.xacml.admin.model;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.openaz.xacml.api.pap.PDP;
import org.apache.openaz.xacml.api.pap.PDPGroup;
import org.apache.openaz.xacml.api.pap.PDPPolicy;
import org.apache.openaz.xacml.std.pap.StdPDPPolicy;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.util.MethodProperty;
public class PDPPolicyContainer extends ItemSetChangeNotifier implements Container.Indexed {
private static final long serialVersionUID = 1L;
private static Log logger = LogFactory.getLog(PDPPolicyContainer.class);
/**
* String identifier of a file's "Id" property.
*/
public static String PROPERTY_ID = "Id";
/**
* String identifier of a file's "name" property.
*/
public static String PROPERTY_NAME = "Name";
/**
* String identifier of a file's "name" property.
*/
public static String PROPERTY_VERSION = "Version";
/**
* String identifier of a file's "Description" property.
*/
public static String PROPERTY_DESCRIPTION = "Description";
/**
* String identifier of a file's "IsRoot" property.
*/
public static String PROPERTY_ISROOT = "Root";
/**
* List of the string identifiers for the available properties.
*/
public static Collection<String> PDPPOLICY_PROPERTIES;
private final static Method PDPPOLICYITEM_ID;
private final static Method PDPPOLICYITEM_NAME;
private final static Method PDPPOLICYITEM_VERSION;
private final static Method PDPPOLICYITEM_DESCRIPTION;
private final static Method PDPPOLICYITEM_ISROOT;
private final static Method PDPPOLICYITEM_SETISROOT;
static {
PDPPOLICY_PROPERTIES = new ArrayList<String>();
PDPPOLICY_PROPERTIES.add(PROPERTY_ID);
PDPPOLICY_PROPERTIES.add(PROPERTY_NAME);
PDPPOLICY_PROPERTIES.add(PROPERTY_VERSION);
PDPPOLICY_PROPERTIES.add(PROPERTY_DESCRIPTION);
PDPPOLICY_PROPERTIES.add(PROPERTY_ISROOT);
PDPPOLICY_PROPERTIES = Collections.unmodifiableCollection(PDPPOLICY_PROPERTIES);
try {
PDPPOLICYITEM_ID = PDPPolicyItem.class.getMethod("getId", new Class[]{});
PDPPOLICYITEM_NAME = PDPPolicyItem.class.getMethod("getName", new Class[]{});
PDPPOLICYITEM_VERSION = PDPPolicyItem.class.getMethod("getVersion", new Class[]{});
PDPPOLICYITEM_DESCRIPTION = PDPPolicyItem.class.getMethod("getDescription", new Class[] {});
PDPPOLICYITEM_ISROOT = PDPPolicyItem.class.getMethod("getRoot", new Class[] {});
PDPPOLICYITEM_SETISROOT = PDPPolicyItem.class.getMethod("setRoot", new Class[] {Boolean.class});
} catch (final NoSuchMethodException e) {
throw new RuntimeException(
"Internal error finding methods in PDPContainer");
}
}
private final Object data;
private List<PDPPolicy> policies;
public PDPPolicyContainer(Object data) {
super();
this.data = data;
if (this.data instanceof PDPGroup) {
policies = new ArrayList<PDPPolicy> (((PDPGroup) this.data).getPolicies());
}
if (this.data instanceof PDP) {
policies = new ArrayList<PDPPolicy> (((PDP) this.data).getPolicies());
}
if (this.data instanceof Set) {
policies = new ArrayList<PDPPolicy> ((Set<PDPPolicy>)data);
}
if (this.policies == null) {
logger.info("NULL policies");
throw new NullPointerException("PDPPolicyContainer created with unexpected Object type '" + data.getClass().getName() + "'");
}
this.setContainer(this);
}
@Override
public Object nextItemId(Object itemId) {
if (logger.isTraceEnabled()) {
logger.trace("nextItemId: " + itemId);
}
int index = this.policies.indexOf(itemId);
if (index == -1 || (index + 1) >= this.policies.size()) {
return null;
}
return new PDPPolicyItem(this.policies.get(index + 1));
}
@Override
public Object prevItemId(Object itemId) {
if (logger.isTraceEnabled()) {
logger.trace("prevItemId: " + itemId);
}
int index = this.policies.indexOf(itemId);
if (index <= 0) {
return null;
}
return new PDPPolicyItem(this.policies.get(index - 1));
}
@Override
public Object firstItemId() {
if (logger.isTraceEnabled()) {
logger.trace("firstItemId: ");
}
if (this.policies.isEmpty()) {
return null;
}
return new PDPPolicyItem(this.policies.get(0));
}
@Override
public Object lastItemId() {
if (logger.isTraceEnabled()) {
logger.trace("lastItemid: ");
}
if (this.policies.isEmpty()) {
return null;
}
return new PDPPolicyItem(this.policies.get(this.policies.size() - 1));
}
@Override
public boolean isFirstId(Object itemId) {
if (logger.isTraceEnabled()) {
logger.trace("isFirstId: " + itemId);
}
if (this.policies.isEmpty()) {
return false;
}
return itemId.equals(this.policies.get(0));
}
@Override
public boolean isLastId(Object itemId) {
if (logger.isTraceEnabled()) {
logger.trace("isLastId: " + itemId);
}
if (this.policies.isEmpty()) {
return false;
}
return itemId.equals(this.policies.get(this.policies.size() - 1));
}
@Override
public Object addItemAfter(Object previousItemId)
throws UnsupportedOperationException {
// TODO Auto-generated method stub
return null;
}
@Override
public Item addItemAfter(Object previousItemId, Object newItemId)
throws UnsupportedOperationException {
// TODO Auto-generated method stub
return null;
}
@Override
public Item getItem(Object itemId) {
if (logger.isTraceEnabled()) {
logger.trace("getItem: " + itemId);
}
if (itemId instanceof PDPPolicy) {
return new PDPPolicyItem((PDPPolicy) itemId);
}
return null;
}
@Override
public Collection<?> getContainerPropertyIds() {
return PDPPOLICY_PROPERTIES;
}
@Override
public Collection<?> getItemIds() {
final Collection<Object> items = new ArrayList<Object>();
items.addAll(this.policies);
return Collections.unmodifiableCollection(items);
}
@Override
public Property<?> getContainerProperty(Object itemId, Object propertyId) {
if (itemId instanceof PDPPolicy == false) {
return null;
}
if (propertyId.equals(PROPERTY_ID)) {
return new MethodProperty<Object>(getType(propertyId),
new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_ID, null);
}
if (propertyId.equals(PROPERTY_NAME)) {
return new MethodProperty<Object>(getType(propertyId),
new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_NAME, null);
}
if (propertyId.equals(PROPERTY_VERSION)) {
return new MethodProperty<Object>(getType(propertyId),
new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_VERSION, null);
}
if (propertyId.equals(PROPERTY_DESCRIPTION)) {
return new MethodProperty<Object>(getType(propertyId),
new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_DESCRIPTION, null);
}
if (propertyId.equals(PROPERTY_ISROOT)) {
return new MethodProperty<Object>(getType(propertyId),
new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_ISROOT, PDPPOLICYITEM_SETISROOT);
}
return null;
}
@Override
public Class<?> getType(Object propertyId) {
if (propertyId.equals(PROPERTY_ID)) {
return String.class;
}
if (propertyId.equals(PROPERTY_NAME)) {
return String.class;
}
if (propertyId.equals(PROPERTY_VERSION)) {
return String.class;
}
if (propertyId.equals(PROPERTY_DESCRIPTION)) {
return String.class;
}
if (propertyId.equals(PROPERTY_ISROOT)) {
return Boolean.class;
}
return null;
}
@Override
public int size() {
if (logger.isTraceEnabled()) {
logger.trace("size: " + this.policies.size());
}
return this.policies.size();
}
@Override
public boolean containsId(Object itemId) {
if (logger.isTraceEnabled()) {
logger.trace("containsId: " + itemId);
}
return this.policies.contains(itemId);
}
@Override
public Item addItem(Object itemId) throws UnsupportedOperationException {
if (logger.isTraceEnabled()) {
logger.trace("addItem: " + itemId);
}
if (itemId instanceof PDPPolicy) {
this.policies.add((PDPPolicy) itemId);
return new PDPPolicyItem((PDPPolicy)itemId);
}
return null;
}
@Override
public Object addItem() throws UnsupportedOperationException {
throw new UnsupportedOperationException("Cannot add an empty policy.");
}
@Override
public boolean removeItem(Object itemId)
throws UnsupportedOperationException {
if (logger.isTraceEnabled()) {
logger.trace("removeItem: " + itemId);
}
return this.policies.remove(itemId);
}
@Override
public boolean addContainerProperty(Object propertyId, Class<?> type,
Object defaultValue) throws UnsupportedOperationException {
return false;
}
@Override
public boolean removeContainerProperty(Object propertyId)
throws UnsupportedOperationException {
return false;
}
@Override
public boolean removeAllItems() throws UnsupportedOperationException {
//this.policies = new ArrayList<PDPPolicy>();
//return true;
return false;
}
@Override
public int indexOfId(Object itemId) {
if (logger.isTraceEnabled()) {
logger.trace("indexOfId: " + itemId);
}
return this.policies.indexOf(itemId);
}
@Override
public Object getIdByIndex(int index) {
if (logger.isTraceEnabled()) {
logger.trace("getIdByIndex: " + index);
}
return this.policies.get(index);
}
@Override
public List<?> getItemIds(int startIndex, int numberOfItems) {
if (logger.isTraceEnabled()) {
logger.trace("getItemIds: " + startIndex + " " + numberOfItems);
}
if (numberOfItems < 0) {
throw new IllegalArgumentException();
}
return this.policies.subList(startIndex, startIndex + numberOfItems);
}
@Override
public Object addItemAt(int index) throws UnsupportedOperationException {
if (logger.isTraceEnabled()) {
logger.trace("addItemAt: " + index);
}
return null;
}
@Override
public Item addItemAt(int index, Object newItemId)
throws UnsupportedOperationException {
if (logger.isTraceEnabled()) {
logger.trace("addItemAt: " + index + " " + newItemId);
}
return null;
}
public class PDPPolicyItem implements Item {
private static final long serialVersionUID = 1L;
private final PDPPolicy policy;
public PDPPolicyItem(PDPPolicy itemId) {
this.policy = itemId;
}
public String getId() {
if (logger.isTraceEnabled()) {
logger.trace("getId: " + this.policy);
}
return this.policy.getId();
}
public String getName() {
if (logger.isTraceEnabled()) {
logger.trace("getName: " + this.policy);
}
return this.policy.getName();
}
public String getVersion() {
if (logger.isTraceEnabled()) {
logger.trace("getVersion: " + this.policy);
}
return this.policy.getVersion();
}
public String getDescription() {
if (logger.isTraceEnabled()) {
logger.trace("getDescription: " + this.policy);
}
return this.policy.getDescription();
}
public boolean getRoot() {
if (logger.isTraceEnabled()) {
logger.trace("isRoot: " + this.policy);
}
return this.policy.isRoot();
}
public void setRoot(Boolean root) {
((StdPDPPolicy)this.policy).setRoot(root);
}
@Override
public Property<?> getItemProperty(Object id) {
return getContainerProperty(policy, id);
}
@Override
public Collection<?> getItemPropertyIds() {
return getContainerPropertyIds();
}
@Override
public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property)
throws UnsupportedOperationException {
throw new UnsupportedOperationException("PDP Policy container "
+ "does not support adding new properties");
}
@Override
public boolean removeItemProperty(Object id)
throws UnsupportedOperationException {
throw new UnsupportedOperationException(
"PDP Policy container does not support property removal");
}
}
}