diff --git a/parts/03_config.tex b/parts/03_config.tex index 99fa3a4..32c084d 100644 --- a/parts/03_config.tex +++ b/parts/03_config.tex @@ -86,6 +86,24 @@ \end{itemize} \end{itemize} + +\subsection{Annotationen - Details} +\begin{minted}[linenos,breaklines=true]{java} + +CascadeType anschauen + +@Entity +@Table(name = "user") +public class User extends AbstractEntity { +private static final long serialVersionUID = -7060150053795176748L; + +@OneToMany( +mappedBy = "communityAdminUser", +cascade = {CascadeType.PERSIST, CascadeType.REFRESH}, // Persist Operation des User werden auch auf dessen communityAdminUser persistiert - und auch update +orphanRemoval = true // +) +\end{minted} + \section{Konfigurationsdateien} \subsection{standalone-psoe.xml} @@ -96,18 +114,18 @@ JBoss EAP benutzt standardmäßig die standalone.xml Konfigurationsdatei, kann a 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 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}) \end{itemize} \begin{code} -\captionof{listing}{standalone.xml (auszugsweise)} + \captionof{listing}{standalone.xml (auszugsweise)} -\begin{minted}[linenos,breaklines=true]{xml} + \begin{minted}[linenos,breaklines=true]{xml} ........ @@ -143,23 +161,23 @@ Abschnitte der standalone.xml \subsection{persistence.xml} -Die Datei \emph{persistence.xml} ist der zentrale Bestandteil der Persistierungs-Konfiguration. +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 + \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} + \captionof{listing}{persistence.xml} + + + \begin{minted}[linenos,breaklines=true]{xml} ) zurückgeben +\subsection{Exception nicht gefangen} +\begin{minted}[linenos,breaklines=true]{java} + package at.fhj.swd.psoe.service.impl; + ... + @Override + public void removeCommunityByAdmin(CommunityDTO communityDTO) { + Community community = communityDAO.findById(communityDTO.getId()); + String errorText; + try { + communityDAO.removeCommunityByAdmin(community); + } catch (DaoException e) { + errorText = "Error removing community"; + logger.error(errorText, e); + throw new ServiceException(errorText); + } + } +\end{minted} +\subsection{Destructive Wrapping} +\begin{minted}[linenos,breaklines=true]{java} + package at.fhj.swd.psoe.service.impl; + ... +@Override +public CommunityDTO updateCommunityEnabled(String adminUserId, String communityName, boolean isEnabled) { + String errorText = ""; + try { + boolean hasPermission = false; + User adminUser = userDao.getByUserId(adminUserId); + Community community = communityDAO.getByName(communityName); + + + for (Role r : adminUser.getRoles()) { + if (r.getname().equals("ADMIN") || r.getname().equals("PORTALADMIN")) { + hasPermission = true; + } + } + if (hasPermission || adminUser.getUserId().equals(community.getCommunityAdminUser().getUserId())) { + community.setIsEnabled(isEnabled); + communityDAO.update(community); + } else { + errorText = "No Permission to update community"; + throw new AuthenticationException(errorText); + } + return CommunityMapper.toDTO(community); + } catch (DaoException e) { + errorText = "Error updating community enabled"; + throw new ServiceException(errorText); + } catch (AuthenticationException e) { + throw new ServiceException(errorText); + } catch (Throwable e) { + errorText = "Unknown error updating community enabled"; + throw new ServiceException(errorText); + } +} +\end{minted} +\subsection{Logger mit falschem Parameter} +\begin{minted}[linenos,breaklines=true]{java} + package at.fhj.swd.psoe.service.impl; +... + @Stateless + public class DepartmentHierarchyServiceImpl implements DepartmentHierarchyService, Serializable { + + private static final long serialVersionUID = -2467949382018996094L; + private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); +... +\end{minted} +\subsection{Fehlendes Exception Handling} +\begin{minted}[linenos,breaklines=true]{java} +package at.fhj.swd.psoe.service.impl; +... +@Local(MessageService.class) +@Remote(MessageServiceRemote.class) +@Stateless +public class MessageServiceImpl implements MessageService, MessageServiceRemote, Serializable { + ... +@Override + public MessageDTO getByMessageId(long id) { + Message message = messageDAO.getById(id); + if (message == null) { + return null; + } + return MessageMapper.toDTO(message); + } + + @Override + public MessageDTO updateByAdmin(long id, String content, Date changed) { + Message message = messageDAO.getById(id); + message.setContent(content); + message.setEditedByAdmin(changed); + return MessageMapper.toDTO(messageDAO.update(message)); + } + + @Override + public MessageDTO updateByUser(long messageId, String content, Date changed) { + Message message = messageDAO.getById(messageId); + message.setContent(content); + message.setEditedByUser(changed); + return MessageMapper.toDTO(messageDAO.update(message)); + } +\end{minted} +\subsection{Exception werfen und gleich wieder fangen} +\begin{minted}[linenos,breaklines=true]{java} + ... +public class MessageServiceImpl implements MessageService, MessageServiceRemote, Serializable { + private static final long serialVersionUID = 6768291437557855130L; + ... +// nicht optimal, da die IllegalArgumentException gleich wieder gefangen wird +// überdies wird alles andere nicht gefangen + + + @Override + public void deleteMessage(long id) { + try { + Message message = messageDAO.getById(id); + if (message == null) { + throw new IllegalArgumentException("Message cannot be empty"); + } + messageDAO.delete(message); + logger.info("Message deleted successfully"); + } + catch (IllegalArgumentException ex) { + String errorMsg = "Could not delete the message (illegal argument)"; + logger.error(errorMsg, ex); + throw new ServiceException(errorMsg); + } + } + + //---------- besser wäre + package at.fhj.swd.psoe.service.impl; +... +// erst loggen, dass man in die Methode gekommen ist +// wenn userDTO null ist wird IllegalArgument geworfen und das außerhalb des try catch blocks +// erst wird die DaoException gefangen und anschließend alle anderen +// Stacktrace wird geloggt und jeweils die ServiceException weitergegeben +@Override +public void saveUser(UserDTO userDTO) { + logger.debug("UserService saveUser() called with parameter: '{}'", userDTO); + + if (userDTO == null) { + throw new IllegalArgumentException("userDTO is null"); + } + + try { + User user = (userDTO.getId() == null) ? new User() : userDao.getById(userDTO.getId()); + userDao.update(UserMapper.toEntity(userDTO, user)); + } catch (DaoException e) { + logger.error("Error saving user", e); + throw new ServiceException("Error saving user"); + } catch (Throwable e) { + logger.error("Unknown error saving user", e); + throw new ServiceException("Unknown error saving user"); + } +} +\end{minted} + diff --git a/pse.pdf b/pse.pdf index bf5c39b..b1cd8e4 100644 Binary files a/pse.pdf and b/pse.pdf differ diff --git a/pse.tex b/pse.tex index 8773ec0..fa6f577 100644 --- a/pse.tex +++ b/pse.tex @@ -9,9 +9,9 @@ \usepackage[hidelinks]{hyperref} \usepackage{multicol} \usepackage{graphicx} -%\usepackage{minted} +\usepackage{minted} -\usepackage[outputdir=../auxil]{minted} +% \usepackage[outputdir=../auxil]{minted} \setminted{fontsize=\small} \usepackage{caption}