<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../.resources/report.css" type="text/css"/><link rel="shortcut icon" href="../.resources/report.gif" type="image/gif"/><title>RampartConfig.java</title><link rel="stylesheet" href="../.resources/prettify.css" type="text/css"/><script type="text/javascript" src="../.resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="right"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.html" class="el_package">org.apache.rampart.policy.model</a> &gt; <span class="el_source">RampartConfig.java</span></div><h1>RampartConfig.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * 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 &quot;AS IS&quot; 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 org.apache.neethi.Assertion;
import org.apache.neethi.Constants;
import org.apache.neethi.PolicyComponent;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

/**
 * Rampart policy model bean to capture Rampart configuration assertion info.
 * 
 * Example:
 * 
 * &lt;pre&gt;
 *  &amp;lt;ramp:RampartConfig xmlns:ramp=&amp;quot;http://ws.apache.org/rampart/policy&amp;quot;&amp;gt; 
 *  &amp;lt;ramp:user&amp;gt;alice&amp;lt;/ramp:user&amp;gt;
 *  &amp;lt;ramp:encryptionUser&amp;gt;bob&amp;lt;/ramp:encryptionUser&amp;gt;
 *  &amp;lt;ramp:passwordCallbackClass&amp;gt;org.apache.axis2.security.PWCallback&amp;lt;/ramp:passwordCallbackClass&amp;gt;
 *  &amp;lt;ramp:policyValidatorCbClass&amp;gt;org.apache.axis2.security.ramp:PolicyValidatorCallbackHandler&amp;lt;/ramp:policyValidatorCbClass&amp;gt;
 *  &amp;lt;ramp:timestampPrecisionInMilliseconds&amp;gt;true&amp;lt;/timestampPrecisionInMilliseconds&amp;gt;
 *  &amp;lt;ramp:timestampTTL&amp;gt;300&amp;lt;/ramp:timestampTTL&amp;gt;
 *  &amp;lt;ramp:timestampMaxSkew&amp;gt;0&amp;lt;/ramp:timestampMaxSkew&amp;gt;
 *  &amp;lt;ramp:tokenStoreClass&amp;gt;org.apache.rahas.StorageImpl&amp;lt;/ramp:tokenStoreClass&amp;gt;
 *  &amp;lt;ramp:nonceLifeTime&amp;gt;org.apache.rahas.StorageImpl&amp;lt;/ramp:nonceLifeTime&amp;gt;
 *  
 *  &amp;lt;ramp:signatureCrypto&amp;gt;
 *  &amp;lt;ramp:crypto provider=&amp;quot;org.apache.ws.security.components.crypto.Merlin&amp;quot;&amp;gt;
 *  &amp;lt;ramp:property name=&amp;quot;keystoreType&amp;quot;&amp;gt;JKS&amp;lt;/ramp:property&amp;gt;
 *  &amp;lt;ramp:property name=&amp;quot;keystoreFile&amp;quot;&amp;gt;/path/to/file.jks&amp;lt;/ramp:property&amp;gt;
 *  &amp;lt;ramp:property name=&amp;quot;keystorePassword&amp;quot;&amp;gt;password&amp;lt;/ramp:property&amp;gt;
 *  &amp;lt;/ramp:crypto&amp;gt;
 *  &amp;lt;/ramp:signatureCrypto&amp;gt;
 *  
 *  &amp;lt;ramp:tokenIssuerPolicy&amp;gt;
 *  &amp;lt;wsp:Policy&amp;gt;
 *  ....
 *  ....
 *  &amp;lt;/wsp:Policy&amp;gt;
 *  &amp;lt;/ramp:tokenIssuerPolicy&amp;gt;
 *  &amp;lt;/ramp:RampartConfig&amp;gt;
 * 
 * &lt;/pre&gt;
 * 
 */
