/*
* 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.client;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisModule;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.PolicyInclude;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.ws.policy.AndCompositeAssertion;
import org.apache.ws.policy.Policy;
import org.apache.ws.policy.PrimitiveAssertion;
import org.apache.ws.policy.XorCompositeAssertion;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
public class WSDLBasedPolicyProcessor {
private HashMap ns2modules = new HashMap();
private ConfigurationContext configctx;
public WSDLBasedPolicyProcessor(ConfigurationContext configctx){
//create the Map for namespaces to modules this is 1:N mapping
// so we got to use array lists
this.configctx = configctx;
AxisConfiguration axisConfiguration = configctx.getAxisConfiguration();
for (Iterator iterator = axisConfiguration.getModules().values()
.iterator(); iterator.hasNext();) {
AxisModule axisModule = (AxisModule) iterator.next();
String[] namespaces = axisModule.getSupportedPolicyNamespaces();
if (namespaces == null) {
continue;
}
for (int i = 0; i < namespaces.length; i++) {
ArrayList moduleList = null;
Object obj = ns2modules.get(namespaces[i]);
if(obj == null){
moduleList = new ArrayList(5);
ns2modules.put(namespaces[i], moduleList);
}else{
moduleList = (ArrayList)obj;
}
moduleList.add(axisModule);
}
}
}
public void configureServicePolices(AxisService axisService) throws AxisFault{
Iterator operations = axisService.getOperations();
while(operations.hasNext()){
AxisOperation axisOp = (AxisOperation)operations.next();
//TODO we support only Operation level Policy now
configureOperationPolices(axisOp);
}
}
public void configureOperationPolices(AxisOperation op)throws AxisFault{
PolicyInclude policyInclude = op.getPolicyInclude();
if(policyInclude != null ){
Policy policy = policyInclude.getEffectivePolicy();
if(policy != null){
if (!policy.isNormalized()) {
policy = (Policy) policy.normalize();
}
XorCompositeAssertion XOR = (XorCompositeAssertion) policy.getTerms()
.get(0);
AndCompositeAssertion AND = (AndCompositeAssertion) XOR.getTerms().get(
0);
Iterator pAsserations = AND.getTerms().iterator();
while(pAsserations.hasNext()){
PrimitiveAssertion pa = (PrimitiveAssertion) pAsserations.next();
String namespace = pa.getName().getNamespaceURI();
ArrayList moduleList = (ArrayList)ns2modules.get(namespace);
if (moduleList == null) {
System.err.println("cannot find a module to process "
+ namespace + "type assertions");
continue;
}else{
for(int i = 0;i<moduleList.size();i++){
AxisModule axisModule = (AxisModule) moduleList.get(i);
op.engageModule(axisModule,configctx.getAxisConfiguration());
axisModule.getModule().engageNotify(op);
}
}
}
}
}
}
}