<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.9.2 from org.apache.rat:apache-rat-plugin:0.13:rat at 21 September 2021
 | Rendered using Apache Maven Fluido Skin 1.9
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="generator" content="Apache Maven Doxia Site Renderer 1.9.2" />
    <title>Fulcrum Parser &#x2013; Rat (Release Audit Tool) results</title>
    <link rel="stylesheet" href="./css/apache-maven-fluido-1.9.min.css" />
    <link rel="stylesheet" href="./css/site.css" />
    <link rel="stylesheet" href="./css/print.css" media="print" />
    <script src="./js/apache-maven-fluido-1.9.min.js"></script>
  </head>
  <body class="topBarDisabled">
    <div class="container-fluid">
      <header>
        <div id="banner">
          <div class="pull-left"><a href="https://turbine.apache.org/" id="bannerLeft" title="Apache Turbine"><img src="https://turbine.apache.org/images/turbine-project.png"  alt="Apache Turbine"/></a></div>
          <div class="pull-right"></div>
          <div class="clear"><hr/></div>
        </div>

        <div id="breadcrumbs">
          <ul class="breadcrumb">
        <li id="publishDate">Last Published: 21 September 2021<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 2.0.2-SNAPSHOT</li>
      <li class="pull-right"><span class="divider">|</span>
<a href="https://turbine.apache.org/fulcrum/" class="externalLink" title="Fulcrum">Fulcrum</a></li>
      <li class="pull-right"><span class="divider">|</span>
<a href="https://turbine.apache.org/" class="externalLink" title="Turbine">Turbine</a></li>
      <li class="pull-right"><a href="https://www.apache.org" class="externalLink" title="Apache">Apache</a></li>
          </ul>
        </div>
      </header>
      <div class="row-fluid">
        <header id="leftColumn" class="span2">
          <nav class="well sidebar-nav">
  <ul class="nav nav-list">
   <li class="nav-header">Overview</li>
    <li><a href="index.html" title="Main"><span class="none"></span>Main</a></li>
   <li class="nav-header">Project Documentation</li>
    <li><a href="project-info.html" title="Project Information"><span class="icon-chevron-right"></span>Project Information</a></li>
    <li><a href="project-reports.html" title="Project Reports"><span class="icon-chevron-down"></span>Project Reports</a>
     <ul class="nav nav-list">
      <li><a href="changes-report.html" title="Changes"><span class="none"></span>Changes</a></li>
      <li><a href="apidocs/index.html" title="Javadoc"><span class="none"></span>Javadoc</a></li>
      <li><a href="testapidocs/index.html" title="Test Javadoc"><span class="none"></span>Test Javadoc</a></li>
      <li><a href="xref/index.html" title="Source Xref"><span class="none"></span>Source Xref</a></li>
      <li><a href="xref-test/index.html" title="Test Source Xref"><span class="none"></span>Test Source Xref</a></li>
      <li><a href="cpd.html" title="CPD"><span class="none"></span>CPD</a></li>
      <li><a href="pmd.html" title="PMD"><span class="none"></span>PMD</a></li>
      <li><a href="surefire-report.html" title="Surefire Report"><span class="none"></span>Surefire Report</a></li>
      <li><a href="jacoco/index.html" title="JaCoCo"><span class="none"></span>JaCoCo</a></li>
      <li><a href="jacoco-aggregate/index.html" title="JaCoCo Aggregate"><span class="none"></span>JaCoCo Aggregate</a></li>
      <li><a href="jdepend-report.html" title="JDepend"><span class="none"></span>JDepend</a></li>
      <li class="active"><a href="#"><span class="none"></span>Rat Report</a></li>
      <li><a href="taglist.html" title="Tag List"><span class="none"></span>Tag List</a></li>
      <li><a href="findbugs.html" title="FindBugs"><span class="none"></span>FindBugs</a></li>
     </ul></li>
   <li class="nav-header">Apache</li>
    <li><a href="https://www.apache.org/" class="externalLink" title="Apache Website"><span class="none"></span>Apache Website</a></li>
    <li><a href="https://www.apache.org/licenses/" class="externalLink" title="License"><span class="none"></span>License</a></li>
    <li><a href="https://www.apache.org/foundation/how-it-works.html" class="externalLink" title="How the ASF works"><span class="none"></span>How the ASF works</a></li>
    <li><a href="https://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship"><span class="none"></span>Sponsorship</a></li>
    <li><a href="https://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks"><span class="none"></span>Thanks</a></li>
    <li><a href="https://www.apache.org/security/" class="externalLink" title="Security"><span class="none"></span>Security</a></li>
  </ul>
          </nav>
          <div class="well sidebar-nav">
            <hr />
            <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
            </div>
          </div>
        </header>
        <main id="bodyColumn"  class="span10" >
