Hi ALL,
In the previous post, I've mentioned the need to raise a compilation
error when list.add(Double a) is called.
I cannot say that I found the solution for it yet but at least I've
done one step to solve the problem.
Using Macker we can determine when standard JCF classes are being used
whilst fastutil implementation should be used instead.
In spite it does not solve the mistake which produces unnecessary
autoboxing, at least we can guarantee that are using a high
performance implementation of JCF interfaces.
Below you can see two snippets of code:
1. How this validation is triggered in our pom.xml;
2. Macker rule which detects uses of JCF concrete classes.
I also show some output produced by Macker, which provokes a failure
in the build process.
========= pom.xml =================
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<dependencies>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-antlr</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>antlr</groupId>
<artifactId>antlrall</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<artifactId>macker</artifactId>
<groupId>innig</groupId>
<version>0.4.2</version>
</dependency>
<dependency>
<artifactId>innig-util</artifactId>
<groupId>innig</groupId>
<version>0.4.2</version>
</dependency>
<dependency>
<artifactId>jakarta-regexp</artifactId>
<groupId>jakarta-regexp</groupId>
<version>1.4</version>
</dependency>
<dependency>
<artifactId>bcel</artifactId>
<groupId>bcel</groupId>
<version>5.1</version>
</dependency>
<dependency>
<artifactId>jdom</artifactId>
<groupId>jdom</groupId>
<version>1.0</version>
</dependency>
<dependency>
<artifactId>commons-lang</artifactId>
<groupId>commons-lang</groupId>
<version>1.0.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>macker</id>
<phase>process-classes</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<property name="compile_classpath"
refid="maven.compile.classpath" />
<property name="runtime_classpath"
refid="maven.runtime.classpath" />
<property name="test_classpath"
refid="maven.test.classpath" />
<property name="plugin_classpath"
refid="maven.plugin.classpath" />
<path id="compile.classpath">
<pathelement path="$
{compile_classpath}" />
<pathelement path="$
{plugin_classpath}" />
</path>
<taskdef name="macker"
classname="net.innig.macker.ant.MackerAntTask"
classpathref="maven.plugin.classpath" />
<macker>
<classpath
refid="compile.classpath" />
<rules dir="src/main/macker"
includes="*.xml" />
<classes dir="target/classes">
<include name="**/*.class" />
</classes>
</macker>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
=========== Macker rule =============
<?xml version="1.0"?>
<!DOCTYPE macker PUBLIC
"-//innig//DTD Macker 0.4//EN"
"
http://innig.net/macker/dtd/macker-0.4.dtd">
<macker>
<ruleset name="jcf-check">
<pattern name="java2-collections">
<include class="java.util.*">
<include class="**Collection*" />
<include class="**List*" />
<include class="**Map**" />
<include class="**Set*">
<exclude class="**.BitSet" />
</include>
<include class="**Array*" />
<include class="**.Iterator" />
</include>
</pattern>
<pattern name="concrete-class">
<exclude filter="interface" />
<exclude filter="abstract-class" />
</pattern>
<pattern name="java2-collections-concrete-class">
<include pattern="java2-collections">
<include pattern="concrete-class" />
</include>
</pattern>
<access-rule>
<message>Performance: use fastutil classes instead of
standard JCF concrete classes.</message>
<deny>
<to pattern="java2-collections-concrete-class" />
</deny>
</access-rule>
</ruleset>
</macker>
====================================
When we run
mvn clean process-classes
the build fails and we obtain something like this:
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.testsuite.lang.TypeReferenceTest
to java.util.TreeMap
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.testsuite.model.volatility.EstimatorsTest
to java.util.Arrays
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.testsuite.time.ScheduleTest
to java.util.ArrayList
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.time.AbstractCalendar
to java.util.ArrayList
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.time.Schedule
to java.util.ArrayList
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.time.Schedule
to java.util.Collections
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.time.TimeGrid
to java.util.Collections
Do not use JCF concrete classes, use fastutil classes instead.
Illegal reference
from org.jquantlib.util.DefaultObservable
to java.util.Collections
Have fun
Richard