<?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>SCTIssuerConfig.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">SCTIssuerConfig.java</span></div><h1>SCTIssuerConfig.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;

/**
 * SCTIssuer Configuration processor
 */
public class SCTIssuerConfig extends AbstractIssuerConfig{

<span class="fc" id="L32">    public final static QName SCT_ISSUER_CONFIG = new QName(&quot;sct-issuer-config&quot;);</span>
    protected byte[] requesterEntropy;

<span class="fc" id="L35">    private SCTIssuerConfig(OMElement elem) throws TrustException {</span>
<span class="fc" id="L36">        OMElement proofKeyElem = elem.getFirstChildWithName(PROOF_KEY_TYPE);</span>
<span class="pc bpc" id="L37" title="1 of 2 branches missed.">        if (proofKeyElem != null) {</span>
<span class="fc" id="L38">            this.proofKeyType = proofKeyElem.getText().trim();</span>
        }

<span class="fc" id="L41">        OMElement cryptoPropertiesElem = elem</span>
                .getFirstChildWithName(new QName(&quot;cryptoProperties&quot;));

<span class="pc bpc" id="L44" title="3 of 4 branches missed.">        if (!TokenIssuerUtil.BINARY_SECRET.equals(proofKeyType) &amp;&amp; cryptoPropertiesElem == null) {</span>
<span class="nc" id="L45">            throw new TrustException(&quot;sctIssuerCryptoPropertiesMissing&quot;);</span>
        }

<span class="pc bpc" id="L48" title="1 of 2 branches missed.">        this.addRequestedAttachedRef =</span>
                elem.getFirstChildWithName(ADD_REQUESTED_ATTACHED_REF) != null;
<span class="pc bpc" id="L50" title="1 of 2 branches missed.">        this.addRequestedUnattachedRef =</span>
                elem.getFirstChildWithName(ADD_REQUESTED_UNATTACHED_REF) != null;
<span class="pc bpc" id="L52" title="1 of 2 branches missed.">        if ((cryptoElement =</span>
                cryptoPropertiesElem.getFirstChildWithName(CRYPTO)) == null) { // no children. Hence, prop file should have been defined
<span class="nc" id="L54">            this.cryptoPropertiesFile = cryptoPropertiesElem.getText().trim();</span>
        }
        // else Props should be defined as children of a crypto element
        
<span class="fc" id="L58">        OMElement keyCompElem = elem.getFirstChildWithName(KeyComputation.KEY_COMPUTATION);</span>
<span class="pc bpc" id="L59" title="3 of 6 branches missed.">        if (keyCompElem != null &amp;&amp; keyCompElem.getText() != null &amp;&amp; !&quot;&quot;.equals(keyCompElem.getText())) {</span>
<span class="fc" id="L60">            this.keyComputation = Integer.parseInt(keyCompElem.getText());</span>
        }
<span class="fc" id="L62">    }</span>

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

    public static SCTIssuerConfig 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;,</span>
                    new String[] { configFilePath });
<span class="nc" id="L78">        }</span>

<span class="nc" id="L80">        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>