updated to POI 4.0.0

This commit is contained in:
2018-10-26 14:02:50 +02:00
parent 8c4f304d18
commit 4eb6bb77e2
4 changed files with 446 additions and 446 deletions

View File

@ -1,169 +1,169 @@
package de.muehlencord.shared.account.presentation; package de.muehlencord.shared.account.presentation;
import de.muehlencord.shared.account.business.account.boundary.AccountControl; import de.muehlencord.shared.account.business.account.boundary.AccountControl;
import de.muehlencord.shared.account.business.account.entity.AccountEntity; import de.muehlencord.shared.account.business.account.entity.AccountEntity;
import de.muehlencord.shared.jeeutil.FacesUtil; import de.muehlencord.shared.jeeutil.FacesUtil;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.faces.context.ExternalContext; import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped; import javax.faces.view.ViewScoped;
import javax.inject.Named; import javax.inject.Named;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.web.util.WebUtils; import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
* *
* @author joern.muehlencord * @author joern.muehlencord
*/ */
@Named(value = "loginView") @Named(value = "loginView")
@ViewScoped @ViewScoped
public class LoginView implements Serializable { public class LoginView implements Serializable {
private static final long serialVersionUID = -1164860380769648432L; private static final long serialVersionUID = -1164860380769648432L;
@EJB @EJB
private AccountControl accountService; private AccountControl accountService;
private String username = null; private String username = null;
private String password = null; private String password = null;
private boolean rememberMe = false; private boolean rememberMe = false;
private String resetPasswordToken = null; private String resetPasswordToken = null;
private static final Logger LOGGER = LoggerFactory.getLogger(LoginView.class.getName()); private static final Logger LOGGER = LoggerFactory.getLogger(LoginView.class.getName());
public void authenticate() { public void authenticate() {
// Example using most common scenario of username/password pair: // Example using most common scenario of username/password pair:
UsernamePasswordToken token = new UsernamePasswordToken(getUsername(), getPassword()); UsernamePasswordToken token = new UsernamePasswordToken(getUsername(), getPassword());
// "Remember Me" built-in: // "Remember Me" built-in:
token.setRememberMe(rememberMe); token.setRememberMe(rememberMe);
Subject currentUser = SecurityUtils.getSubject(); Subject currentUser = SecurityUtils.getSubject();
LOGGER.info("Submitting login with username of " + username); LOGGER.info("Submitting login with username of " + username);
try { try {
currentUser.login(token); currentUser.login(token);
// user logged in, update account entity // user logged in, update account entity
AccountEntity account = accountService.getAccountEntity(username, true); AccountEntity account = accountService.getAccountEntity(username, true);
accountService.updateLogin(account); accountService.updateLogin(account);
// redirect to home // redirect to home
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
String fallbackUrl = "/web/index.xhtml"; // TODO make configurable String fallbackUrl = "/web/index.xhtml"; // TODO make configurable
// ec.redirect(url); // ec.redirect(url);
WebUtils.redirectToSavedRequest((ServletRequest) ec.getRequest(), (ServletResponse) ec.getResponse(), fallbackUrl); WebUtils.redirectToSavedRequest((ServletRequest) ec.getRequest(), (ServletResponse) ec.getResponse(), fallbackUrl);
} catch (IOException | AuthenticationException ex) { } catch (IOException | AuthenticationException ex) {
// Could catch a subclass of AuthenticationException if you like // Could catch a subclass of AuthenticationException if you like
String hint = "Error while authenticating user " + username; String hint = "Error while authenticating user " + username;
if (LOGGER.isDebugEnabled()) { if (LOGGER.isDebugEnabled()) {
LOGGER.debug(hint, ex); LOGGER.debug(hint, ex);
} else { } else {
LOGGER.error(hint + " Reason: " + ex.toString()); LOGGER.error(hint + " Reason: " + ex.toString());
} }
FacesUtil.addErrorMessage("Login failed"); FacesUtil.addGlobalErrorMessage("Login failed", hint);
AccountEntity account = accountService.getAccountEntity(username, false); AccountEntity account = accountService.getAccountEntity(username, false);
if (account != null) { if (account != null) {
accountService.addLoginError(account); accountService.addLoginError(account);
} }
} finally { } finally {
token.clear(); token.clear();
} }
} }
public void logout() { public void logout() {
Subject currentUser = SecurityUtils.getSubject(); Subject currentUser = SecurityUtils.getSubject();
try { try {
currentUser.logout(); currentUser.logout();
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
// check if redirect shall be executed // check if redirect shall be executed
// default setting is yes to /login.xhtml // default setting is yes to /login.xhtml
// can be overwritten using parameters // can be overwritten using parameters
// de.muehlencord.shared.account.loginview.executeredirect boolean true/false // de.muehlencord.shared.account.loginview.executeredirect boolean true/false
// de.muehlencord.shared.account.loginview.redirecttarget path to redirect to (without external context, will be added automatically) // de.muehlencord.shared.account.loginview.redirecttarget path to redirect to (without external context, will be added automatically)
String executeRedirectString = ec.getInitParameter("de.muehlencord.shared.account.loginview.executeredirect"); String executeRedirectString = ec.getInitParameter("de.muehlencord.shared.account.loginview.executeredirect");
boolean executeRedirect = true; boolean executeRedirect = true;
if (executeRedirectString != null) { if (executeRedirectString != null) {
executeRedirect = Boolean.parseBoolean(executeRedirectString); executeRedirect = Boolean.parseBoolean(executeRedirectString);
} }
String redirectTarget = ec.getInitParameter("de.muehlencord.shared.account.loginview.redirecttarget"); String redirectTarget = ec.getInitParameter("de.muehlencord.shared.account.loginview.redirecttarget");
if ((redirectTarget == null) || (redirectTarget.equals(""))) { if ((redirectTarget == null) || (redirectTarget.equals(""))) {
redirectTarget = "/login.xhtml"; redirectTarget = "/login.xhtml";
} }
if (executeRedirect) { if (executeRedirect) {
String url = ec.getRequestContextPath() + redirectTarget; String url = ec.getRequestContextPath() + redirectTarget;
ec.redirect(url); ec.redirect(url);
} }
} catch (Exception e) { } catch (Exception e) {
LOGGER.warn(e.toString()); LOGGER.warn(e.toString());
} }
} }
public String executePasswordReset() { public String executePasswordReset() {
boolean passwordResetted = accountService.resetPassword(username, password, resetPasswordToken); boolean passwordResetted = accountService.resetPassword(username, password, resetPasswordToken);
if (passwordResetted) { if (passwordResetted) {
// TODO add email notification on updated user account // TODO add email notification on updated user account
FacesUtil.addInfoMessage("Password resetted"); FacesUtil.addGlobalInfoMessage("Password resetted", null);
return login(); return login();
} else { } else {
// TODO add email notificaton on failed password reset // TODO add email notificaton on failed password reset
FacesUtil.addErrorMessage("Password reset failed"); FacesUtil.addGlobalErrorMessage("Password reset failed", null);
return login(); return login();
} }
} }
/* **** naviation rules **** */ /* **** naviation rules **** */
public String login() { public String login() {
return "/login.xhtml"; // TODO make configurable return "/login.xhtml"; // TODO make configurable
} }
/* *** getter / setter */ /* *** getter / setter */
public String getUsername() { public String getUsername() {
return username; return username;
} }
public void setUsername(String un) { public void setUsername(String un) {
this.username = un; this.username = un;
} }
public String getPassword() { public String getPassword() {
return password; return password;
} }
public void setPassword(String pw) { public void setPassword(String pw) {
this.password = pw; this.password = pw;
} }
public boolean isRememberMe() { public boolean isRememberMe() {
return rememberMe; return rememberMe;
} }
public void setRememberMe(boolean rememberMe) { public void setRememberMe(boolean rememberMe) {
this.rememberMe = rememberMe; this.rememberMe = rememberMe;
} }
public String getResetPasswordToken() { public String getResetPasswordToken() {
return resetPasswordToken; return resetPasswordToken;
} }
public void setResetPasswordToken(String resetPasswordToken) { public void setResetPasswordToken(String resetPasswordToken) {
this.resetPasswordToken = resetPasswordToken; this.resetPasswordToken = resetPasswordToken;
} }
} }