<span class="fc" id="L63">public class RampartConfig implements Assertion {</span>
    
    public static final boolean DEFAULT_TIMESTAMP_PRECISION_IN_MS = true;
	
    public static final int DEFAULT_TIMESTAMP_TTL = 300;

    public static final int DEFAULT_TIMESTAMP_MAX_SKEW = 300;

    public static final int DEFAULT_NONCE_LIFE_TIME = 60 * 5; // Default life time of a nonce is 5 minutes

    public final static String NS = &quot;http://ws.apache.org/rampart/policy&quot;;

    public final static String PREFIX = &quot;rampart&quot;;

    public final static String RAMPART_CONFIG_LN = &quot;RampartConfig&quot;;

    public final static String USER_LN = &quot;user&quot;;
    
    public final static String USER_CERT_ALIAS_LN = &quot;userCertAlias&quot;;

    public final static String ENCRYPTION_USER_LN = &quot;encryptionUser&quot;;
    
    public final static String STS_ALIAS_LN = &quot;stsAlias&quot;;

    public final static String PW_CB_CLASS_LN = &quot;passwordCallbackClass&quot;;
    
    public final static String POLICY_VALIDATOR_CB_CLASS_LN = &quot;policyValidatorCbClass&quot;;
    
    public final static String RAMPART_CONFIG_CB_CLASS_LN = &quot;rampartConfigCallbackClass&quot;;

    public final static String SIG_CRYPTO_LN = &quot;signatureCrypto&quot;;

    public final static String ENCR_CRYPTO_LN = &quot;encryptionCrypto&quot;;

    public final static String DEC_CRYPTO_LN = &quot;decryptionCrypto&quot;;
    
    public final static String STS_CRYPTO_LN = &quot;stsCrypto&quot;;

    public final static String TS_PRECISION_IN_MS_LN = &quot;timestampPrecisionInMilliseconds&quot;;
    
    public final static String TS_TTL_LN = &quot;timestampTTL&quot;;

    public final static String TS_MAX_SKEW_LN = &quot;timestampMaxSkew&quot;;

    public final static String TOKEN_STORE_CLASS_LN = &quot;tokenStoreClass&quot;;

    public final static String TIMESTAMP_STRICT_LN = &quot;timestampStrict&quot;;

    public final static String NONCE_LIFE_TIME = &quot;nonceLifeTime&quot;;
    
    public final static String OPTIMISE_PARTS = &quot;optimizeParts&quot;;

    public final static String SSL_CONFIG = &quot;sslConfig&quot;;
    
    private String user;
    
    private String userCertAlias;

    private String encryptionUser;
    
    private String stsAlias;

    private String pwCbClass;
    
    private String policyValidatorCbClass;
    
    private String rampartConfigCbClass;

    private CryptoConfig sigCryptoConfig;

    private CryptoConfig encrCryptoConfig;

    private CryptoConfig decCryptoConfig;
    
    private CryptoConfig stsCryptoConfig;

<span class="fc" id="L139">    private String timestampPrecisionInMilliseconds = Boolean.toString(DEFAULT_TIMESTAMP_PRECISION_IN_MS);</span>
<span class="fc" id="L140">    private boolean isTimestampPrecisionInMs = DEFAULT_TIMESTAMP_PRECISION_IN_MS;</span>
    
<span class="fc" id="L142">    private String timestampTTL = Integer.toString(DEFAULT_TIMESTAMP_TTL);</span>
    
<span class="fc" id="L144">    private String timestampMaxSkew = Integer.toString(DEFAULT_TIMESTAMP_MAX_SKEW);</span>

    private OptimizePartsConfig optimizeParts;

    private String tokenStoreClass;

<span class="fc" id="L150">    private String nonceLifeTime = Integer.toString(DEFAULT_NONCE_LIFE_TIME);</span>
    
    private SSLConfig sslConfig;

    /*To set timeStampStrict in WSSConfig through rampartConfig - default value is false*/
<span class="fc" id="L155">    private boolean timeStampStrict = false;</span>
    
    public SSLConfig getSSLConfig() {
<span class="fc" id="L158">        return sslConfig;</span>
    }

    public void setSSLConfig(SSLConfig sslConfig) {
<span class="fc" id="L162">        this.sslConfig = sslConfig;</span>
<span class="fc" id="L163">    }</span>
    

    /**
     * @return Returns the tokenStoreClass.
     */
    public String getTokenStoreClass() {
<span class="fc" id="L170">        return tokenStoreClass;</span>
    }

    /**
     * @param tokenStoreClass
     *            The tokenStoreClass to set.
     */
    public void setTokenStoreClass(String tokenStoreClass) {
<span class="nc" id="L178">        this.tokenStoreClass = tokenStoreClass;</span>
<span class="nc" id="L179">    }</span>

    /**
     * @return Returns the life time of a nonce in seconds.
     */
    public String getNonceLifeTime() {
<span class="nc" id="L185">        return this.nonceLifeTime;</span>
    }

    /**
     * @param nonceLife
     *            The life time of a nonce to set (in seconds).
     */
    public void setNonceLifeTime(String nonceLife) {
<span class="nc" id="L193">        this.nonceLifeTime = nonceLife;</span>
<span class="nc" id="L194">    }</span>

    public CryptoConfig getDecCryptoConfig() {
<span class="fc" id="L197">        return decCryptoConfig;</span>
    }

    public void setDecCryptoConfig(CryptoConfig decCrypto) {
<span class="fc" id="L201">        this.decCryptoConfig = decCrypto;</span>
<span class="fc" id="L202">    }</span>

    public CryptoConfig getEncrCryptoConfig() {
<span class="fc" id="L205">        return encrCryptoConfig;</span>
    }

    public void setEncrCryptoConfig(CryptoConfig encrCrypto) {
<span class="fc" id="L209">        this.encrCryptoConfig = encrCrypto;</span>
<span class="fc" id="L210">    }</span>

    public String getEncryptionUser() {
<span class="fc" id="L213">        return encryptionUser;</span>
    }

    public void setEncryptionUser(String encryptionUser) {
<span class="fc" id="L217">        this.encryptionUser = encryptionUser;</span>
<span class="fc" id="L218">    }</span>

    public String getPwCbClass() {
<span class="fc" id="L221">        return pwCbClass;</span>
    }

    public void setPwCbClass(String pwCbClass) {
<span class="fc" id="L225">        this.pwCbClass = pwCbClass;</span>
<span class="fc" id="L226">    }</span>
    
    public String getPolicyValidatorCbClass() {
<span class="fc" id="L229">        return this.policyValidatorCbClass;</span>
    }
    
    public void setPolicyValidatorCbClass(String policyValidatorCbClass) {
<span class="nc" id="L233">        this.policyValidatorCbClass = policyValidatorCbClass;</span>
<span class="nc" id="L234">    }</span>

    public String getRampartConfigCbClass() {
<span class="fc" id="L237">        return rampartConfigCbClass;</span>
    }

    public void setRampartConfigCbClass(String rampartConfigCbClass) {
<span class="fc" id="L241">        this.rampartConfigCbClass = rampartConfigCbClass;</span>
<span class="fc" id="L242">    }</span>

    public CryptoConfig getSigCryptoConfig() {
<span class="fc" id="L245">        return sigCryptoConfig;</span>
    }

    public void setSigCryptoConfig(CryptoConfig sigCryptoConfig) {
<span class="fc" id="L249">        this.sigCryptoConfig = sigCryptoConfig;</span>
<span class="fc" id="L250">    }</span>

    public String getUser() {
<span class="fc" id="L253">        return user;</span>
    }

    public void setUser(String user) {
<span class="fc" id="L257">        this.user = user;</span>
<span class="fc" id="L258">    }</span>
    
    public String getUserCertAlias() {
<span class="fc" id="L261">        return userCertAlias;</span>
    }
    
    public void setUserCertAlias(String userCertAlias) {
<span class="fc" id="L265">        this.userCertAlias = userCertAlias;</span>
<span class="fc" id="L266">    }</span>

    public QName getName() {
<span class="fc" id="L269">        return new QName(NS, RAMPART_CONFIG_LN);</span>
    }

    public boolean isOptional() {
        // TODO TODO
<span class="nc" id="L274">        throw new UnsupportedOperationException(&quot;TODO&quot;);</span>
    }
    public boolean isIgnorable() {
<span class="nc" id="L277">        throw new UnsupportedOperationException(&quot;TODO&quot;);</span>
    }

    public PolicyComponent normalize() {
        // TODO TODO
<span class="nc" id="L282">        throw new UnsupportedOperationException(&quot;TODO&quot;);</span>
    }

    public void serialize(XMLStreamWriter writer) throws XMLStreamException {
<span class="nc" id="L286">        String prefix = writer.getPrefix(NS);</span>

<span class="nc bnc" id="L288" title="All 2 branches missed.">        if (prefix == null) {</span>
<span class="nc" id="L289">            prefix = PREFIX;</span>
<span class="nc" id="L290">            writer.setPrefix(PREFIX, NS);</span>
        }

<span class="nc" id="L293">        writer.writeStartElement(PREFIX, RAMPART_CONFIG_LN, NS);</span>
<span class="nc" id="L294">        writer.writeNamespace(prefix, NS);</span>

<span class="nc bnc" id="L296" title="All 2 branches missed.">        if (getUser() != null) {</span>
<span class="nc" id="L297">            writer.writeStartElement(NS, USER_LN);</span>
<span class="nc" id="L298">            writer.writeCharacters(getUser());</span>
<span class="nc" id="L299">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L302" title="All 2 branches missed.">        if (getUserCertAlias() != null) {</span>
<span class="nc" id="L303">            writer.writeStartElement(NS, USER_CERT_ALIAS_LN);</span>
<span class="nc" id="L304">            writer.writeCharacters(getUserCertAlias());</span>
<span class="nc" id="L305">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L308" title="All 2 branches missed.">        if (getEncryptionUser() != null) {</span>
<span class="nc" id="L309">            writer.writeStartElement(NS, ENCRYPTION_USER_LN);</span>
<span class="nc" id="L310">            writer.writeCharacters(getEncryptionUser());</span>
<span class="nc" id="L311">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L314" title="All 2 branches missed.">        if (getStsAlias() != null ) {</span>
<span class="nc" id="L315">            writer.writeStartElement(NS, STS_ALIAS_LN);</span>
<span class="nc" id="L316">            writer.writeCharacters(getStsAlias());</span>
<span class="nc" id="L317">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L320" title="All 2 branches missed.">        if (getPwCbClass() != null) {</span>
<span class="nc" id="L321">            writer.writeStartElement(NS, PW_CB_CLASS_LN);</span>
<span class="nc" id="L322">            writer.writeCharacters(getPwCbClass());</span>
<span class="nc" id="L323">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L326" title="All 2 branches missed.">        if (getPolicyValidatorCbClass() != null) {</span>
<span class="nc" id="L327">            writer.writeStartElement(NS, POLICY_VALIDATOR_CB_CLASS_LN);</span>
<span class="nc" id="L328">            writer.writeCharacters(getPolicyValidatorCbClass());</span>
<span class="nc" id="L329">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L332" title="All 2 branches missed.">        if (getRampartConfigCbClass() != null) {</span>
<span class="nc" id="L333">            writer.writeStartElement(NS, RAMPART_CONFIG_CB_CLASS_LN);</span>
<span class="nc" id="L334">            writer.writeCharacters(getRampartConfigCbClass());</span>
<span class="nc" id="L335">            writer.writeEndElement();</span>
        }

<span class="nc" id="L338">        writer.writeStartElement(NS, TS_PRECISION_IN_MS_LN);</span>
<span class="nc" id="L339">        writer.writeCharacters(Boolean.toString(isDefaultTimestampPrecisionInMs()));</span>
<span class="nc" id="L340">        writer.writeEndElement();</span>

<span class="nc bnc" id="L342" title="All 2 branches missed.">        if (getTimestampTTL() != null) {</span>
<span class="nc" id="L343">            writer.writeStartElement(NS, TS_TTL_LN);</span>
<span class="nc" id="L344">            writer.writeCharacters(getTimestampTTL());</span>
<span class="nc" id="L345">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L348" title="All 2 branches missed.">        if (getTimestampMaxSkew() != null) {</span>
<span class="nc" id="L349">            writer.writeStartElement(NS, TS_MAX_SKEW_LN);</span>
<span class="nc" id="L350">            writer.writeCharacters(getTimestampMaxSkew());</span>
<span class="nc" id="L351">            writer.writeEndElement();</span>
        }

<span class="nc" id="L354">        writer.writeStartElement(NS, TIMESTAMP_STRICT_LN);</span>
<span class="nc" id="L355">        writer.writeCharacters(Boolean.toString(isTimeStampStrict()));</span>
<span class="nc" id="L356">        writer.writeEndElement();</span>

<span class="nc bnc" id="L358" title="All 2 branches missed.">        if (getTokenStoreClass() != null) {</span>
<span class="nc" id="L359">            writer.writeStartElement(NS, TOKEN_STORE_CLASS_LN);</span>
<span class="nc" id="L360">            writer.writeCharacters(getTokenStoreClass());</span>
<span class="nc" id="L361">            writer.writeEndElement();</span>
        }

<span class="nc bnc" id="L364" title="All 2 branches missed.">        if (getNonceLifeTime() != null) {</span>
<span class="nc" id="L365">            writer.writeStartElement(NS, NONCE_LIFE_TIME);</span>
<span class="nc" id="L366">            writer.writeCharacters(getNonceLifeTime());</span>
<span class="nc" id="L367">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L370" title="All 2 branches missed.">        if (encrCryptoConfig != null) {</span>
<span class="nc" id="L371">            writer.writeStartElement(NS, ENCR_CRYPTO_LN);</span>
<span class="nc" id="L372">            encrCryptoConfig.serialize(writer);</span>
<span class="nc" id="L373">            writer.writeEndElement();</span>
            
        }
        
<span class="nc bnc" id="L377" title="All 2 branches missed.">        if (decCryptoConfig != null) {</span>
<span class="nc" id="L378">            writer.writeStartElement(NS, DEC_CRYPTO_LN);</span>
<span class="nc" id="L379">            decCryptoConfig.serialize(writer);</span>
<span class="nc" id="L380">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L383" title="All 2 branches missed.">        if(stsCryptoConfig != null) {</span>
<span class="nc" id="L384">            writer.writeStartElement(NS, STS_CRYPTO_LN);</span>
<span class="nc" id="L385">            stsCryptoConfig.serialize(writer);</span>
<span class="nc" id="L386">            writer.writeEndElement();</span>
        }
        
<span class="nc bnc" id="L389" title="All 2 branches missed.">        if (sigCryptoConfig != null) {</span>
<span class="nc" id="L390">            writer.writeStartElement(NS, SIG_CRYPTO_LN);</span>
<span class="nc" id="L391">            sigCryptoConfig.serialize(writer);</span>
<span class="nc" id="L392">            writer.writeEndElement();</span>
        }
        
<span class="nc" id="L395">        writer.writeEndElement();</span>

<span class="nc" id="L397">    }</span>

    public boolean equal(PolicyComponent policyComponent) {
<span class="nc" id="L400">        throw new UnsupportedOperationException(&quot;TODO&quot;);</span>
    }

    public short getType() {
<span class="fc" id="L404">        return Constants.TYPE_ASSERTION;</span>
    }

    /**
     * @deprecated  As of version 1.7.0, replaced by isDefaultTimestampPrecisionInMs
     * @see #isDefaultTimestampPrecisionInMs()
     * @return Returns &quot;true&quot; or &quot;false&quot;.
     */
    @Deprecated
    public String getTimestampPrecisionInMilliseconds() {
<span class="nc" id="L414">    	return timestampPrecisionInMilliseconds;</span>
    }

    public boolean isDefaultTimestampPrecisionInMs() {
<span class="fc" id="L418">    	return this.isTimestampPrecisionInMs;</span>
    }
    
    public void setTimestampPrecisionInMilliseconds(String timestampPrecisionInMilliseconds) {

<span class="nc bnc" id="L423" title="All 2 branches missed.">        if (timestampPrecisionInMilliseconds != null) {</span>
<span class="nc" id="L424">            this.timestampPrecisionInMilliseconds = timestampPrecisionInMilliseconds;</span>
<span class="nc" id="L425">            this.isTimestampPrecisionInMs = Boolean.valueOf(timestampPrecisionInMilliseconds);</span>
        }
<span class="nc" id="L427">    }</span>
    
    /**
     * @return Returns the timestampTTL.
     */
    public String getTimestampTTL() {
<span class="fc" id="L433">        return timestampTTL;</span>
    }

    /**
     * @param timestampTTL
     *            The timestampTTL to set.
     */
    public void setTimestampTTL(String timestampTTL) {
<span class="nc" id="L441">        this.timestampTTL = timestampTTL;</span>
<span class="nc" id="L442">    }</span>
    
    /**
     * @return Returns the timestampMaxSkew.
     */
    public String getTimestampMaxSkew() {
<span class="fc" id="L448">        return timestampMaxSkew;</span>
    }

    /**
     * @param timestampMaxSkew
     *            The timestampMaxSkew to set.
     */
    public void setTimestampMaxSkew(String timestampMaxSkew) {
<span class="nc" id="L456">        this.timestampMaxSkew = timestampMaxSkew;</span>
<span class="nc" id="L457">    }</span>

    public OptimizePartsConfig getOptimizeParts() {
<span class="nc" id="L460">        return optimizeParts;</span>
    }

    public void setOptimizeParts(OptimizePartsConfig optimizeParts) {
<span class="nc" id="L464">        this.optimizeParts = optimizeParts;</span>
<span class="nc" id="L465">    }</span>

    public String getStsAlias() {
<span class="fc" id="L468">        return stsAlias;</span>
    }

    public void setStsAlias(String stsAlias) {
<span class="fc" id="L472">        this.stsAlias = stsAlias;</span>
<span class="fc" id="L473">    }</span>

    public CryptoConfig getStsCryptoConfig() {
<span class="fc" id="L476">        return stsCryptoConfig;</span>
    }

    public void setStsCryptoConfig(CryptoConfig stsCryptoConfig) {
<span class="fc" id="L480">        this.stsCryptoConfig = stsCryptoConfig;</span>
<span class="fc" id="L481">    }</span>

    public boolean isTimeStampStrict() {
<span class="fc" id="L484">        return timeStampStrict;</span>
    }

    public void setTimeStampStrict(String timeStampStrict) {
<span class="nc" id="L488">        this.timeStampStrict = Boolean.valueOf(timeStampStrict);</span>
<span class="nc" id="L489">    }</span>
    
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.6.1.201212231917</span></div></body></html>