Author: slaws
Date: Tue Mar 2 17:00:06 2010
New Revision: 918111
URL: http://svn.apache.org/viewvc?rev=918111&view=rev
Log:
Add first bits of code to start enabling the use of policies nested inside of
WS Policy and policy alternatives rather than having to sit at the top level.
Based on this the next step is to understand how tuscany defined and
non-tuscany defined policies are managed.
Added:
tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyContainer.java
(with props)
Modified:
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldClient.java
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldService.java
tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/BasePolicyProvider.java
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java
Modified:
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldClient.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldClient.java?rev=918111&r1=918110&r2=918111&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldClient.java
(original)
+++
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldClient.java
Tue Mar 2 17:00:06 2010
@@ -19,7 +19,6 @@
package org.apache.tuscany.sca.policy.wspolicy.helloworld;
-import org.apache.tuscany.sca.binding.ws.axis2.helloworld.HelloWorld;
import org.oasisopen.sca.annotation.Reference;
public class HelloWorldClient implements HelloWorld {
Modified:
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldService.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldService.java?rev=918111&r1=918110&r2=918111&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldService.java
(original)
+++
tuscany/sca-java-2.x/trunk/itest/policy/wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/helloworld/HelloWorldService.java
Tue Mar 2 17:00:06 2010
@@ -19,8 +19,6 @@
package org.apache.tuscany.sca.policy.wspolicy.helloworld;
-import org.apache.tuscany.sca.binding.ws.axis2.helloworld.HelloWorld;
-
public class HelloWorldService implements HelloWorld {
public String getGreetings(String s) {
Added:
tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyContainer.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyContainer.java?rev=918111&view=auto
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyContainer.java
(added)
+++
tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyContainer.java
Tue Mar 2 17:00:06 2010
@@ -0,0 +1,36 @@
+/*
+ * 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.tuscany.sca.policy;
+
+/**
+ * Base interface for policy models. Mainly allows policies to hold
+ * other policies
+ *
+ * @version $Rev$ $Date$
+ */
+public interface PolicyContainer {
+ /**
+ * For complex policy models, such as ws-policy,
+ * a policy provider may only match against one of a
+ * number of child policy models
+ *
+ * @return the matching child policy object or null
+ */
+ <T> Object getChildPolicy(Class<T> policyType);
+}
Propchange:
tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyContainer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyContainer.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified:
tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/BasePolicyProvider.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/BasePolicyProvider.java?rev=918111&r1=918110&r2=918111&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/BasePolicyProvider.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/BasePolicyProvider.java
Tue Mar 2 17:00:06 2010
@@ -19,6 +19,7 @@
package org.apache.tuscany.sca.provider;
+import java.security.Policy;
import java.util.ArrayList;
import java.util.List;
@@ -29,6 +30,7 @@
import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.invocation.InvocationChain;
import org.apache.tuscany.sca.invocation.PhasedInterceptor;
+import org.apache.tuscany.sca.policy.PolicyContainer;
import org.apache.tuscany.sca.policy.PolicyExpression;
import org.apache.tuscany.sca.policy.PolicySet;
import org.apache.tuscany.sca.policy.PolicySubject;
@@ -57,13 +59,23 @@
if (policyType.isInstance(p)) {
policies.add(policyType.cast(p));
}
+
if (p instanceof PolicyExpression) {
PolicyExpression exp = (PolicyExpression)p;
if (policyType.isInstance(exp.getPolicy())) {
policies.add(policyType.cast(exp.getPolicy()));
}
+
+ // TODO - some code to handle the case where the
+ // policy expression is a WS-Policy
+ // Experimental at the moment.
+ if (PolicyContainer.class.isInstance(exp.getPolicy())){
+ Object policy =
((PolicyContainer)exp.getPolicy()).getChildPolicy(policyType);
+ if(policy != null){
+ policies.add(policyType.cast(policy));
+ }
+ }
}
-
}
}
return policies;
Modified:
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java?rev=918111&r1=918110&r2=918111&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java
Tue Mar 2 17:00:06 2010
@@ -33,6 +33,7 @@
import org.apache.tuscany.sca.assembly.Implementation;
import org.apache.tuscany.sca.assembly.builder.BuilderContext;
import org.apache.tuscany.sca.assembly.builder.PolicyBuilder;
+import org.apache.tuscany.sca.policy.PolicyContainer;
import org.apache.tuscany.sca.policy.PolicyExpression;
import org.apache.tuscany.sca.policy.PolicySet;
import org.apache.tuscany.sca.policy.PolicySubject;
@@ -41,7 +42,7 @@
/**
* The WS-Policy model. Currently defers to the Neethi policy model under the
covers.
*/
-public class WSPolicy {
+public class WSPolicy implements PolicyContainer {
public final static String WS_POLICY_NS =
"http://schemas.xmlsoap.org/ws/2004/09/policy";
public final static String WS_POLICY = "Policy";
@@ -71,4 +72,15 @@
public String toString() {
return "WSPolicy [" + neethiPolicy + "]";
}
+
+ public <T> Object getChildPolicy(Class<T> policyType) {
+ for (Object alternative : policyAssertions){
+ for (Object policy : (List<Object>)alternative){
+ if (policyType.isInstance(policy)){
+ return policy;
+ }
+ }
+ }
+ return null;
+ }
}
Modified:
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java?rev=918111&r1=918110&r2=918111&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java
Tue Mar 2 17:00:06 2010
@@ -34,7 +34,6 @@
import org.apache.tuscany.sca.policy.PolicyExpression;
import org.apache.tuscany.sca.policy.PolicySet;
import org.apache.tuscany.sca.policy.PolicySubject;
-import org.apache.tuscany.sca.policy.wspolicy.xml.WSPolicyProcessor;
/**
* Processing for WS-Policy objects
@@ -43,19 +42,19 @@
public class WSPolicyBuilder implements PolicyBuilder<Policy> {
public boolean build(Endpoint endpoint, BuilderContext context) {
- List<Policy> polices = getPolicies(endpoint);
+ List<WSPolicy> polices = getPolicies(endpoint);
System.out.println(endpoint + ": " + polices);
return true;
}
public boolean build(EndpointReference endpointReference, BuilderContext
context) {
- List<Policy> polices = getPolicies(endpointReference);
+ List<WSPolicy> polices = getPolicies(endpointReference);
System.out.println(endpointReference + ": " + polices);
return true;
}
public boolean build(Component component, Implementation implementation,
BuilderContext context) {
- List<Policy> polices = getPolicies(implementation);
+ List<WSPolicy> polices = getPolicies(implementation);
System.out.println(implementation + ": " + polices);
return true;
}
@@ -68,18 +67,6 @@
return null;
}
- private List<Policy> getPolicies(PolicySubject subject) {
- List<Policy> polices = new ArrayList<Policy>();
- for (PolicySet ps : subject.getPolicySets()) {
- for (PolicyExpression exp : ps.getPolicies()) {
- if (getPolicyType().equals(exp.getName())) {
- polices.add((Policy)exp.getPolicy());
- }
- }
- }
- return polices;
- }
-
public boolean build(EndpointReference endpointReference, Endpoint
endpoint, BuilderContext context) {
// TODO - neethi doesn't include code for matching ws policy
@@ -147,6 +134,18 @@
return true;
}
+ private List<WSPolicy> getPolicies(PolicySubject subject) {
+ List<WSPolicy> polices = new ArrayList<WSPolicy>();
+ for (PolicySet ps : subject.getPolicySets()) {
+ for (PolicyExpression exp : ps.getPolicies()) {
+ if (getPolicyType().equals(exp.getName())) {
+ polices.add((WSPolicy)exp.getPolicy());
+ }
+ }
+ }
+ return polices;
+ }
+
private boolean build(WSPolicy wsPolicy1, WSPolicy wsPolicy2){
// TODO - cheating here as we assume a flat policy structure
// we've read all the policy assertions into Tuscany models
Modified:
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java?rev=918111&r1=918110&r2=918111&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java
Tue Mar 2 17:00:06 2010
@@ -23,6 +23,8 @@
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
@@ -102,13 +104,24 @@
WSPolicy wsPolicy = new WSPolicy();
wsPolicy.setNeethiPolicy(neethiPolicy);
- // read policy assertions
- readPolicyAssertions(wsPolicy,neethiPolicy, context);
+ // normalize the neethi tree so we can easily identify
+ // the policy alternatives
+ neethiPolicy.normalize(true);
+
+ // top-level children of ExactlyOne are policy alternatives so
+ // for each child create a policy model list and pull the
+ // policies out
+ for(Object alternative : neethiPolicy.getPolicyComponents()) {
+ List<Object> assertions = new ArrayList<Object>();
+ readPolicyAssertions(assertions, (PolicyComponent)alternative,
context);
+ wsPolicy.getPolicyAssertions().add(assertions);
+ }
+
return wsPolicy;
}
- private void readPolicyAssertions(WSPolicy wsPolicy, PolicyComponent
policyComponent, ProcessorContext context){
+ private void readPolicyAssertions(List<Object> policyAssertions,
PolicyComponent policyComponent, ProcessorContext context){
// recurse into the policy alternatives
// TODO - lots of todos here as this just walks down the neethi
hierarchy
@@ -116,12 +129,14 @@
// regard to the policy alternatives. Undecided about whether
to
// commit to prepresenting this hierarchy in Tuscany or whether
// to rely on neethi
+ // Should this be in the builder? Not really as this drives the
+ // Tuscany specific readers
if (policyComponent.getType() != Constants.TYPE_ASSERTION){
PolicyOperator policyOperator = (PolicyOperator)policyComponent;
for(Object childComponent : policyOperator.getPolicyComponents()){
// TODO - create assertion hierarchy in wsPolicy model
// how we do this depends on if we continue to use
neethi
- readPolicyAssertions(wsPolicy,
(PolicyComponent)childComponent, context);
+ readPolicyAssertions(policyAssertions,
(PolicyComponent)childComponent, context);
}
} else {
try {
@@ -136,10 +151,14 @@
ByteArrayInputStream inputStream = new
ByteArrayInputStream(outputStream.toByteArray());
XMLStreamReader reader =
inputFactory.createXMLStreamReader(inputStream);
+ Object neethiAssertion = policyComponent;
Object tuscanyAssertion = extensionProcessor.read(reader,
context);
if (tuscanyAssertion != null) {
- wsPolicy.getPolicyAssertions().add(tuscanyAssertion);
+ policyAssertions.add(tuscanyAssertion);
+ } else {
+ // add neethi assertion
+ policyAssertions.add(neethiAssertion);
}
} catch (Exception ex) {
// TODO - report the error properly