<section>
<h2><a name="Rat_.28Release_Audit_Tool.29_results"></a>Rat (Release Audit Tool) results</h2>
<p>The following document contains the results of <a class="externalLink" href="https://creadur.apache.org/rat/apache-rat-plugin/">Rat (Release Audit Tool)</a>.</p>
<p></p>
<div class="source"><pre class="prettyprint">
*****************************************************
Summary
-------
Generated at: 2021-09-21T14:17:01+02:00

Notes: 2
Binaries: 0
Archives: 0
Standards: 37

Apache Licensed: 35
Generated Documents: 0

JavaDocs are generated, thus a license header is optional.
Generated files do not require license headers.

2 Unknown Licenses

*****************************************************

Files with unapproved licenses:

  src/test/org/apache/fulcrum/parser/ParameterParserWithFulcrumPoolTest.java
  src/test/org/apache/fulcrum/parser/pool/CookieParserPoolTest.java

*****************************************************

*****************************************************
  Files with Apache License headers will be marked AL
  Binary files (which do not require any license headers) will be marked B
  Compressed archives will be marked A
  Notices, licenses etc. will be marked N
  AL    .asf.yaml
  N     LICENSE.txt
  N     NOTICE.txt
  AL    pom.xml
  AL    src/changes/changes.xml
  AL    src/java/org/apache/fulcrum/parser/BaseValueParser.java
  AL    src/java/org/apache/fulcrum/parser/CookieParser.java
  AL    src/java/org/apache/fulcrum/parser/CSVParser.java
  AL    src/java/org/apache/fulcrum/parser/DataStreamParser.java
  AL    src/java/org/apache/fulcrum/parser/DefaultCookieParser.java
  AL    src/java/org/apache/fulcrum/parser/DefaultParameterParser.java
  AL    src/java/org/apache/fulcrum/parser/DefaultParserService.java
  AL    src/java/org/apache/fulcrum/parser/ParameterParser.java
  AL    src/java/org/apache/fulcrum/parser/ParserService.java
  AL    src/java/org/apache/fulcrum/parser/ParserServiceSupport.java
  AL    src/java/org/apache/fulcrum/parser/pool/BaseValueParserFactory.java
  AL    src/java/org/apache/fulcrum/parser/pool/BaseValueParserPool.java
  AL    src/java/org/apache/fulcrum/parser/pool/CookieParserFactory.java
  AL    src/java/org/apache/fulcrum/parser/pool/CookieParserPool.java
  AL    src/java/org/apache/fulcrum/parser/pool/DefaultParameterParserFactory.java
  AL    src/java/org/apache/fulcrum/parser/pool/DefaultParameterParserPool.java
  AL    src/java/org/apache/fulcrum/parser/StringValueParser.java
  AL    src/java/org/apache/fulcrum/parser/TSVParser.java
  AL    src/java/org/apache/fulcrum/parser/ValueParser.java
  AL    src/site/site.xml
  AL    src/test/org/apache/fulcrum/parser/BaseValueParserTest.java
  AL    src/test/org/apache/fulcrum/parser/CookieParserTest.java
  AL    src/test/org/apache/fulcrum/parser/ParameterParserTest.java
 !????? src/test/org/apache/fulcrum/parser/ParameterParserWithFulcrumPoolTest.java
  AL    src/test/org/apache/fulcrum/parser/ParserServiceTest.java
  AL    src/test/org/apache/fulcrum/parser/pool/BaseValueParserPoolTest.java
 !????? src/test/org/apache/fulcrum/parser/pool/CookieParserPoolTest.java
  AL    src/test/org/apache/fulcrum/parser/pool/ParameterParserPoolTest.java
  AL    src/test/org/apache/fulcrum/parser/PropertyBean.java
  AL    src/test/TestComponentConfig.xml
  AL    src/test/TestComponentConfigWithFulcrumPool.xml
  AL    src/test/TestRoleConfig.xml
  AL    src/test/TestRoleConfigWithFulcrumPool.xml
  AL    xdocs/index.xml
 
