\part{Allgemeines \& Config}
\section{Logging}
\subsubsection{Vorteile Logging mittels Framework (z.B.: log4j)}
\begin{itemize}
\item Nutzt ein einheitliches Format / Konventionen
\item logging kann optional an und ausgeschalten werden
\item durch verschiedene Log-level können Logs gefiltert erstellt werden
\item Layout für Ausgabe kann zentral definiert/geändert werden
\end{itemize}
\section{Annotationen}
\begin{itemize}
\item @MappedSuperclass
\begin{itemize}
\item ist im Hybernate Framework
\item eine Klasse durch die gemeinsame Felder definiert werden.
\item definiert eine abstrakte Superklasse
\end{itemize}
\item @Produces
\begin{itemize}
\item kommt während deployment, markiert Factory Method damit man nicht direkt auf die Klasse zugreifen muss
\end{itemize}
\item @Typed
\begin{itemize}
\item zeigt die Vererbung Wieso bei uns allein stehend?
\end{itemize}
\item @Named
\begin{itemize}
\item Zeigt bei Mehrdeutigkeit das richtige Objekt mit dem Namen
\end{itemize}
\item @Resource
\begin{itemize}
\item fast wie Dependency Injection
\item damit weiß der Container wie er das Annotierte Feld instanzieren muss
\end{itemize}
\item @Stateless
\begin{itemize}
\item speichert den Client Status nicht
\end{itemize}
\item @Entity
\begin{itemize}
\item Data Access Layer
\end{itemize}
\item @Table
\begin{itemize}
\item Tabellenname im SQL
\end{itemize}
\item @Column
\begin{itemize}
\item SQL-Spalten nullable=false
\end{itemize}
\item @OneToMany
\item @JoinColums
\begin{itemize}
\item welche Spalten zusammen gehören FK
\end{itemize}
\item @OneToMany
\begin{itemize}
\item auf anderen Seite
\end{itemize}
\item @ApplicationScoped
\begin{itemize}
\item lebt die ganze Applikation lang, wird einmal gemacht.
\end{itemize}
\item @PersistenceContext
\begin{itemize}
\item persistance.xml auslesen für Treiber und andere JPA Geschichten + Data Source. Entity Manager
\end{itemize}
\item @Id
\begin{itemize}
\item das ist die id
\end{itemize}
\item @GeneratedValue
\begin{itemize}
\item Wert kommt aus der DB
\end{itemize}
\item @Local
\begin{itemize}
\item Klasse für lokale Aufrufe.
\end{itemize}
\item @Remote
\begin{itemize}
\item interprozessaufrufe. RMI
\end{itemize}
\item @ApplicationException
\begin{itemize}
\item Rollback wenn so eine Exception kommt, Nachricht zum Client.
\end{itemize}
\end{itemize}
\subsection{Annotationen - Details}
\begin{itemize}
\item CascadeType.Remove löscht die damit Annotierte Verknüpfung mit
\item dies geht auch rekursiv in der kompletten Datenbank
\item CascadeType.Remove und orphanRemoval=true ist equivalent
\end{itemize}
\begin{minted}[linenos,breaklines=true]{java}
...
@OneToOne(fetch = FetchType.EAGER,
cascade = CascadeType.ALL,
orphanRemoval = true)
@JoinColumn(name = "documentlibrary_id")
private Documentlibrary documentlibrary;
@Column(nullable = false, unique = true)
private String name;
...
public enum CascadeType {
/* Cascade all operations /
ALL,
/* Cascade persist operation /
PERSIST,
/* Cascade merge operation /
MERGE,
/* Cascade remove operation /
REMOVE,
/* Cascade refresh operation /
REFRESH,
*/
DETACH
...
}
)
\end{minted}
\section{Konfigurationsdateien}
\subsection{persistence.xml}
Die Datei \emph{persistence.xml} ist der zentrale Bestandteil der Persistierungs-Konfiguration.
Folgende Dinge können konfiguriert werden:
\begin{itemize}
\item SQL dialect
\item the persistence provider that shall be used at runtime
\item the data source you want to use to connect to your database
\item several provider-specific configuration parameters
\end{itemize}
\begin{code}
\captionof{listing}{persistence.xml}
\begin{minted}[linenos,breaklines=true]{xml}
java:jboss/datasources/psoeDS
\end{minted}
\end{code}
\begin{figure}[!htp]
\centering
\includegraphics[width=0.7\textwidth]{pics/ConfigFiles.png}
\end{figure}
\subsection{web.xml}
\begin{itemize}
\item konfiguriert den Java Webserver (Wildfly - JBOSS)
\item Einbindung des Faces-Servlet (FrontController - Implementierung, Zugriffskontrolle, Rollenkonfiguration)
\item befindet sich im Ordner \textbf{src/main/webapp/WEB-INF/web.xml}
\end{itemize}
\begin{minted}[linenos,breaklines=true]{xml}
Faces Servletjavax.faces.webapp.FacesServlet1Faces Servlet*.xhtmladministratorsADMINadmin area/admin/*ADMINFORMpse/login.xhtml/login.xhtml
\end{minted}
\subsection{pom.xml}
\begin{itemize}
\item \textit{resources}-plugin (bindet die Serverressourcen ein - Ordner \textit{configuration} im Projekt - z.B. \textit{standalone-psoe.xml})
\item Wildfly (JBoss)– Webserver
\begin{multicols}{2}
\begin{enumerate}
\item Compile
\item Surefire (unitTests)
\item Packaging - war file erstellen
\item Wildfly - fressen und deployen
\item Failsafe IT-test
\item MVN site
\item Gui test
\end{enumerate}
\end{multicols}
\item Primeface = jsf Framework
\item Jacoco = test Coverage
\item Slf4j = logger
\item Jaxb – xml
\item Cdi = context dependancy injection
\end{itemize}
\subsubsection{Aufbau pom.xml}
\begin{figure}[h]
\centering
\includegraphics[width=0.3\linewidth]{pics/pom-structure}
\includegraphics[width=0.3\linewidth]{pics/pom-properties}
\label{fig:pom}
\end{figure}
\subsection{standalone-psoe.xml}
Wird ein JBoss Applikationsserver im \emph{standalone}-Modus betrieben, läuft jede Instanz in einem eigenen Prozess.
Diese Datei ist eine Java Enterprise Edition 6 zertifizierte Web-Profil Konfiguration welche alle benötigten Technologien (z.B. Extensions von JBoss, Datasources etc.) definiert.
JBoss EAP benutzt standardmäßig die standalone.xml Konfigurationsdatei, kann aber auch unter Verwendung einer anderen gestartet werden.
Abschnitte der standalone.xml
\begin{itemize}
\item extensions (z.B. diverse Wildfly Module)
\item management (z.B. Access Control -> role-mapping)
\item profile (z.B. JPA Subsystem)
\item interfaces (z.B. \${jboss.bind.address:127.0.0.1})
\item socket-binding-group (z.B \${jboss.http.port:8080})
\item Rechte (Management-Realm)
\item Datenbankzugriffsparameter
\end{itemize}
\begin{code}
\captionof{listing}{standalone.xml (auszugsweise)}
\begin{minted}[linenos,breaklines=true]{xml}
........
\end{minted}
\end{code}
\subsection{log4j.properties}
textit{src/test/resources/log4j.properties}
\section{Fehler im Projekt}
\subsection{Return null}
Anstatt von Null einfach eine Leere Liste bzw. ein default Objekt (oder new