View File

@ -1,48 +1,48 @@
package de.muehlencord.shared.account.presentation; package de.muehlencord.shared.account.presentation;
import de.muehlencord.shared.account.business.account.boundary.AccountControl; import de.muehlencord.shared.account.business.account.boundary.AccountControl;
import de.muehlencord.shared.jeeutil.FacesUtil; import de.muehlencord.shared.jeeutil.FacesUtil;
import java.io.Serializable; import java.io.Serializable;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.faces.view.ViewScoped; import javax.faces.view.ViewScoped;
import javax.inject.Named; import javax.inject.Named;
/** /**
* *
* @author joern@muehlencord.de * @author joern@muehlencord.de
*/ */
@Named (value = "lostPasswordView") @Named (value = "lostPasswordView")
@ViewScoped @ViewScoped
public class LostPasswordView implements Serializable { public class LostPasswordView implements Serializable {
private static final long serialVersionUID = -1793445795465830069L; private static final long serialVersionUID = -1793445795465830069L;
@EJB @EJB
private AccountControl accountService; private AccountControl accountService;
private String userName; private String userName;
private boolean passwordResetStarted = false; private boolean passwordResetStarted = false;
public String initPasswordReset() { public String initPasswordReset() {
if (accountService.initPasswordReset(userName)) { if (accountService.initPasswordReset(userName)) {
passwordResetStarted = true; passwordResetStarted = true;
FacesUtil.addInfoMessage("Password reset started, please check your email account"); FacesUtil.addGlobalInfoMessage("Password reset started.", "Please check your email account.");
} else { } else {
FacesUtil.addErrorMessage("Error while resetting password. Please contact your administrator"); FacesUtil.addGlobalErrorMessage("Error while resetting password.", "Please contact your administrator.");
} }
return "/login.xhtml"; // TODO make configurable, get from LoginView? return "/login.xhtml"; // TODO make configurable, get from LoginView?
} }
public String getUserName() { public String getUserName() {
return userName; return userName;
} }
public void setUserName(String userName) { public void setUserName(String userName) {
this.userName = userName; this.userName = userName;
} }
public boolean getPasswordResetStarted() { public boolean getPasswordResetStarted() {
return passwordResetStarted; return passwordResetStarted;
} }
} }

