<?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="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>DefaultCryptoService.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Crypto</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.crypto</a> &gt; <span class="el_source">DefaultCryptoService.java</span></div><h1>DefaultCryptoService.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.crypto;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import java.security.NoSuchAlgorithmException;
import java.util.HashMap;

import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.thread.ThreadSafe;

/**
 * An implementation of CryptoService that uses either supplied crypto
 * Algorithms (provided in the component config xml file) or tries to get them
 * via the normal java mechanisms if this fails.
 *
 * avalon.component name=&quot;crypto&quot; lifestyle=&quot;singleton&quot; avalon.service
 * type=&quot;org.apache.fulcrum.crypto.CryptoService&quot;
 *
 *
 * @author &lt;a href=&quot;mailto:epugh@upstate.com&quot;&gt;Eric Pugh&lt;/a&gt;
 * @author &lt;a href=&quot;mailto:hps@intermeta.de&quot;&gt;Henning P. Schmiedehausen&lt;/a&gt;
 * @version $Id$
 */
<span class="fc" id="L45">public class DefaultCryptoService extends AbstractLogEnabled</span>
		implements CryptoService, Configurable, Initializable, ThreadSafe {

	
	/** Key Prefix for our algorithms */
	private static final String ALGORITHM = &quot;algorithm&quot;;

	/** Default Key */
	private static final String DEFAULT_KEY = &quot;default&quot;;

	/** Default Encryption Class */
	private static final String DEFAULT_CLASS = &quot;org.apache.fulcrum.crypto.provider.JavaCrypt&quot;;

	/** Names of the registered algorithms and the wanted classes */
<span class="fc" id="L59">	private HashMap&lt;String, String&gt; algos = new HashMap&lt;&gt;();</span>

	/**
	 * Returns a CryptoAlgorithm Object which represents the requested crypto
	 * algorithm.
	 *
	 * @see org.apache.fulcrum.crypto.CryptoService#getCryptoAlgorithm(java.lang.String)
	 *
	 * @param algo Name of the requested algorithm
	 *
	 * @return An Object representing the algorithm
	 *
	 * @throws NoSuchAlgorithmException Requested algorithm is not available
	 *
	 */
	public CryptoAlgorithm getCryptoAlgorithm(String algo) throws NoSuchAlgorithmException 
	{
<span class="fc" id="L76">		String cryptoClass = (String) algos.get(algo);</span>
<span class="fc" id="L77">		CryptoAlgorithm ca = null;</span>
<span class="pc bpc" id="L78" title="1 of 2 branches missed.">		if (cryptoClass == null) {</span>
<span class="nc" id="L79">			cryptoClass = (String) algos.get(DEFAULT_KEY);</span>
		}
<span class="pc bpc" id="L81" title="2 of 4 branches missed.">		if (cryptoClass == null || cryptoClass.equalsIgnoreCase(&quot;none&quot;)) {</span>
<span class="nc" id="L82">			throw new NoSuchAlgorithmException(&quot;TurbineCryptoService: No Algorithm for &quot; + algo + &quot; found&quot;);</span>
		}
		try {
<span class="fc" id="L85">			ca = (CryptoAlgorithm) Class.forName(cryptoClass).newInstance();</span>
<span class="nc" id="L86">		} catch (Exception e) {</span>
<span class="nc" id="L87">			throw new NoSuchAlgorithmException(</span>
					&quot;TurbineCryptoService: Error instantiating &quot; + cryptoClass + &quot; for &quot; + algo);
<span class="fc" id="L89">		}</span>
<span class="fc" id="L90">		ca.setCipher(algo);</span>
<span class="fc" id="L91">		return ca;</span>
	}


	// ---------------- Avalon Lifecycle Methods ---------------------

	/**
	 * Avalon component lifecycle method
	 * 
	 * @param conf the configuration
	 * @throws ConfigurationException if not found
	 */
	public void configure(Configuration conf) throws ConfigurationException 
	{
		// Initialize the hash and setup default
		// Can be overriden by default key from properties
<span class="fc" id="L107">		this.algos = new HashMap&lt;&gt;();</span>
<span class="fc" id="L108">		this.algos.put(DEFAULT_KEY, DEFAULT_CLASS);</span>
		
<span class="fc" id="L110">		final Configuration algorithms = conf.getChild(ALGORITHM, false);</span>
<span class="pc bpc" id="L111" title="1 of 2 branches missed.">		if (algorithms != null) {</span>
<span class="fc" id="L112">			Configuration[] nameVal = algorithms.getChildren();</span>
<span class="fc bfc" id="L113" title="All 2 branches covered.">			for ( Configuration entry : nameVal )</span>
			{
<span class="fc" id="L115">				algos.put(entry.getName(), entry.getValue());</span>
			}
		}
<span class="fc" id="L118">	}</span>
	
	/**
	 * Initialize the service
	 * 
	 * @see org.apache.avalon.framework.activity.Initializable#initialize()
	 * 
	 * @throws Exception if initialization fails
	 */
	public void initialize() throws Exception 
	{
<span class="fc" id="L129">		getLogger().debug(&quot;initialize()&quot;);</span>
<span class="fc" id="L130">	}</span>

	/**
	 * Avalon component lifecycle method
	 */
	public void dispose() 
	{
<span class="nc" id="L137">		algos = null;</span>
<span class="nc" id="L138">	}</span>

}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.7.202105040129</span></div></body></html>