blob: 5de0da57e9577a40fcd101d3372c9c372152f2ad [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* 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.
*/
package org.apache.axis2.description;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import org.apache.axiom.om.util.UUIDGenerator;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyReference;
import org.apache.neethi.PolicyRegistry;
import org.apache.neethi.PolicyRegistryImpl;
public class PolicyInclude {
public static final int ANON_POLICY = 100;
public static final int AXIS_POLICY = 1;
public static final int AXIS_MODULE_POLICY = 2;
public static final int AXIS_SERVICE_POLICY = 3;
public static final int AXIS_OPERATION_POLICY = 4;
public static final int AXIS_MESSAGE_POLICY = 5;
public static final int SERVICE_POLICY = 6;
public static final int PORT_POLICY = 7;
public static final int PORT_TYPE_POLICY = 8;
public static final int BINDING_POLICY = 9;
public static final int OPERATION_POLICY = 10;
public static final int BINDING_OPERATION_POLICY = 11;
public static final int INPUT_POLICY = 12;
public static final int OUTPUT_POLICY = 13;
public static final int BINDING_INPUT_POLICY = 14;
public static final int BINDING_OUTPUT_POLICY = 15;
public static final int MESSAGE_POLICY = 16;
private Policy policy = null;
private Policy effectivePolicy = null;
private PolicyRegistry reg;
private AxisDescription description;
// private ArrayList wrapperElements = new ArrayList();
private Hashtable wrapperElements = new Hashtable();
public PolicyInclude() {
reg = new PolicyRegistryImpl();
}
public PolicyInclude(AxisDescription axisDescription) {
if (axisDescription.getParent() != null) {
PolicyInclude parentPolicyInclude = axisDescription.getParent().getPolicyInclude();
reg = new PolicyRegistryImpl(parentPolicyInclude.getPolicyRegistry());
} else {
reg = new PolicyRegistryImpl();
}
setDescription(axisDescription);
}
public void setPolicyRegistry(PolicyRegistry reg) {
this.reg = reg;
}
public PolicyRegistry getPolicyRegistry() {
return reg;
}
public void setPolicy(Policy policy) {
wrapperElements.clear();
if (policy.getName() == null && policy.getId() == null) {
policy.setId(UUIDGenerator.getUUID());
}
Wrapper wrapper = new Wrapper(PolicyInclude.ANON_POLICY, policy);
if (policy.getName() != null) {
wrapperElements.put(policy.getName(), wrapper);
} else {
wrapperElements.put(policy.getId(), wrapper);
}
}
public void updatePolicy(Policy policy) {
String key;
if ((key = policy.getName()) == null && (key = policy.getId()) == null) {
// TODO throw more meaningful exception ..
throw new RuntimeException("policy doesn't have a name or an id ");
}
Wrapper wrapper = (Wrapper) wrapperElements.get(key);
wrapper.value = policy;
}
public void setEffectivePolicy(Policy effectivePolicy) {
this.effectivePolicy = effectivePolicy;
}
public void setDescription(AxisDescription description) {
this.description = description;
}
public AxisDescription getDescription() {
return description;
}
private PolicyInclude getParent() {
if (description != null && description.getParent() != null) {
return description.getParent().getPolicyInclude();
}
return null;
}
private void calculatePolicy() {
Policy result = null;
Iterator iterator = wrapperElements.values().iterator();
while (iterator.hasNext()) {
Object policyElement = ((Wrapper) iterator.next()).getValue();
Policy p;
if (policyElement instanceof PolicyReference) {
PolicyRegistry r = getPolicyRegistry();
p = (Policy) ((PolicyReference) policyElement)
.normalize(getPolicyRegistry(), false);
} else if (policyElement instanceof Policy) {
p = (Policy) policyElement;
} else {
// TODO AxisFault?
throw new RuntimeException();
}
result = (result == null) ? (Policy) p : (Policy) result.merge(p);
}
this.policy = result;
}
private void calculateEffectivePolicy() {
Policy result ;
if (getParent() != null) {
Policy parentPolicy = getParent().getEffectivePolicy();
if (parentPolicy == null) {
result = getPolicy();
} else {
if (getPolicy() != null) {
result = (Policy) parentPolicy.merge(getPolicy());
} else {
result = parentPolicy;
}
}
} else {
result = getPolicy();
}
setEffectivePolicy(result);
}
public Policy getPolicy() {
calculatePolicy();
return policy;
}
public Policy getEffectivePolicy() {
calculateEffectivePolicy();
return effectivePolicy;
}
public ArrayList getPolicyElements() {
ArrayList policyElementsList = new ArrayList();
Iterator policyElementIterator = wrapperElements.values().iterator();
while (policyElementIterator.hasNext()) {
policyElementsList
.add(((Wrapper) policyElementIterator.next()).getValue());
}
return policyElementsList;
}
public ArrayList getPolicyElements(int type) {
ArrayList policyElementList = new ArrayList();
Iterator wrapperElementIterator = wrapperElements.values().iterator();
Wrapper wrapper;
while (wrapperElementIterator.hasNext()) {
wrapper = (Wrapper) wrapperElementIterator.next();
if (wrapper.getType() == type) {
policyElementList.add(wrapper.getValue());
}
}
return policyElementList;
}
public void registerPolicy(String key, Policy policy) {
reg.register(key, policy);
}
public Policy getPolicy(String key) {
return reg.lookup(key);
}
public void addPolicyElement(int type, Policy policy) {
String key;
if ((key = policy.getName()) == null && (key = policy.getId()) == null) {
policy.setId(UUIDGenerator.getUUID());
}
key = (policy.getName() != null) ? policy.getName() : policy.getId();
Wrapper wrapper = new Wrapper(type, policy);
wrapperElements.put(key, wrapper);
reg.register(key, policy);
}
public void addPolicyRefElement(int type, PolicyReference policyReference) {
Wrapper wrapper = new Wrapper(type, policyReference);
wrapperElements.put(policyReference.getURI(), wrapper);
}
class Wrapper {
private int type;
private Object value;
Wrapper(int type, Object value) {
setType(type);
setValue(value);
}
void setType(int type) {
this.type = type;
}
int getType() {
return type;
}
void setValue(Object value) {
this.value = value;
}
Object getValue() {
return value;
}
}
public void removePolicyElement(String policyURI) {
wrapperElements.remove(policyURI);
reg.remove(policyURI);
}
public void removeAllPolicyElements(){
wrapperElements.clear();
}
}