View File

@ -161,7 +161,7 @@ public class WorkbookApp {
newCell.setCellStyle(newCellStyle); newCell.setCellStyle(newCellStyle);
} }
switch (oldCell.getCellTypeEnum()) { switch (oldCell.getCellType()) {
case STRING: case STRING:
newCell.setCellValue(oldCell.getStringCellValue()); newCell.setCellValue(oldCell.getStringCellValue());
break; break;

456
pom.xml
View File

@ -1,229 +1,229 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.muehlencord</groupId> <groupId>de.muehlencord</groupId>
<artifactId>shared</artifactId> <artifactId>shared</artifactId>
<version>1.1-SNAPSHOT</version> <version>1.1-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>shared</name> <name>shared</name>
<modules> <modules>
<module>configuration</module> <module>configuration</module>
<module>network</module> <module>network</module>
<module>security</module> <module>security</module>
<!--<module>sharepoint</module>--> <!--<module>sharepoint</module>-->
<module>util</module> <module>util</module>
<module>jeeutil</module> <module>jeeutil</module>
<module>account</module> <module>account</module>
<module>pdf</module> <module>pdf</module>
<module>shiro-faces</module> <module>shiro-faces</module>
<module>poi-util</module> <module>poi-util</module>
</modules> </modules>
<scm> <scm>
<developerConnection>scm:git:https://jomu.timelord.de/git/jomu/shared/</developerConnection> <developerConnection>scm:git:https://jomu.timelord.de/git/jomu/shared/</developerConnection>
<tag>HEAD</tag> <tag>HEAD</tag>
</scm> </scm>
<properties> <properties>
<!-- project setup --> <!-- project setup -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.target>1.8</maven.compiler.target>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>4.12</version> <!-- TODO needs update to v5 --> <version>4.12</version> <!-- TODO needs update to v5 -->
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mockito</groupId> <groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId> <artifactId>mockito-core</artifactId>
<version>2.21.0</version> <version>2.23.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-codec</groupId> <groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId> <artifactId>commons-codec</artifactId>
<version>1.11</version> <version>1.11</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-net</groupId> <groupId>commons-net</groupId>
<artifactId>commons-net</artifactId> <artifactId>commons-net</artifactId>
<version>3.6</version> <version>3.6</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<version>3.7</version> <version>3.8.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.6</version> <version>2.6</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
<version>1.7.25</version> <version>1.7.25</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId> <artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version> <version>1.7.25</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId> <artifactId>jcl-over-slf4j</artifactId>
<version>1.7.25</version> <version>1.7.25</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sun.mail</groupId> <groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId> <artifactId>javax.mail</artifactId>
<version>1.6.1</version> <version>1.6.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.microsoft.ews-java-api</groupId> <groupId>com.microsoft.ews-java-api</groupId>
<artifactId>ews-java-api</artifactId> <artifactId>ews-java-api</artifactId>
<version>2.0</version> <version>2.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.8.5</version> <version>2.8.5</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.shiro</groupId> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId> <artifactId>shiro-core</artifactId>
<version>1.4.0</version> <version>1.4.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.shiro</groupId> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId> <artifactId>shiro-web</artifactId>
<version>1.4.0</version> <version>1.4.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax</groupId> <groupId>javax</groupId>
<artifactId>javaee-api</artifactId> <artifactId>javaee-api</artifactId>
<version>7.0</version> <version>7.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.enterprisedt</groupId> <groupId>com.enterprisedt</groupId>
<artifactId>edtFTPj</artifactId> <artifactId>edtFTPj</artifactId>
<version>1.5.3</version> <!-- FIXME - requires update --> <version>1.5.3</version> <!-- FIXME - requires update -->
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.lambdaworks</groupId> <groupId>com.lambdaworks</groupId>
<artifactId>scrypt</artifactId> <artifactId>scrypt</artifactId>
<version>1.4.0</version> <version>1.4.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId> <artifactId>bcprov-jdk15on</artifactId>
<version>1.59</version> <version>1.59</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId> <artifactId>hibernate-core</artifactId>
<version>5.0.10.Final</version> <version>5.1.14.Final</version>
<type>jar</type> <type>jar</type>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.pdfbox</groupId> <groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId> <artifactId>pdfbox</artifactId>
<version>2.0.11</version> <version>2.0.12</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.freemarker</groupId> <groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId> <artifactId>freemarker</artifactId>
<version>2.3.28</version> <version>2.3.28</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.primefaces</groupId> <groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId> <artifactId>primefaces</artifactId>
<version>6.2</version> <version>6.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sun.faces</groupId> <groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId> <artifactId>jsf-api</artifactId>
<version>2.2.17</version> <version>2.2.18</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.el</groupId> <groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId> <artifactId>javax.el-api</artifactId>
<version>3.0.0</version> <version>3.0.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<version>3.17</version> <version>4.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.inversoft</groupId> <groupId>com.inversoft</groupId>
<artifactId>prime-jwt</artifactId> <artifactId>prime-jwt</artifactId>
<version>1.3.1</version> <version>1.3.1</version>
</dependency> </dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<build> <build>
<pluginManagement> <pluginManagement>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version> <version>3.8.0</version>
<configuration> <configuration>
<source>${maven.compiler.source}</source> <source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target> <target>${maven.compiler.target}</target>
<showDeprecation>true</showDeprecation> <showDeprecation>true</showDeprecation>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId> <artifactId>jaxb2-maven-plugin</artifactId>
<version>2.4</version> <version>2.4</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId> <artifactId>maven-ejb-plugin</artifactId>
<version>3.0.1</version> <version>3.0.1</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId> <artifactId>jaxws-maven-plugin</artifactId>
<version>2.5</version> <version>2.5</version>
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-release-plugin</artifactId> <artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version> <version>2.5.3</version>
</plugin> </plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-release-plugin</artifactId> <artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version> <version>2.5.3</version>
<configuration> <configuration>
<tagNameFormat>v@{project.version}</tagNameFormat> <tagNameFormat>v@{project.version}</tagNameFormat>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>