blob: b0c54bb1fbd45b51da3def07415090edab4f975d [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.axis2.description;
import org.apache.axiom.util.UIDGenerator;
import org.apache.axis2.util.AxisPolicyLocator;
import org.apache.axis2.util.PolicyUtil;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyComponent;
import org.apache.neethi.PolicyReference;
import org.apache.neethi.PolicyRegistry;
import org.apache.neethi.PolicyRegistryImpl;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
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_MODULE_OPERATION_POLICY = 17;
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 Hashtable<String, Wrapper> wrapperElements = new Hashtable<String, Wrapper>();
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;
}
/**
* @param policy
* @see org.apache.axis2.description.PolicySubject#attachPolicy(Policy)
* @see org.apache.axis2.description.PolicySubject#clear()
* @deprecated As of 1.4 release, replaced by
* {@link PolicySubject #attachPolicy(Policy)} Use
* {@link PolicySubject #clear()} beforehand effective policy of
* {@link AxisDescription} has to be set as the argument.
*
*/
public void setPolicy(Policy policy) {
wrapperElements.clear();
if (policy.getName() == null && policy.getId() == null) {
policy.setId(UIDGenerator.generateUID());
}
Wrapper wrapper = new Wrapper(PolicyInclude.ANON_POLICY, policy);
if (policy.getName() != null) {
wrapperElements.put(policy.getName(), wrapper);
} else {
wrapperElements.put(policy.getId(), wrapper);
}
if (description != null) {
description.getPolicySubject().clear();
description.getPolicySubject().attachPolicy(policy);
}
}
/**
* @deprecated As of 1.4 release. You can't override a policies that
* applicable for the current policy scope via
* {@link PolicyInclude #setEffectivePolicy(Policy)}. In case
* you need to make a policy the only policy that is within the
* policy cache of an {@link AxisDescription} please use
* {@link PolicySubject #clear()} and
* {@link PolicySubject #attachPolicy(Policy)} accordingly.
*
*/
public void setEffectivePolicy(Policy effectivePolicy) {
this.effectivePolicy = effectivePolicy;
if (description != null && effectivePolicy != null) {
description.getPolicySubject().clear();
description.getPolicySubject().attachPolicy(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<Wrapper> iterator = wrapperElements.values().iterator();
while (iterator.hasNext()) {
Object policyElement = ((Wrapper) iterator.next()).getValue();
Policy p;
if (policyElement instanceof PolicyReference) {
AxisPolicyLocator locator = new AxisPolicyLocator(description);
p = (Policy) ((PolicyReference) policyElement)
.normalize(locator, 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);
}
/**
* @deprecated As of 1.4 release. If you need to calculate merged policy of
* all policies that are in the policy cache of
* {@link AxisDescription}, use
* {@link PolicySubject #getAttachedPolicyComponents() and {@link org.PolicyUtil #getMergedPolicy(List, AxisDescription)}}
*/
public Policy getPolicy() {
if (description != null) {
ArrayList<PolicyComponent> policyList = new ArrayList<PolicyComponent>(description.getPolicySubject()
.getAttachedPolicyComponents());
return PolicyUtil.getMergedPolicy(policyList, description);
}
calculatePolicy();
return policy;
}
/**
* @deprecated As of 1.4 release. Use
* {@link AxisMessage #getEffectivePolicy()} or
* {@link AxisBindingMessage #getEffectivePolicy()} when
* applicable.
*/
public Policy getEffectivePolicy() {
if (description != null) {
if (description instanceof AxisMessage) {
return ((AxisMessage) description).getEffectivePolicy();
} else if (description instanceof AxisBindingMessage) {
return ((AxisBindingMessage) description).getEffectivePolicy();
}
}
calculateEffectivePolicy();
return effectivePolicy;
}
/**
* @deprecated As of 1.4 release. The policy element type is no longer
* required since we maintain a complete binding description
* hierarchy for the static description the service. Hence use
* {@link PolicySubject #getAttachedPolicyComponents()} on
* appropriate description object.
*/
public ArrayList getPolicyElements(int type) {
ArrayList policyElementList = new ArrayList();
Iterator<Wrapper> wrapperElementIterator = wrapperElements.values().iterator();
Wrapper wrapper;
while (wrapperElementIterator.hasNext()) {
wrapper = (Wrapper) wrapperElementIterator.next();
if (wrapper.getType() == type) {
policyElementList.add(wrapper.getValue());
}
}
return policyElementList;
}
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;
}
}
}