minor corrections

This commit is contained in:
Claudio Maggioni 2022-10-24 10:29:13 +02:00
parent f7de5a6e43
commit 8fcf99e6b6
2 changed files with 74 additions and 29 deletions

Binary file not shown.

View file

@ -57,27 +57,52 @@ requirements:
\item 50.000 or more lines of code. \item 50.000 or more lines of code.
\end{itemize} \end{itemize}
Additionally, we added some (less strict) constraints that we thought would lead to a more significant and influential analysis: Additionally, we added some less strict constraints that we thought would lead
to a more significant and influential analysis:
\begin{itemize} \begin{itemize}
\item There must be evidence that the project follows business-oriented conventions. \item There must be evidence that the project follows business-oriented
This excludes amateur or personal projects that might have fewer design pattern applications due to their nature. conventions. This excludes amateur or personal projects that might have
\item Repository data, documentation, and comments must be written in English. Many repositories that are at the top of the search results provided by the hard requirements are not in English, and this drastically hampers our ability to understand the code; fewer design pattern applications due to their nature.
\item The artifact the project produces must not rely on external components and have a streamlined build process, with all code stored in a single Maven/Gradle module. This improves our ability to tinker with the project more quickly and the pattern detection process, which requires all \textit{.class} files related to the project to be stored in a single directory tree. \item Repository data, documentation, and comments must be written in English.
Many repositories that are at the top of the search results provided by the
hard requirements are not in English, and this drastically hampers our
ability to understand the code;
\item The artifact the project produces must not rely on external components
and have a streamlined build process, with all code stored in a single
Maven/Gradle module. This improves our ability to tinker with the project
more quickly and the pattern detection process, which requires all
\textit{.class} files related to the project to be stored in a single
directory tree.
\end{itemize} \end{itemize}
Additionally, instead of querying GitHub directly for projects, we decided to see if libraries we knew already in our Java development career would match the hard and soft requirements we set for ourselves. Additionally, instead of querying GitHub directly for projects, we decided to
see if libraries we knew already in our Java development career would match the
hard and soft requirements we set for ourselves.
Therefore, we considered the following GitHub repositories: Therefore, we considered the following GitHub repositories:
\begin{description} \begin{description}
\item[vavr-io/vavr] a Java library for functional programming, was discarded as the project is less than 20.000 lines of code and does not meet the rigid requirements; \item[vavr-io/vavr] a Java library for functional programming, was discarded
\item[bitcoin4j/bitcoin4j] a Java implementation of the bitcoin protocol, discarded as the project is distributed in several subprojects, and therefore the build process is nontrivial; as the project is less than 20.000 lines of code and does not meet the rigid
\item[FasterXML/jackson-core] is the core ''module`` of a Java JSON serialization and deserialization library. We chose this project because it meets the selection criteria. It does not rely on external components for its execution. Finally, the project structure uses a single Maven module for its sources and is thus easy to analyze. requirements;
\item[bitcoin4j/bitcoin4j] a Java implementation of the bitcoin protocol,
discarded as the project is distributed in several subprojects, and
therefore the build process is nontrivial;
\item[FasterXML/jackson-core] is the core ''module`` of a Java JSON
serialization and deserialization library. We chose this project because it
meets the selection criteria. It does not rely on external components for
its execution. Finally, the project structure uses a single Maven module for
its sources and is thus easy to analyze.
\end{description} \end{description}
\subsection {The Jackson Core Project} \subsection {The Jackson Core Project}
As mentioned, Jackson is a library that offers serialization and deserialization capabilities in JSON format. It is highly extensible and customizable through a robust but flexible API. The library is divided into what the Jackson developers call “modules,” i.e., plug-ins that can augment the serialization and deserialization process. Some modules, like the \textit{jackson-dataformat-xml} module, target different encoding languages like XML. As mentioned, Jackson is a library that offers serialization and deserialization
capabilities in JSON format. It is highly extensible and customizable through a
robust but flexible API. The library is divided into what the Jackson developers
call “modules,” i.e., plug-ins that can augment the serialization and
deserialization process. Some modules, like the \textit{jackson-dataformat-xml}
module, target different encoding languages like XML.
The chosen repository contains only the \textit{core} module of Jackson. The The chosen repository contains only the \textit{core} module of Jackson. The
\textit{core} module implements the necessary library abstractions and \textit{core} module implements the necessary library abstractions and
@ -92,10 +117,11 @@ version available at the time of writing.
After verifying that the project meets the hard requirements related to GitHub After verifying that the project meets the hard requirements related to GitHub
(more than 2000 stars, more than 600 forks, 35 open issues\footnote{as of (more than 2000 stars, more than 600 forks, 35 open issues\footnote{as of
2022-10-19}), we ensured that the project had enough lines of code by using the 2022-10-19 (ISO 8601 date)}), we ensured that the project had enough lines of
cloc tool, which provided the following output shown in Figure \ref{fig:cloc}. code by using the cloc tool, which provided the following output shown in Figure
By looking at the results we can finally assert that the project contains 58.787 \ref{fig:cloc}. By looking at the results we can finally assert that the
lines of Java code and this satisfies all the requirements. project contains 58.787 lines of Java code and this satisfies all the
requirements.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
@ -120,28 +146,49 @@ lines of Java code and this satisfies all the requirements.
Total & 5158 & 27431 & 255936 & 2048305\\ Total & 5158 & 27431 & 255936 & 2048305\\
\bottomrule \bottomrule
\end{tabular} \end{tabular}
\caption{Output of the \textit{cloc} tool for the Jackson Core project at revision \caption{Output of the \textit{cloc} tool for the Jackson Core project at
\textit{jackson-core-3.13.4}.} revision \textit{jackson-core-3.13.4}.}
\label{fig:cloc} \label{fig:cloc}
\end{figure} \end{figure}
\section{TO REWRITE Analysis Implementation} \section{Analysis Implementation}
We use The analysis is performed using the
\href{https://users.encs.concordia.ca/~nikolaos/pattern\_detection.html}{\textit{Pattern4J}} \textit{Pattern4J}\footnote{\url{https://users.encs.concordia.ca/~nikolaos/pattern\_detection.html}}
as a pattern detection tool. This tool needs to be compiled \textit{.class} files to perform analysis. developed at Concordia University. This program attempts to detect traditional
Therefore, as \textit{jackson-core} is a standard Maven project, we compile the sources using the command mvn clean compile. design patterns by scanning the bytecode (i.e.\ the \texttt{.class} files) of a
The \textit{pom.xml} of the library specifies Java 1.6 as a build target, which is not supported by JDK 17 or above. We used JDK 11 instead, as it is the previous LTS version. given project and by checking several heuristics. Due to the unceirtanty of this
process we double-check each instance of a pattern found to use our own
judgement and detect possible false positives.
An XML dump of the \textit{Pattern4j} analysis results is included in the submission as the file \textit{analysis.xml}. Since the tool needs compiled \textit{.class} files to perform the analysis,
and since \textit{jackson-core} is a standard Maven project, we compile the
sources using the command \texttt{mvn clean compile}. The \textit{pom.xml} of
the library specifies Java 1.6 as a build target, which is not supported by JDK
17 or above. We used JDK 11 instead, as it is the most recent LTS version of the
JDK to still support this target.
An XML dump of the \textit{Pattern4j} analysis results is included in the
submission as the file \textit{analysis.xml}.
In the following sections each detection of the \textit{Pattern4J}
tool is reviewed to characterize if it is indeed not a false positive and if the
design pattern is varied in any way in its application. For the sake of brevity,
when referring to a class by its fully-qualified nomain name the prefix
\textit{com.fasterxml.jackson.core} is omitted as all classes in the Jackson
core project reside in this package or in a sub-package of this package.
\section{Structural Patterns} \section{Structural Patterns}
\subsection{TO REWRITE Singleton Pattern} \subsection{TO REWRITE Singleton Pattern}
Ensure a class only has one instance and provide a global point of access to it. Ensure a class only has one instance and provide a global point of access to it.
The tool found thirteen instances with the Singleton pattern. The tool found thirteen instances with the Singleton pattern. Doing a deeper
Doing a deeper analysis of the found instances, we discovered that some results are false positives. analysis of the found instances, we discovered that some results are false
Example, \textit{com.fasterxml.jackson.core.sym.Name1} has a private package constructor and a public static final instance of it, but reading the documentation, the class represents (short) JSON string literals and is initialized by client code. positives. Example, \textit{sym.Name1} has a private
package constructor and a public static final instance of it, but reading the
documentation, the class represents (short) JSON string literals and is
initialized by client code.
\begin{lstlisting}[caption=Name1 class,language=java] \begin{lstlisting}[caption=Name1 class,language=java]
public final class Name1 extends Name { public final class Name1 extends Name {
@ -179,8 +226,6 @@ public final class Name1 extends Name {
} }
\end{lstlisting} \end{lstlisting}
(com.fasterxml.jackson.core omitted for brevity)
\begin{description} \begin{description}
\item[sym.Name1, JsonLocation, DefaultIndenter, \item[sym.Name1, JsonLocation, DefaultIndenter,
util.DefaultPrettyPrinter\$FixedSpaceIndenter] is not a singleton (detected cause of "convenient" default instance given as static final field), the constructor is not used, but the class is extensible util.DefaultPrettyPrinter\$FixedSpaceIndenter] is not a singleton (detected cause of "convenient" default instance given as static final field), the constructor is not used, but the class is extensible