<?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="info"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.source.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.7.5.201505241946</span></div></body></html>