blob: 16c635b262ecfff57726b06926f21ad5c1a6bf86 [file] [log] [blame]
<?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>TokenRequestDispatcherConfig.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</a> &gt; <span class="el_source">TokenRequestDispatcherConfig.java</span></div><h1>TokenRequestDispatcherConfig.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;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.ws.security.util.Loader;
import javax.xml.namespace.QName;
import java.io.FileInputStream;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
<span class="fc" id="L29">public class TokenRequestDispatcherConfig {</span>
public final static String CONFIG_PARAM_KEY = &quot;token-dispatcher-configuration&quot;;
public final static String CONFIG_FILE_KEY = &quot;token-dispatcher-configuration-file&quot;;
<span class="fc" id="L34"> private final static QName DISPATCHER_CONFIG = new QName(&quot;token-dispatcher-configuration&quot;);</span>
<span class="fc" id="L35"> private final static QName ISSUER = new QName(&quot;issuer&quot;);</span>
<span class="fc" id="L36"> private final static QName CANCELER = new QName(&quot;canceler&quot;);</span>
<span class="fc" id="L37"> private final static QName VALIDATOR = new QName(&quot;validator&quot;);</span>
<span class="fc" id="L38"> private final static QName RENEWER = new QName(&quot;renewer&quot;);</span>
<span class="fc" id="L39"> private final static QName TOKEN_TYPE = new QName(&quot;tokenType&quot;);</span>
<span class="fc" id="L40"> private final static QName CLASS_ATTR = new QName(&quot;class&quot;);</span>
<span class="fc" id="L41"> private final static QName DEFAULT_ATTR = new QName(&quot;default&quot;);</span>
<span class="fc" id="L42"> private final static QName CONFIGURATION_ELEMENT = new QName(&quot;configuration&quot;);</span>
private Map issuers;
private Map validators;
private Map renewers;
<span class="fc" id="L47"> private Map configFiles = new Hashtable();</span>
<span class="fc" id="L48"> private Map configElements = new Hashtable();</span>
<span class="fc" id="L49"> private Map configParamNames = new Hashtable();</span>
private String defaultIssuerClassName;
private String defaultCancelerClassName;
private String defaultValidatorClassName;
private String defaultRenewerClassName;
public static TokenRequestDispatcherConfig load(OMElement configElem) throws TrustException {
<span class="pc bpc" id="L58" title="1 of 2 branches missed."> if (!DISPATCHER_CONFIG.equals(configElem.getQName())) {</span>
<span class="nc" id="L59"> throw new TrustException(&quot;incorrectConfiguration&quot;);</span>
}
<span class="fc" id="L61"> TokenRequestDispatcherConfig conf = new TokenRequestDispatcherConfig();</span>
// Issuers
<span class="fc" id="L64"> handleIssuers(configElem, conf);</span>
//Validators
<span class="fc" id="L67"> handleValidators(configElem, conf);</span>
//Renewers
<span class="fc" id="L70"> handleRenewers(configElem, conf);</span>
// Cancelers
<span class="fc" id="L73"> handleCancelers(configElem, conf);</span>
//There must be a defulat issuer
<span class="fc bfc" id="L78" title="All 2 branches covered."> if (conf.defaultIssuerClassName == null) {</span>
<span class="fc" id="L79"> throw new TrustException(&quot;defaultIssuerMissing&quot;);</span>
}
<span class="fc" id="L81"> return conf;</span>
}
private static void handleCancelers(OMElement configElem,
TokenRequestDispatcherConfig conf) throws TrustException {
<span class="fc" id="L87"> OMElement cancelerEle = configElem.getFirstChildWithName(CANCELER); // support only one canceler</span>
<span class="fc bfc" id="L88" title="All 2 branches covered."> if (cancelerEle != null) {</span>
//get the class attr
<span class="fc" id="L90"> String cancelerClass = cancelerEle.getAttributeValue(CLASS_ATTR);</span>
<span class="pc bpc" id="L91" title="1 of 2 branches missed."> if (cancelerClass == null) {</span>
<span class="nc" id="L92"> throw new TrustException(&quot;missingClassName&quot;);</span>
}
<span class="fc" id="L94"> conf.defaultCancelerClassName = cancelerClass;</span>
<span class="fc" id="L95"> processConfiguration(cancelerEle, conf, cancelerClass);</span>
}
//TODO: imple
<span class="fc" id="L99"> }</span>
private static void handleIssuers(OMElement configElem,
TokenRequestDispatcherConfig conf) throws TrustException {
<span class="fc" id="L103"> for (Iterator issuerElems = configElem.getChildrenWithName(ISSUER);</span>
<span class="fc bfc" id="L104" title="All 2 branches covered."> issuerElems.hasNext();) {</span>
<span class="fc" id="L106"> OMElement element = (OMElement) issuerElems.next();</span>
//get the class attr
<span class="fc" id="L109"> String issuerClass = element.getAttributeValue(CLASS_ATTR);</span>
<span class="pc bpc" id="L110" title="1 of 2 branches missed."> if (issuerClass == null) {</span>
<span class="nc" id="L111"> throw new TrustException(&quot;missingClassName&quot;);</span>
}
<span class="fc" id="L113"> String isDefault = element.getAttributeValue(DEFAULT_ATTR);</span>
<span class="pc bpc" id="L114" title="1 of 4 branches missed."> if (isDefault != null &amp;&amp; &quot;true&quot;.equalsIgnoreCase(isDefault)) {</span>
//Use the first default issuer as the default isser
<span class="pc bpc" id="L116" title="1 of 2 branches missed."> if (conf.defaultIssuerClassName == null) {</span>
<span class="fc" id="L117"> conf.defaultIssuerClassName = issuerClass;</span>
} else {
<span class="nc" id="L119"> throw new TrustException(&quot;badDispatcherConfigMultipleDefaultIssuers&quot;);</span>
}
}
<span class="fc" id="L123"> processConfiguration(element, conf, issuerClass);</span>
//Process token types
<span class="fc" id="L126"> for (Iterator tokenTypes = element.getChildrenWithName(TOKEN_TYPE);</span>
<span class="fc bfc" id="L127" title="All 2 branches covered."> tokenTypes.hasNext();) {</span>
<span class="fc" id="L128"> OMElement type = (OMElement) tokenTypes.next();</span>
<span class="fc" id="L129"> String value = type.getText();</span>
<span class="pc bpc" id="L130" title="1 of 4 branches missed."> if (value == null || value.trim().length() == 0) {</span>
<span class="fc" id="L131"> throw new TrustException(&quot;invalidTokenTypeDefinition&quot;,</span>
new String[]{&quot;Issuer&quot;, issuerClass});
}
<span class="fc bfc" id="L134" title="All 2 branches covered."> if (conf.issuers == null) {</span>
<span class="fc" id="L135"> conf.issuers = new Hashtable();</span>
}
//If the token type is not already declared then add it to the
//table with the issuer classname
<span class="pc bpc" id="L139" title="1 of 2 branches missed."> if (!conf.issuers.keySet().contains(value)) {</span>
<span class="fc" id="L140"> conf.issuers.put(value, issuerClass);</span>
}
<span class="fc" id="L142"> }</span>
<span class="fc" id="L143"> }</span>
<span class="fc" id="L144"> }</span>
private static void handleValidators(OMElement configElem,
TokenRequestDispatcherConfig conf) throws TrustException {
<span class="fc" id="L149"> for (Iterator validatorElems = configElem.getChildrenWithName(VALIDATOR);</span>
<span class="fc bfc" id="L150" title="All 2 branches covered."> validatorElems.hasNext();) {</span>
<span class="fc" id="L152"> OMElement element = (OMElement) validatorElems.next();</span>
//get the class attr
<span class="fc" id="L155"> String validatorClass = element.getAttributeValue(CLASS_ATTR);</span>
<span class="pc bpc" id="L156" title="1 of 2 branches missed."> if (validatorClass == null) {</span>
<span class="nc" id="L157"> throw new TrustException(&quot;missingClassName&quot;);</span>
}
<span class="fc" id="L159"> String isDefault = element.getAttributeValue(DEFAULT_ATTR);</span>
<span class="pc bpc" id="L160" title="2 of 4 branches missed."> if (isDefault != null &amp;&amp; &quot;true&quot;.equalsIgnoreCase(isDefault)) {</span>
//Use the first default issuer as the default isser
<span class="pc bpc" id="L162" title="1 of 2 branches missed."> if (conf.defaultValidatorClassName == null) {</span>
<span class="fc" id="L163"> conf.defaultValidatorClassName = validatorClass;</span>
} else {
<span class="nc" id="L165"> throw new TrustException(&quot;badDispatcherConfigMultipleDefaultValidators&quot;);</span>
}
}
<span class="fc" id="L169"> processConfiguration(element, conf, validatorClass);</span>
//Process token types
<span class="fc" id="L172"> for (Iterator tokenTypes = element.getChildrenWithName(TOKEN_TYPE);</span>
<span class="fc bfc" id="L173" title="All 2 branches covered."> tokenTypes.hasNext();) {</span>
<span class="fc" id="L174"> OMElement type = (OMElement) tokenTypes.next();</span>
<span class="fc" id="L175"> String value = type.getText();</span>
<span class="pc bpc" id="L176" title="2 of 4 branches missed."> if (value == null || value.trim().length() == 0) {</span>
<span class="nc" id="L177"> throw new TrustException(&quot;invalidTokenTypeDefinition&quot;,</span>
new String[]{&quot;Validator&quot;, validatorClass});
}
<span class="pc bpc" id="L180" title="1 of 2 branches missed."> if (conf.validators == null) {</span>
<span class="fc" id="L181"> conf.validators = new Hashtable();</span>
}
//If the token type is not already declared then add it to the
//table with the validator classname
<span class="pc bpc" id="L185" title="1 of 2 branches missed."> if (!conf.validators.keySet().contains(value)) {</span>
<span class="fc" id="L186"> conf.validators.put(value, validatorClass);</span>
}
<span class="fc" id="L188"> }</span>
<span class="fc" id="L189"> } </span>
<span class="fc" id="L190"> }</span>
private static void handleRenewers(OMElement configElem,
TokenRequestDispatcherConfig conf) throws TrustException {
<span class="fc" id="L195"> for (Iterator renewerElems = configElem.getChildrenWithName(RENEWER);</span>
<span class="fc bfc" id="L196" title="All 2 branches covered."> renewerElems.hasNext();) {</span>
<span class="fc" id="L198"> OMElement element = (OMElement) renewerElems.next();</span>
//get the class attr
<span class="fc" id="L201"> String renewerClass = element.getAttributeValue(CLASS_ATTR);</span>
<span class="pc bpc" id="L202" title="1 of 2 branches missed."> if (renewerClass == null) {</span>
<span class="nc" id="L203"> throw new TrustException(&quot;missingClassName&quot;);</span>
}
<span class="fc" id="L205"> String isDefault = element.getAttributeValue(DEFAULT_ATTR);</span>
<span class="pc bpc" id="L206" title="2 of 4 branches missed."> if (isDefault != null &amp;&amp; &quot;true&quot;.equalsIgnoreCase(isDefault)) {</span>
//Use the first default issuer as the default isser
<span class="pc bpc" id="L208" title="1 of 2 branches missed."> if (conf.defaultRenewerClassName == null) {</span>
<span class="fc" id="L209"> conf.defaultRenewerClassName = renewerClass;</span>
} else {
<span class="nc" id="L211"> throw new TrustException(&quot;badDispatcherConfigMultipleDefaultRenewers&quot;);</span>
}
}
<span class="fc" id="L215"> processConfiguration(element, conf, renewerClass);</span>
//Process token types
<span class="fc" id="L218"> for (Iterator tokenTypes = element.getChildrenWithName(TOKEN_TYPE);</span>
<span class="fc bfc" id="L219" title="All 2 branches covered."> tokenTypes.hasNext();) {</span>
<span class="fc" id="L220"> OMElement type = (OMElement) tokenTypes.next();</span>
<span class="fc" id="L221"> String value = type.getText();</span>
<span class="pc bpc" id="L222" title="2 of 4 branches missed."> if (value == null || value.trim().length() == 0) {</span>
<span class="nc" id="L223"> throw new TrustException(&quot;invalidTokenTypeDefinition&quot;,</span>
new String[]{&quot;Renewer&quot;, renewerClass});
}
<span class="pc bpc" id="L226" title="1 of 2 branches missed."> if (conf.renewers == null) {</span>
<span class="fc" id="L227"> conf.renewers = new Hashtable();</span>
}
//If the token type is not already declared then add it to the
//table with the renwer classname
<span class="pc bpc" id="L231" title="1 of 2 branches missed."> if (!conf.renewers.keySet().contains(value)) {</span>
<span class="fc" id="L232"> conf.renewers.put(value, renewerClass);</span>
}
<span class="fc" id="L234"> }</span>
<span class="fc" id="L235"> } </span>
<span class="fc" id="L236"> }</span>
private static void processConfiguration(OMElement element,
TokenRequestDispatcherConfig conf,
String implClass) {
<span class="fc" id="L242"> for (Iterator configs = element.getChildrenWithName(CONFIGURATION_ELEMENT);</span>
<span class="fc bfc" id="L243" title="All 2 branches covered."> configs.hasNext();) {</span>
<span class="fc" id="L244"> OMElement configEle = (OMElement) configs.next();</span>
<span class="fc" id="L245"> String configType =</span>
configEle.getAttribute(new QName(&quot;type&quot;)).getAttributeValue().trim();
<span class="pc bpc" id="L247" title="1 of 2 branches missed."> if (configType.equalsIgnoreCase(&quot;file&quot;)) { //Process configuration file information</span>
<span class="nc" id="L248"> String issuerConfigFile = configEle.getText();</span>
<span class="nc bnc" id="L249" title="All 2 branches missed."> if (issuerConfigFile != null) {</span>
<span class="nc" id="L250"> conf.configFiles.put(implClass, issuerConfigFile);</span>
}
<span class="pc bpc" id="L252" title="1 of 2 branches missed."> } else if (configType.equalsIgnoreCase(&quot;element&quot;))</span>
{ //Process configuration element information
<span class="nc" id="L254"> conf.configElements.put(implClass, configEle);</span>
<span class="pc bpc" id="L255" title="1 of 2 branches missed."> } else if (configType.equalsIgnoreCase(&quot;parameter&quot;))</span>
{ //Process configuration parameter name information
<span class="fc" id="L257"> conf.configParamNames.put(implClass, configEle.getText());</span>
}
<span class="fc" id="L259"> }</span>
<span class="fc" id="L260"> }</span>
public static TokenRequestDispatcherConfig load(String configFilePath) throws TrustException {
FileInputStream fis;
StAXOMBuilder builder;
try {
<span class="fc" id="L266"> fis = new FileInputStream(configFilePath);</span>
<span class="fc" id="L267"> builder = new StAXOMBuilder(fis);</span>
<span class="nc" id="L268"> } catch (Exception e) {</span>
<span class="nc" id="L269"> throw new TrustException(&quot;errorLoadingConfigFile&quot;, new String[]{configFilePath});</span>
<span class="fc" id="L270"> }</span>
<span class="fc" id="L271"> return load(builder.getDocumentElement());</span>
}
public TokenIssuer getDefaultIssuerInstace() throws TrustException {
<span class="nc bnc" id="L275" title="All 2 branches missed."> if (this.defaultIssuerClassName != null) {</span>
try {
<span class="nc" id="L277"> return createIssuer(this.defaultIssuerClassName);</span>
<span class="nc" id="L278"> } catch (Exception e) {</span>
<span class="nc" id="L279"> throw new TrustException(&quot;cannotLoadClass&quot;,</span>
new String[]{this.defaultIssuerClassName}, e);
}
} else {
<span class="nc" id="L283"> return null;</span>
}
}
public TokenCanceler getDefaultCancelerInstance() throws TrustException {
<span class="pc bpc" id="L288" title="1 of 2 branches missed."> if (this.defaultCancelerClassName != null) {</span>
try {
<span class="fc" id="L290"> return createCanceler(this.defaultCancelerClassName);</span>
<span class="nc" id="L291"> } catch (Exception e) {</span>
<span class="nc" id="L292"> throw new TrustException(&quot;cannotLoadClass&quot;,</span>
new String[]{this.defaultCancelerClassName}, e);
}
} else {
<span class="nc" id="L296"> return null;</span>
}
}
public TokenValidator getDefaultValidatorInstance() throws TrustException {
<span class="nc bnc" id="L301" title="All 2 branches missed."> if (this.defaultValidatorClassName != null) {</span>
try {
<span class="nc" id="L303"> return createValidator(this.defaultValidatorClassName);</span>
<span class="nc" id="L304"> } catch (Exception e) {</span>
<span class="nc" id="L305"> throw new TrustException(&quot;cannotLoadClass&quot;,</span>
new String[]{this.defaultValidatorClassName}, e);
}
} else {
<span class="nc" id="L309"> return null;</span>
}
}
public TokenRenewer getDefaultRenewerInstance() throws TrustException {
<span class="nc bnc" id="L314" title="All 2 branches missed."> if (this.defaultRenewerClassName != null) {</span>
try {
<span class="nc" id="L316"> return createRenewer(this.defaultRenewerClassName);</span>
<span class="nc" id="L317"> } catch (Exception e) {</span>
<span class="nc" id="L318"> throw new TrustException(&quot;cannotLoadClass&quot;,</span>
new String[]{this.defaultRenewerClassName}, e);
}
} else {
<span class="nc" id="L322"> return null;</span>
}
}
public String getDefaultIssuerName() {
<span class="fc" id="L328"> return this.defaultIssuerClassName;</span>
}
public TokenIssuer getIssuer(String tokenType) throws TrustException {
<span class="fc" id="L333"> String issuerClassName = null;</span>
//try to find the issuer class name from the tokenType&lt;-&gt;issuer map
<span class="pc bpc" id="L335" title="1 of 2 branches missed."> if (this.issuers != null) {</span>
<span class="fc" id="L336"> issuerClassName = (String) this.issuers.get(tokenType);</span>
}
//If a specific issuer is not found use the default issuer
<span class="pc bpc" id="L339" title="1 of 2 branches missed."> if (issuerClassName == null) {</span>
<span class="nc" id="L340"> issuerClassName = this.defaultIssuerClassName;</span>
}
try {
<span class="fc" id="L343"> return createIssuer(issuerClassName);</span>
<span class="nc" id="L344"> } catch (Exception e) {</span>
<span class="nc" id="L345"> throw new TrustException(&quot;cannotLoadClass&quot;,</span>
new String[]{issuerClassName}, e);
}
}
public TokenValidator getValidator(String tokenType) throws TrustException {
<span class="nc" id="L351"> String validatorClassName = null;</span>
//try to find the validator class name from the tokenType&lt;-&gt;validator map
<span class="nc bnc" id="L353" title="All 2 branches missed."> if (this.validators != null) {</span>
<span class="nc" id="L354"> validatorClassName = (String) this.validators.get(tokenType);</span>
}
//If a specific validator is not found use the default validator
<span class="nc bnc" id="L357" title="All 2 branches missed."> if (validatorClassName == null) {</span>
<span class="nc" id="L358"> validatorClassName = this.defaultValidatorClassName;</span>
}
try {
<span class="nc" id="L361"> return createValidator(validatorClassName);</span>
<span class="nc" id="L362"> } catch (Exception e) {</span>
<span class="nc" id="L363"> throw new TrustException(&quot;cannotLoadClass&quot;,</span>
new String[]{validatorClassName}, e);
}
}
public TokenRenewer getRenewer(String tokenType) throws TrustException {
<span class="nc" id="L369"> String renewerClassName = null;</span>
//try to find the renewer class name from the tokenType&lt;-&gt;Renewer map
<span class="nc bnc" id="L371" title="All 2 branches missed."> if (this.renewers != null) {</span>
<span class="nc" id="L372"> renewerClassName = (String) this.renewers.get(tokenType);</span>
}
//If a specific renewer is not found use the default renewer
<span class="nc bnc" id="L375" title="All 2 branches missed."> if (renewerClassName == null) {</span>
<span class="nc" id="L376"> renewerClassName = this.defaultRenewerClassName;</span>
}
try {
<span class="nc" id="L379"> return createRenewer(renewerClassName);</span>
<span class="nc" id="L380"> } catch (Exception e) {</span>
<span class="nc" id="L381"> throw new TrustException(&quot;cannotLoadClass&quot;,</span>
new String[]{renewerClassName}, e);
}
}
/**
* @param issuerClassName
* @return TokenIssuer
*/
private TokenIssuer createIssuer(String issuerClassName) throws Exception {
<span class="fc" id="L391"> TokenIssuer issuer = (TokenIssuer) Loader.loadClass(this.getClass().getClassLoader(), </span>
issuerClassName).newInstance();
<span class="fc" id="L393"> issuer.setConfigurationElement((OMElement) this.configElements.get(issuerClassName));</span>
<span class="fc" id="L394"> issuer.setConfigurationFile((String) this.configFiles.get(issuerClassName));</span>
<span class="fc" id="L395"> issuer.setConfigurationParamName((String) this.configParamNames.get(issuerClassName));</span>
<span class="fc" id="L396"> return issuer;</span>
}
private TokenCanceler createCanceler(String cancelerClassName) throws Exception {
<span class="fc" id="L400"> TokenCanceler canceler = (TokenCanceler) Loader.loadClass(this.getClass().getClassLoader(),</span>
cancelerClassName).newInstance();
<span class="fc" id="L402"> canceler.setConfigurationElement((OMElement) this.configElements.get(cancelerClassName));</span>
<span class="fc" id="L403"> canceler.setConfigurationFile((String) this.configFiles.get(cancelerClassName));</span>
<span class="fc" id="L404"> canceler.setConfigurationParamName((String) this.configParamNames.get(cancelerClassName));</span>
<span class="fc" id="L405"> return canceler;</span>
}
private TokenValidator createValidator(String validatorClassName) throws Exception {
<span class="nc" id="L409"> TokenValidator validator = (TokenValidator) Loader.loadClass(this.getClass().getClassLoader(),</span>
validatorClassName).newInstance();
<span class="nc" id="L411"> validator.setConfigurationElement((OMElement) this.configElements.get(validatorClassName));</span>
<span class="nc" id="L412"> validator.setConfigurationFile((String) this.configFiles.get(validatorClassName));</span>
<span class="nc" id="L413"> validator.setConfigurationParamName((String) this.configParamNames.get(validatorClassName));</span>
<span class="nc" id="L414"> return validator;</span>
}
private TokenRenewer createRenewer (String renewerClassName) throws Exception {
<span class="nc" id="L418"> TokenRenewer renewer = (TokenRenewer) Loader.loadClass(this.getClass().getClassLoader(),</span>
renewerClassName).newInstance();
<span class="nc" id="L420"> renewer.setConfigurationElement((OMElement) this.configElements.get(renewerClassName));</span>
<span class="nc" id="L421"> renewer.setConfigurationFile((String) this.configFiles.get(renewerClassName));</span>
<span class="nc" id="L422"> renewer.setConfigurationParamName((String) this.configParamNames.get(renewerClassName));</span>
<span class="nc" id="L423"> return renewer;</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>