*****************************************************

 Printing headers for text files without a valid license header...
 
=====================================================
== File: src/test/org/apache/fulcrum/parser/ParameterParserWithFulcrumPoolTest.java
=====================================================
package org.apache.fulcrum.parser;

import static org.junit.jupiter.api.Assertions.fail;

import org.apache.avalon.framework.component.ComponentException;
import org.junit.jupiter.api.BeforeEach;

/**
 * Basic test that ParameterParser instantiates.
 *
 * @author &lt;a href=&quot;epugh@opensourceconnections.com&quot;&gt;Eric Pugh&lt;/a&gt;
 * @version $Id: ParameterParserTest.java 1848895 2018-12-13 21:04:26Z painter $
 */
public class ParameterParserWithFulcrumPoolTest extends ParameterParserTest
{

    @Override
    @BeforeEach
    public void setUpBefore() throws Exception
    {
        try
        {
            setConfigurationFileName(&quot;src/test/TestComponentConfigWithFulcrumPool.xml&quot;);
            
            setRoleFileName( &quot;src/test/TestRoleConfigWithFulcrumPool.xml&quot;);
            
            parserService = (ParserService)this.lookup(ParserService.ROLE);
            parameterParser = parserService.getParser(DefaultParameterParser.class);

        }
        catch (ComponentException e)
        {
            e.printStackTrace();
            fail(e.getMessage());
        }
    }

}

=====================================================
== File: src/test/org/apache/fulcrum/parser/pool/CookieParserPoolTest.java
=====================================================
package org.apache.fulcrum.parser.pool;


import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.Mockito.mock;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.avalon.framework.component.ComponentException;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.fulcrum.parser.DefaultCookieParser;
import org.apache.fulcrum.parser.ParserService;
import org.apache.fulcrum.testcontainer.BaseUnit5Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;



/**
 * Test the CookieParserFactory and CookieParserPool classes.
 *
 * @author &lt;a href=&quot;mailto:painter@apache.org&quot;&gt;Jeffery Painter&lt;/a&gt;
 * @version $Id: CookieParserPoolTest.java 222043 2019-01-17 08:17:33Z painter $
 */
public class CookieParserPoolTest extends BaseUnit5Test 
{
	private DefaultCookieParser parser;
    private ParserService parserService;
    
    /** 
     * Use commons pool to manage value parsers 
     */
    private CookieParserPool cookieParserPool;

    /**
     * Performs any initialization that must happen before each test is run.
     * @throws Exception if parser service not found
     */
    @BeforeEach
    public void setUp() throws Exception
    {
        try
        {
            parserService = (ParserService)this.lookup(ParserService.ROLE);
            

    		// Define the default configuration
</pre></div></section>
        </main>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
            <p>&#169;      2005&#x2013;2021
<a href="https://www.apache.org/">The Apache Software Foundation</a>
</p>
        </div>
      </div>
    </footer>
  </body>
</html>
