Author: muthulee
Date: Mon Jul 23 20:24:03 2007
New Revision: 558920
URL: http://svn.apache.org/viewvc?view=rev&rev=558920
Log:
Fixing Rampart - 61
Added:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/OptimizePartsBuilder.java
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/OptimizePartsConfig.java
Modified:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/RampartPolicyData.java
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/MessageOptimizer.java
Modified:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java?view=diff&rev=558920&r1=558919&r2=558920
==============================================================================
---
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java
(original)
+++
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/MessageBuilder.java
Mon Jul 23 20:24:03 2007
@@ -34,6 +34,7 @@
import org.apache.rampart.builder.SymmetricBindingBuilder;
import org.apache.rampart.builder.TransportBindingBuilder;
import org.apache.rampart.policy.RampartPolicyData;
+import org.apache.rampart.policy.model.OptimizePartsConfig;
import org.apache.rampart.util.Axis2Util;
import org.apache.rampart.util.MessageOptimizer;
import org.apache.rampart.util.RampartUtil;
@@ -134,12 +135,9 @@
* Checking whether MTOMSerializable is there. If so set
optimizeElement.
* */
if(rpd.isMTOMSerialize()){
- String optimizeElement = rpd.getOptimizeParts();
- if(optimizeElement == null){
- optimizeElement =
"//xenc:EncryptedData/xenc:CipherData/xenc:CipherValue";
- }
msgCtx.setProperty(Constants.Configuration.ENABLE_MTOM,
Constants.VALUE_TRUE);
- MessageOptimizer.optimize(msgCtx.getEnvelope(),optimizeElement);
+ OptimizePartsConfig config= rpd.getOptimizePartsConfig();
+ MessageOptimizer.optimize(msgCtx.getEnvelope(),
config.getExpressions(), config.getNamespaces());
}
}
Modified:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/RampartPolicyData.java
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/RampartPolicyData.java?view=diff&rev=558920&r1=558919&r2=558920
==============================================================================
---
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/RampartPolicyData.java
(original)
+++
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/RampartPolicyData.java
Mon Jul 23 20:24:03 2007
@@ -19,6 +19,7 @@
import org.apache.axis2.policy.model.MTOMAssertion;
import org.apache.neethi.Policy;
import org.apache.rampart.RampartException;
+import org.apache.rampart.policy.model.OptimizePartsConfig;
import org.apache.rampart.policy.model.RampartConfig;
import org.apache.ws.secpolicy.Constants;
import org.apache.ws.secpolicy.WSSPolicyException;
@@ -662,7 +663,7 @@
return false;
}
- public String getOptimizeParts(){
+ public OptimizePartsConfig getOptimizePartsConfig(){
return rampartConfig.getOptimizeParts();
}
Added:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/OptimizePartsBuilder.java
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/OptimizePartsBuilder.java?view=auto&rev=558920
==============================================================================
---
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/OptimizePartsBuilder.java
(added)
+++
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/OptimizePartsBuilder.java
Mon Jul 23 20:24:03 2007
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2001-2004 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.rampart.policy.builders;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.neethi.Assertion;
+import org.apache.neethi.AssertionBuilderFactory;
+import org.apache.neethi.builders.AssertionBuilder;
+import org.apache.rampart.policy.model.OptimizePartsConfig;
+import org.apache.rampart.policy.model.RampartConfig;
+
+/**
+ * OptimizePartsBuilder creates the OptimizePartsConfig
+ *
+ * This clase deserialize the following XML fragment inside the RampartConfig.
+ * Example
+<pre>
+<ramp:optimizeParts><br />
+<ramp:expressions><br />
+<ramp:expression>//ns1:data1</ramp:expression><br />
+<ramp:expression>//ns2:data2</ramp:expression><br />
+</ramp:expressions><br />
+ <ramp:namespaces><br />
+<nampespace uri="http://test1.com" prefix="ns1"/><br />
+<nampespace uri="http://test2.com" prefix="ns2"/><br />
+</ramp:namespaces><br />
+</ramp:optimizeParts>
+</pre>
+ * @see OptimizePartsConfig
+ */
+public class OptimizePartsBuilder implements AssertionBuilder{
+
+ public Assertion build(OMElement element, AssertionBuilderFactory
factory) throws IllegalArgumentException {
+ OptimizePartsConfig assertion = new OptimizePartsConfig();
+ OMElement expressionsElem = element.getFirstChildWithName(new
QName(RampartConfig.NS, OptimizePartsConfig.EXPRESSIONS_LN));
+
+ if(expressionsElem != null){
+ Iterator iterator = expressionsElem.getChildElements();
+ while(iterator.hasNext()){
+ OMElement elem = (OMElement)iterator.next();
+ String expression = elem.getText();
+ assertion.addExpression(expression);
+ }
+
+ }
+
+ OMElement nsElem = element.getFirstChildWithName(new
QName(RampartConfig.NS, OptimizePartsConfig.NAMESPACES_LN));
+ if(nsElem != null){
+ Iterator iterator = nsElem.getChildElements();
+ while(iterator.hasNext()){
+ OMElement elem = (OMElement)iterator.next();
+ String namespace = elem.getText();
+ String prefix = elem.getAttributeValue(new
QName("", OptimizePartsConfig.PREFIX_ATTR));
+ String uri = elem.getAttributeValue(new
QName("", OptimizePartsConfig.URI_ATTR));
+ assertion.addNamespaces(prefix, uri);
+ }
+
+ }
+ return assertion;
+ }
+
+ public QName[] getKnownElements() {
+ return new QName[] {new QName(RampartConfig.NS,
OptimizePartsConfig.OPTIMIZE_PARTS_LN)};
+ }
+
+}
Modified:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java?view=diff&rev=558920&r1=558919&r2=558920
==============================================================================
---
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java
(original)
+++
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java
Mon Jul 23 20:24:03 2007
@@ -22,6 +22,7 @@
import org.apache.neethi.AssertionBuilderFactory;
import org.apache.neethi.builders.AssertionBuilder;
import org.apache.rampart.policy.model.CryptoConfig;
+import org.apache.rampart.policy.model.OptimizePartsConfig;
import org.apache.rampart.policy.model.RampartConfig;
import org.apache.rampart.policy.model.SSLConfig;
@@ -47,12 +48,6 @@
}
childElement = element.getFirstChildWithName(new QName(
- RampartConfig.NS, RampartConfig.OPTIMISE_PARTS_LN));
- if (childElement != null) {
- rampartConfig.setOptimizeParts(childElement.getText().trim());
- }
-
- childElement = element.getFirstChildWithName(new QName(
RampartConfig.NS, RampartConfig.PW_CB_CLASS_LN));
if (childElement != null) {
rampartConfig.setPwCbClass(childElement.getText().trim());
@@ -70,7 +65,6 @@
}
-
childElement = element.getFirstChildWithName(new QName(
RampartConfig.NS, RampartConfig.SIG_CRYPTO_LN));
if (childElement != null) {
@@ -88,6 +82,14 @@
RampartConfig.NS, RampartConfig.TS_MAX_SKEW_LN));
if (childElement != null) {
rampartConfig.setTimestampMaxSkew(childElement.getText().trim());
+ }
+
+ childElement = element.getFirstChildWithName(new QName(
+ RampartConfig.NS, RampartConfig.OPTIMISE_PARTS));
+ if (childElement != null) {
+ OptimizePartsConfig config = (OptimizePartsConfig)new
OptimizePartsBuilder().
+ build(childElement, factory);
+ rampartConfig.setOptimizeParts(config);
}
return rampartConfig;
Added:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/OptimizePartsConfig.java
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/OptimizePartsConfig.java?view=auto&rev=558920
==============================================================================
---
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/OptimizePartsConfig.java
(added)
+++
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/OptimizePartsConfig.java
Mon Jul 23 20:24:03 2007
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2001-2004 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.rampart.policy.model;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.neethi.Assertion;
+import org.apache.neethi.Constants;
+import org.apache.neethi.PolicyComponent;
+
+
+public class OptimizePartsConfig implements Assertion{
+
+ public final static String OPTIMIZE_PARTS_LN =
RampartConfig.OPTIMISE_PARTS;
+ public final static String EXPRESSIONS_LN = "expressions";
+ public final static String EXPRESSION_LN = "expression";
+ public final static String NAMESPACES_LN = "namespaces";
+ public final static String NAMESPACE_LN = "namespace";
+ public final static String URI_ATTR = "uri";
+ public final static String PREFIX_ATTR = "prefix";
+
+ private Map namespaces = null;
+ private Vector expressions = null;
+
+ public OptimizePartsConfig(){
+ namespaces = new HashMap();
+ expressions = new Vector();
+ }
+
+ public void addExpression(String expression){
+ expressions.add(expression);
+ }
+
+ public void addNamespaces(String prefix, String ns){
+ namespaces.put(prefix, ns);
+ }
+
+ public Vector getExpressions() {
+ return expressions;
+ }
+
+ public Map getNamespaces() {
+ return namespaces;
+ }
+
+ public short getType() {
+ return Constants.TYPE_ASSERTION;
+ }
+
+ public QName getName() {
+ return new QName(RampartConfig.NS, OPTIMIZE_PARTS_LN);
+ }
+
+ public void serialize(XMLStreamWriter writer) throws XMLStreamException
{
+ String prefix = writer.getPrefix(RampartConfig.NS);
+
+ if (prefix == null) {
+ prefix = RampartConfig.NS;
+ writer.setPrefix(prefix, RampartConfig.NS);
+ }
+
+ writer.writeStartElement(RampartConfig.NS, OPTIMIZE_PARTS_LN);
+
+ if((expressions != null) && (expressions.size()>0)){
+ writer.writeStartElement(RampartConfig.NS, EXPRESSIONS_LN);
+ Iterator ite = expressions.iterator();
+ while(ite.hasNext()){
+ writer.writeStartElement(RampartConfig.NS,
EXPRESSION_LN);
+ String exp = (String)ite.next();
+ writer.writeCharacters(exp);
+ writer.writeEndElement();
+ }
+ writer.writeEndElement();
+ }
+
+ if((namespaces != null) && (namespaces.size()>0)){
+ writer.writeStartElement(RampartConfig.NS, NAMESPACES_LN);
+ Iterator ite = namespaces.keySet().iterator();
+ while(ite.hasNext()){
+ String strPrefix = (String)ite.next();
+ String strURI = (String) namespaces.get(strPrefix);
+ writer.writeAttribute(URI_ATTR , strURI);
+ writer.writeAttribute(PREFIX_ATTR, strPrefix);
+ writer.writeEndElement();
+ }
+ writer.writeEndElement();
+ }
+ writer.writeEndElement();
+ }
+
+ public PolicyComponent normalize() {
+ //TODO
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ public boolean isOptional() {
+ throw new UnsupportedOperationException("Not relevant");
+ }
+
+ public boolean equal(PolicyComponent arg0) {
+ throw new UnsupportedOperationException("Not relevant");
+ }
+
+
+
+
+}
Modified:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java?view=diff&rev=558920&r1=558919&r2=558920
==============================================================================
---
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java
(original)
+++
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java
Mon Jul 23 20:24:03 2007
@@ -87,8 +87,10 @@
public final static String TOKEN_STORE_CLASS_LN = "tokenStoreClass";
- public final static String OPTIMISE_PARTS_LN = "optimizeParts";
+ public final static String OPTIMISE_PARTS = "optimizeParts";
+ public final static String SSL_CONFIG = "sslConfig";
+
private String user;
private String encryptionUser;
@@ -105,15 +107,12 @@
private String timestampMaxSkew =
Integer.toString(DEFAULT_TIMESTAMP_MAX_SKEW);
- private String optimizeParts;
+ private OptimizePartsConfig optimizeParts;
private String tokenStoreClass;
private SSLConfig sslConfig;
- public final static String SSL_CONFIG = "sslConfig";
-
-
public SSLConfig getSSLConfig() {
return sslConfig;
}
@@ -307,23 +306,13 @@
public void setTimestampMaxSkew(String timestampMaxSkew) {
this.timestampMaxSkew = timestampMaxSkew;
}
-
- /**
- * @param strOptimizeParts
- * The xpath of elements that should be optimized
- */
- public void setOptimizeParts(String strOptimizeParts){
- optimizeParts = strOptimizeParts;
- }
-
- /**
- *
- * @return The Xpath string of indicating elements to be optimized or null.
- */
-
- public String getOptimizeParts(){
- return optimizeParts;
- }
-
+
+ public OptimizePartsConfig getOptimizeParts() {
+ return optimizeParts;
+ }
+
+ public void setOptimizeParts(OptimizePartsConfig optimizeParts) {
+ this.optimizeParts = optimizeParts;
+ }
}
Modified:
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/MessageOptimizer.java
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/MessageOptimizer.java?view=diff&rev=558920&r1=558919&r2=558920
==============================================================================
---
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/MessageOptimizer.java
(original)
+++
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/MessageOptimizer.java
Mon Jul 23 20:24:03 2007
@@ -20,6 +20,7 @@
import org.apache.axiom.om.OMText;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.rampart.RampartException;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSSecurityException;
import org.jaxen.JaxenException;
@@ -28,12 +29,64 @@
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.StringTokenizer;
+import java.util.Vector;
/**
* Utility class to handle MTOM-Optimizing Base64 Text values
*/
public class MessageOptimizer {
+
+ private static final String CIPHER_ELEMENT =
"//xenc:EncryptedData/xenc:CipherData/xenc:CipherValue";
+
+ public static void optimize(SOAPEnvelope env, Vector expressions, Map
namespaces) throws RampartException {
+
+ SimpleNamespaceContext nsCtx = new SimpleNamespaceContext();
+ nsCtx.addNamespace(WSConstants.ENC_PREFIX,WSConstants.ENC_NS);
+ nsCtx.addNamespace(WSConstants.SIG_PREFIX,WSConstants.SIG_NS);
+ nsCtx.addNamespace(WSConstants.WSSE_PREFIX,WSConstants.WSSE_NS);
+ nsCtx.addNamespace(WSConstants.WSU_PREFIX,WSConstants.WSU_NS);
+
+ Iterator keys = namespaces.keySet().iterator();
+ while(keys.hasNext()){
+ String strPrefix = (String)keys.next();
+ String strNS = (String)namespaces.get(strPrefix);
+ nsCtx.addNamespace(strPrefix,strNS);
+ }
+
+ try {
+ if(expressions.size() > 0){
+ for(int i=0; i<expressions.size(); i++){
+ String exp = (String)expressions.get(i);
+ XPath xp = new AXIOMXPath(exp);
+ xp.setNamespaceContext(nsCtx);
+ List list = xp.selectNodes(env);
+ Iterator elements = list.iterator();
+ while (elements.hasNext()) {
+ OMElement element = (OMElement)
elements.next();
+ OMText text =
(OMText)element.getFirstOMChild();
+ text.setOptimize(true);
+ }
+ }
+ }else{
+ String exp = CIPHER_ELEMENT;
+ XPath xp = new AXIOMXPath(exp);
+ xp.setNamespaceContext(nsCtx);
+ List list = xp.selectNodes(env);
+ Iterator elements = list.iterator();
+ while (elements.hasNext()) {
+ OMElement element = (OMElement)
elements.next();
+ OMText text =
(OMText)element.getFirstOMChild();
+ text.setOptimize(true);
+ }
+ }
+ } catch (JaxenException e) {
+ throw new RampartException("Error in XPath ", e);
+ }
+
+ }
+
/**
* Mark the requied Base64 text values as optimized
@@ -45,47 +98,47 @@
public static void optimize(SOAPEnvelope env, String optimizeParts)
throws WSSecurityException {
String separater = "<>";
StringTokenizer tokenizer = new StringTokenizer(optimizeParts,
separater);
-
+
while(tokenizer.hasMoreTokens()) {
-
+
String xpathExpr = tokenizer.nextToken();
-
+
//Find binary content
List list = findElements(env,xpathExpr);
-
+
Iterator cipherValueElements = list.iterator();
-
+
while (cipherValueElements.hasNext()) {
OMElement element = (OMElement)
cipherValueElements.next();
OMText text = (OMText)element.getFirstOMChild();
- System.out.println(text.getText().length());
+ System.out.println(text.getText().length());
text.setOptimize(true);
}
}
}
-
-
+
+
private static List findElements(OMElement elem, String expression)
throws WSSecurityException {
try {
XPath xp = new AXIOMXPath(expression);
-
+
//Set namespaces
SimpleNamespaceContext nsCtx = new
SimpleNamespaceContext();
nsCtx.addNamespace(WSConstants.ENC_PREFIX,WSConstants.ENC_NS);
nsCtx.addNamespace(WSConstants.SIG_PREFIX,WSConstants.SIG_NS);
nsCtx.addNamespace(WSConstants.WSSE_PREFIX,WSConstants.WSSE_NS);
nsCtx.addNamespace(WSConstants.WSU_PREFIX,WSConstants.WSU_NS);
-
+
xp.setNamespaceContext(nsCtx);
-
+
return xp.selectNodes(elem);
-
+
} catch (JaxenException e) {
throw new WSSecurityException(e.getMessage(), e);
}
-
+
}
-
-
-
+
+
+
}