<?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>TokenCancelerConfig.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.rahas.impl</a> &gt; <span class="el_source">TokenCancelerConfig.java</span></div><h1>TokenCancelerConfig.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.rahas.impl;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.rahas.TrustException;

import javax.xml.namespace.QName;
import java.io.FileInputStream;

/**
 * 
 */
public class TokenCancelerConfig {

   /*
   &lt;parameter name=&quot;token-canceler-config&quot;&gt;
		&lt;token-canceler-config&gt;
			&lt;proofToken&gt;EncryptedKey&lt;/proofToken&gt;
			&lt;cryptoProperties&gt;sctIssuer.properties&lt;/cryptoProperties&gt;
			&lt;addRequestedAttachedRef /&gt;
		&lt;/stoken-canceler-config&gt;
    &lt;/parameter&gt;
    */
<span class="fc" id="L39">    public final static QName TOKEN_CANCELER_CONFIG = new QName(&quot;token-canceler-config&quot;);</span>

<span class="fc" id="L41">    private TokenCancelerConfig(OMElement elem) throws TrustException {</span>
        /*OMElement proofTokenElem =
                elem.getFirstChildWithName(new QName(&quot;proofToken&quot;));
        if (proofTokenElem != null) {
            this.proofTokenType = proofTokenElem.getText().trim();
        }

        OMElement cryptoPropertiesElem = elem
                .getFirstChildWithName(new QName(&quot;cryptoProperties&quot;));

        if (!SCTIssuer.BINARY_SECRET.equals(proofTokenType)
            &amp;&amp; cryptoPropertiesElem == null) {
            throw new TrustException(&quot;sctIssuerCryptoPropertiesMissing&quot;);
        }

        this.addRequestedAttachedRef = elem
                .getFirstChildWithName(ADD_REQUESTED_ATTACHED_REF) != null;
        this.addRequestedUnattachedRef = elem
                .getFirstChildWithName(ADD_REQUESTED_UNATTACHED_REF) != null;

        this.cryptoPropertiesFile = cryptoPropertiesElem.getText().trim();*/
<span class="fc" id="L62">    }</span>

    public static TokenCancelerConfig load(OMElement elem) throws TrustException {
<span class="fc" id="L65">        return new TokenCancelerConfig(elem);</span>
    }

    public static TokenCancelerConfig load(String configFilePath)
            throws TrustException {
        FileInputStream fis;
        StAXOMBuilder builder;
        try {
<span class="nc" id="L73">            fis = new FileInputStream(configFilePath);</span>
<span class="nc" id="L74">            builder = new StAXOMBuilder(fis);</span>
<span class="nc" id="L75">        } catch (Exception e) {</span>
<span class="nc" id="L76">            throw new TrustException(&quot;errorLoadingConfigFile&quot;, new String[] { configFilePath });</span>
<span class="nc" id="L77">        }</span>
<span class="nc" id="L78">        return load(builder.getDocumentElement());</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>