/*
* Copyright 2005,2006 WSO2, Inc. http://www.wso2.org
*
* 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.wso2.carbon.relay.module.policy;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.axis2.description.PolicySubject;
import org.apache.axis2.AxisFault;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyEngine;
import org.apache.neethi.All;
import org.apache.neethi.builders.xml.XmlPrimtiveAssertion;
import org.apache.axiom.om.OMElement;
import org.wso2.carbon.relay.module.RelayConfiguration;
import org.wso2.carbon.relay.RelayConstants;
import javax.xml.namespace.QName;
import java.util.Collection;
import java.util.List;
import java.util.Iterator;
public class PolicyProcessor {
private static Log log = LogFactory.getLog(PolicyProcessor.class);
public static RelayConfiguration processCachingPolicy(PolicySubject policySubject) throws AxisFault {
if (policySubject.getAttachedPolicyComponents().size() != 0) {
RelayConfiguration relayConfig = new RelayConfiguration();
Collection topLevelAssertionList = policySubject.getAttachedPolicyComponents();
handlePolicyComponents(relayConfig, topLevelAssertionList);
return relayConfig;
} else {
return null;
}
}
private static boolean handlePolicyComponents(RelayConfiguration relayConfiguration,
Collection topLevelAssertionList) throws AxisFault {
for (Object topLevelAssertionObject : topLevelAssertionList) {
if (topLevelAssertionObject instanceof Policy) {
Policy policy = (Policy) topLevelAssertionObject;
Collection policyComponents = policy.getPolicyComponents();
handlePolicyComponents(relayConfiguration, policyComponents);
} else if (topLevelAssertionObject instanceof XmlPrimtiveAssertion) {
XmlPrimtiveAssertion tlxa = (XmlPrimtiveAssertion) topLevelAssertionObject;
QName qName = tlxa.getName();
// validating the relay assertion
if (!qName.equals(RelayConstants.RELAY_ASSERSION_QNAME)) {
return false;
}
Policy rpc = PolicyEngine.getPolicy(tlxa.getValue());
for (Object configAssertion : rpc.getPolicyComponents()) {
// Validating the relay policy
if (!(configAssertion instanceof Policy)) {
return false;
}
Policy cachingPolicy = (Policy) configAssertion;
List childAssertionsList = cachingPolicy.getPolicyComponents();
for (Object configData : childAssertionsList) {
if (!(configData instanceof All)) {
handleException("Unexpected relay " +
"policy, \"wsp:All\" expected");
}
All all = (All) configData;
List configDataList = all.getPolicyComponents();
for (Object configDtaObject : configDataList) {
if (!(configDtaObject instanceof XmlPrimtiveAssertion)) {
// invalid relay policy
handleException("Unexpected relay policy " +
"assertion for the relay module");
}
XmlPrimtiveAssertion assertion
= (XmlPrimtiveAssertion) configDtaObject;
if (assertion.getName().equals(
RelayConstants.INCLUDE_HIDDEN_SERVICES_QNAME)) {
String value = assertion.getValue().getText();
relayConfiguration.setIncludeHiddenServices(
Boolean.parseBoolean(value));
}
if (assertion.getName().equals(
RelayConstants.BUILDERS_QNAME) &&
assertion.getValue() != null) {
processBuilders(assertion.getValue(), relayConfiguration);
}
if (assertion.getName().equals(
RelayConstants.SERVICES_QNAME) &&
assertion.getValue() != null) {
processServices(assertion.getValue(), relayConfiguration);
}
}
}
}
} else {
return false;
}
}
return true;
}
private static boolean processBuilders(OMElement builders, RelayConfiguration configuration) {
Iterator itr = builders.getChildrenWithName(RelayConstants.MESSAGE_BUILDER_QNAME);
while (itr.hasNext()) {
OMElement e = (OMElement) itr.next();
String contentType = e.getAttributeValue(RelayConstants.CONTENT_TYPE_QNAME);
if (contentType == null) {
return false;
}
String className = e.getAttributeValue(RelayConstants.CLASS_NAME_QNAME);
if (className == null) {
return false;
}
configuration.addBuilder(contentType, className);
String formatterClass = e.getAttributeValue(RelayConstants.FORMATTER_CLASS_NAME_QNAME);
if (formatterClass != null) {
configuration.addFormatter(contentType, formatterClass);
}
}
return true;
}
private static boolean processServices(OMElement services, RelayConfiguration configuration) {
Iterator itr = services.getChildrenWithName(RelayConstants.SERVICE_QNAME);
while (itr.hasNext()) {
OMElement e = (OMElement) itr.next();
configuration.addService(e.getText());
}
return true;
}
public static void handleException(String msg) throws AxisFault {
log.error(msg);
throw new AxisFault(msg);
}
}