diff --git a/struts-1.3.10-CVE-2014-0114.patch b/struts-1.3.10-CVE-2014-0114.patch
new file mode 100644
index 0000000..c162062
--- /dev/null
+++ b/struts-1.3.10-CVE-2014-0114.patch
@@ -0,0 +1,34 @@
+--- src/core/src/main/java/org/apache/struts/util/RequestUtils.java 2008-06-05 00:14:36.000000000 +0200
++++ src/core/src/main/java/org/apache/struts/util/RequestUtils.java-gil 2014-08-12 13:28:38.505029656 +0200
+@@ -54,6 +54,7 @@
+ import java.util.List;
+ import java.util.Locale;
+ import java.util.Map;
++import java.util.regex.Pattern;
+
+ /**
+ *
General purpose utility methods related to processing a servlet request
+@@ -69,6 +70,13 @@
+ */
+ protected static Log log = LogFactory.getLog(RequestUtils.class);
+
++ /**
++ *
Pattern matching 'class' access.
++ */
++ protected static final Pattern CLASS_ACCESS_PATTERN = Pattern
++ .compile("(.*\\.|^|.*|\\[('|\"))class(\\.|('|\")]|\\[).*",
++ Pattern.CASE_INSENSITIVE);
++
+ // --------------------------------------------------------- Public Methods
+
+ /**
+@@ -463,7 +471,8 @@
+
+ // Populate parameters, except "standard" struts attributes
+ // such as 'org.apache.struts.action.CANCEL'
+- if (!(stripped.startsWith("org.apache.struts."))) {
++ if (!(stripped.startsWith("org.apache.struts."))
++ && !CLASS_ACCESS_PATTERN.matcher(stripped).matches()) {
+ properties.put(stripped, parameterValue);
+ }
+ }
diff --git a/struts-1.3.10-CVE-2015-0899.patch b/struts-1.3.10-CVE-2015-0899.patch
new file mode 100644
index 0000000..a4129cf
--- /dev/null
+++ b/struts-1.3.10-CVE-2015-0899.patch
@@ -0,0 +1,441 @@
+diff -Nru struts-1.3.10/src/core/pom.xml struts-1.3.10.CVE-2015-0899/src/core/pom.xml
+--- struts-1.3.10/src/core/pom.xml 2015-03-30 12:13:30.943199760 +0200
++++ struts-1.3.10.CVE-2015-0899/src/core/pom.xml 2015-03-30 12:40:00.302267718 +0200
+@@ -184,6 +184,12 @@
+ oro
+ 2.0.8
+
++
++ log4j
++ log4j
++ 1.2.17
++ test
++
+
+
+
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/config/ActionConfig.java struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/config/ActionConfig.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/config/ActionConfig.java 2008-06-05 00:13:42.000000000 +0200
++++ struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/config/ActionConfig.java 2015-03-30 12:20:14.202124216 +0200
+@@ -861,6 +861,36 @@
+ }
+ }
+
++ // 2014/07/02 - security problem patch.
++ // Author: NTT DATA Corporation
++ /**
++ * Accepted page value for multi-page validation.
++ * If two or more page values are accepted, then acceptPage is set minimum of them.
++ * If multi-page validation is not use, acceptPage is not set. Then multi-page validation is disabled.
++ * @since Struts 1.2.9-sp2
++ */
++ protected Integer acceptPage = null;
++
++ /**
++ * Returns accepted page value for multi-page validation.
++ *
++ * @return Accepted page value for multi-page validation
++ * @since Struts 1.2.9-sp2
++ */
++ public Integer getAcceptPage() {
++ return acceptPage;
++ }
++
++ /**
++ * Set accepted page value for multi-page validation.
++ *
++ * @param acceptPage Accepted page value for multi-page validation
++ * @since Struts 1.2.9-sp2
++ */
++ public void setAcceptPage(Integer acceptPage) {
++ this.acceptPage = acceptPage;
++ }
++
+ // --------------------------------------------------------- Public Methods
+
+ /**
+@@ -1283,6 +1313,11 @@
+ sb.append(type);
+ }
+
++ // 2014/07/02 - security problem patch.
++ // Author: NTT DATA Corporation
++ sb.append(",acceptPage=");
++ sb.append(acceptPage);
++
+ return (sb.toString());
+ }
+ }
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/util/RequestUtils.java struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/util/RequestUtils.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/util/RequestUtils.java 2015-03-30 12:13:31.002196823 +0200
++++ struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/util/RequestUtils.java 2015-03-30 12:23:40.352806356 +0200
+@@ -469,6 +469,14 @@
+ parameterValue = request.getParameterValues(name);
+ }
+
++ // 2014/05/13 - CVE-2014-0114 security problem patch.
++ // Author: NTT DATA Corporation
++ if (stripped.startsWith("class.") || stripped.indexOf(".class.") >= 0) {
++ // this log output is only for detection of invalid parameters and not an integral part of the bug fix
++ log.info("ignore parameter: paramName=" + stripped);
++ continue;
++ }
++
+ // Populate parameters, except "standard" struts attributes
+ // such as 'org.apache.struts.action.CANCEL'
+ if (!(stripped.startsWith("org.apache.struts."))
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/validator/DynaValidatorForm.java struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/validator/DynaValidatorForm.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/validator/DynaValidatorForm.java 2008-06-05 00:14:02.000000000 +0200
++++ struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/validator/DynaValidatorForm.java 2015-03-30 12:22:30.733325776 +0200
+@@ -112,9 +112,12 @@
+
+ String validationKey = getValidationKey(mapping, request);
+
++ // 2014/07/02 - security problem patch.
++ // Author: NTT DATA Corporation
++ int validationPage = determinePage(mapping, request);
+ Validator validator =
+ Resources.initValidator(validationKey, this, application, request,
+- errors, page);
++ errors, validationPage);
+
+ try {
+ validatorResults = validator.validate();
+@@ -125,6 +128,24 @@
+ return errors;
+ }
+
++ // 2014/07/02 - security problem patch.
++ // Author: NTT DATA Corporation
++ /**
++ * Determine validation page.
++ * If acceptPage of ActionMapping is null, then returns Integer.MAX_VALUE.
++ * (multi-page validation is disabled. All validation fields are enabled.)
++ * If page property is less than acceptPage of ActionMapping, returns acceptPage value.
++ * If page property is greater than or equal to acceptPage of ActionMapping, returns page property value.
++ * @param mapping The mapping used to select this instance.
++ * @param request The servlet request we are processing.
++ * @return validation page.
++ * @since Struts 1.2.9-sp2
++ */
++ protected int determinePage(ActionMapping mapping, HttpServletRequest request) {
++ Integer acceptPage = mapping.getAcceptPage();
++ return acceptPage != null ? Math.max(acceptPage.intValue(), page) : Integer.MAX_VALUE;
++ }
++
+ /**
+ * Returns the Validation key.
+ *
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/validator/ValidatorForm.java struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/validator/ValidatorForm.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/validator/ValidatorForm.java 2008-06-05 00:14:02.000000000 +0200
++++ struts-1.3.10.CVE-2015-0899/src/core/src/main/java/org/apache/struts/validator/ValidatorForm.java 2015-03-30 12:36:22.312287599 +0200
+@@ -108,9 +108,12 @@
+
+ String validationKey = getValidationKey(mapping, request);
+
++ // 2014/07/02 - security problem patch.
++ // Author: NTT DATA Corporation
++ int validationPage = determinePage(mapping, request);
+ Validator validator =
+ Resources.initValidator(validationKey, this, application, request,
+- errors, page);
++ errors, validationPage);
+
+ try {
+ validatorResults = validator.validate();
+@@ -121,6 +124,24 @@
+ return errors;
+ }
+
++ // 2014/07/02 - security problem patch.
++ // Author: NTT DATA Corporation
++ /**
++ * Determine validation page.
++ * If acceptPage of ActionMapping is null, then returns Integer.MAX_VALUE.
++ * (multi-page validation is disabled. All validation fields are enabled.)
++ * If page property is less than acceptPage of ActionMapping, returns acceptPage value.
++ * If page property is greater than or equal to acceptPage of ActionMapping, returns page property value.
++ * @param mapping The mapping used to select this instance.
++ * @param request The servlet request we are processing.
++ * @return validation page.
++ * @since Struts 1.2.9-sp2
++ */
++ protected int determinePage(ActionMapping mapping, HttpServletRequest request) {
++ Integer acceptPage = mapping.getAcceptPage();
++ return acceptPage != null ? Math.max(acceptPage.intValue(), page) : Integer.MAX_VALUE;
++ }
++
+ /**
+ * Returns the Validation key.
+ *
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java struts-1.3.10.CVE-2015-0899/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java 2015-03-30 12:13:30.984197719 +0200
++++ struts-1.3.10.CVE-2015-0899/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java 2015-03-30 12:33:30.592968395 +0200
+@@ -21,11 +21,19 @@
+
+ package org.apache.struts.util;
+
++import java.io.BufferedReader;
++import java.io.StringReader;
++import java.io.StringWriter;
++import java.util.HashSet;
++
+ import javax.servlet.ServletException;
+
+ import junit.framework.Test;
+ import junit.framework.TestSuite;
+
++import org.apache.log4j.LogManager;
++import org.apache.log4j.PatternLayout;
++import org.apache.log4j.WriterAppender;
+ import org.apache.struts.action.ActionMapping;
+ import org.apache.struts.util.RequestUtils;
+ import org.apache.struts.Globals;
+@@ -120,4 +128,247 @@
+
+ }
+
++ /**
++ * Ensure that the parameter of HTTP request
++ * which causes ClassLoader manipulation is ignored.
++ *
++ * The purpose of this test is to ensure that security problem
++ * CVE-2014-0114 is fixed.
++ *
++ */
++ public void testRequestParameterIgnore1() throws Exception {
++
++ String stringValue = "Test";
++
++ MockFormBean mockForm = new MockFormBean();
++
++ // Set up the mock HttpServletRequest
++ request.setMethod("GET");
++ request.setContentType("");
++
++ request.addParameter("class.xxx.case1", stringValue);
++
++ // logger
++ StringWriter writer = new StringWriter();
++ WriterAppender appender = new WriterAppender(new PatternLayout("%p, %m%n"), writer);
++ LogManager.getRootLogger().addAppender(appender);
++ LogManager.getRootLogger().setAdditivity(false);
++
++ // Try to populate
++ HashSet ignoreSet = new HashSet();
++ try {
++ RequestUtils.populate(mockForm, request);
++
++ String keyword1 = "INFO, ";
++ String keyword2 = "ignore parameter: paramName=";
++ String logString = writer.toString();
++ StringReader reader = new StringReader(logString);
++ BufferedReader bufReader = new BufferedReader(reader);
++ String line = null;
++ while ((line = bufReader.readLine()) != null) {
++ if (!line.startsWith(keyword1)) {
++ continue;
++ }
++ int pos = line.indexOf(keyword2);
++ if (pos >= 0) {
++ ignoreSet.add(line.substring(pos + keyword2.length()));
++ }
++ }
++ } catch(ServletException se) {
++ fail("Occur exception.");
++ } finally {
++ LogManager.getRootLogger().removeAppender(appender);
++ LogManager.getRootLogger().setAdditivity(true);
++ }
++
++ // Check
++ assertEquals("ignore num no match", 1, ignoreSet.size());
++ assertTrue("not exists ignore parameter class.xxx.case1", ignoreSet.contains("class.xxx.case1"));
++ assertNull("ActionForm property set", mockForm.getStringProperty());
++
++ }
++
++ /**
++ * Ensure that the parameter of HTTP request
++ * which causes ClassLoader manipulation is ignored.
++ *
++ * The purpose of this test is to ensure that security problem
++ * CVE-2014-0114 is fixed.
++ *
++ */
++ public void testRequestParameterIgnore2() throws Exception {
++
++ String stringValue = "Test";
++
++ MockFormBean mockForm = new MockFormBean();
++
++ // Set up the mock HttpServletRequest
++ request.setMethod("GET");
++ request.setContentType("");
++
++ request.addParameter("xxx.class.case2", stringValue);
++
++ // logger
++ StringWriter writer = new StringWriter();
++ WriterAppender appender = new WriterAppender(new PatternLayout("%p, %m%n"), writer);
++ LogManager.getRootLogger().addAppender(appender);
++ LogManager.getRootLogger().setAdditivity(false);
++
++ // Try to populate
++ HashSet ignoreSet = new HashSet();
++ try {
++ RequestUtils.populate(mockForm, request);
++
++ String keyword1 = "INFO, ";
++ String keyword2 = "ignore parameter: paramName=";
++ String logString = writer.toString();
++ StringReader reader = new StringReader(logString);
++ BufferedReader bufReader = new BufferedReader(reader);
++ String line = null;
++ while ((line = bufReader.readLine()) != null) {
++ if (!line.startsWith(keyword1)) {
++ continue;
++ }
++ int pos = line.indexOf(keyword2);
++ if (pos >= 0) {
++ ignoreSet.add(line.substring(pos + keyword2.length()));
++ }
++ }
++ } catch(ServletException se) {
++ fail("Occur exception.");
++ } finally {
++ LogManager.getRootLogger().removeAppender(appender);
++ LogManager.getRootLogger().setAdditivity(true);
++ }
++
++ // Check
++ assertEquals("ignore num no match", 1, ignoreSet.size());
++ assertTrue("not exists ignore parameter xxx.class.case2", ignoreSet.contains("xxx.class.case2"));
++ assertNull("ActionForm property set", mockForm.getStringProperty());
++
++ }
++
++ /**
++ * Ensure that the parameter of HTTP request
++ * which causes ClassLoader manipulation is ignored.
++ *
++ * The purpose of this test is to ensure that security problem
++ * CVE-2014-0114 is fixed.
++ *
++ */
++ public void testRequestParameterIgnore3() throws Exception {
++
++ String stringValue = "Test";
++
++ MockFormBean mockForm = new MockFormBean();
++
++ // Set up the mock HttpServletRequest
++ request.setMethod("GET");
++ request.setContentType("");
++
++ request.addParameter("stringProperty", stringValue);
++
++ // logger
++ StringWriter writer = new StringWriter();
++ WriterAppender appender = new WriterAppender(new PatternLayout("%p, %m%n"), writer);
++ LogManager.getRootLogger().addAppender(appender);
++ LogManager.getRootLogger().setAdditivity(false);
++
++ // Try to populate
++ HashSet ignoreSet = new HashSet();
++ try {
++ RequestUtils.populate(mockForm, request);
++
++ String keyword1 = "INFO, ";
++ String keyword2 = "ignore parameter: paramName=";
++ String logString = writer.toString();
++ StringReader reader = new StringReader(logString);
++ BufferedReader bufReader = new BufferedReader(reader);
++ String line = null;
++ while ((line = bufReader.readLine()) != null) {
++ if (!line.startsWith(keyword1)) {
++ continue;
++ }
++ int pos = line.indexOf(keyword2);
++ if (pos >= 0) {
++ ignoreSet.add(line.substring(pos + keyword2.length()));
++ }
++ }
++ } catch(ServletException se) {
++ fail("Occur exception.");
++ } finally {
++ LogManager.getRootLogger().removeAppender(appender);
++ LogManager.getRootLogger().setAdditivity(true);
++ }
++
++ // Check
++ assertEquals("ignore num no match", 0, ignoreSet.size());
++ assertFalse("exists ignore parameter stringProperty", ignoreSet.contains("stringProperty"));
++ assertEquals("ActionForm property not equal", stringValue, mockForm.getStringProperty());
++
++ }
++
++ /**
++ * Ensure that the parameter of HTTP request
++ * which causes ClassLoader manipulation is ignored.
++ *
++ * The purpose of this test is to ensure that security problem
++ * CVE-2014-0114 is fixed.
++ *
++ */
++ public void testRequestParameterIgnore4() throws Exception {
++
++ String stringValue = "Test";
++
++ MockFormBean mockForm = new MockFormBean();
++
++ // Set up the mock HttpServletRequest
++ request.setMethod("GET");
++ request.setContentType("");
++
++ request.addParameter("class.xxx.case4", stringValue);
++ request.addParameter("xxx.class.case4", stringValue);
++ request.addParameter("stringProperty", stringValue);
++
++ // logger
++ StringWriter writer = new StringWriter();
++ WriterAppender appender = new WriterAppender(new PatternLayout("%p, %m%n"), writer);
++ LogManager.getRootLogger().addAppender(appender);
++ LogManager.getRootLogger().setAdditivity(false);
++
++ // Try to populate
++ HashSet ignoreSet = new HashSet();
++ try {
++ RequestUtils.populate(mockForm, request);
++
++ String keyword1 = "INFO, ";
++ String keyword2 = "ignore parameter: paramName=";
++ String logString = writer.toString();
++ StringReader reader = new StringReader(logString);
++ BufferedReader bufReader = new BufferedReader(reader);
++ String line = null;
++ while ((line = bufReader.readLine()) != null) {
++ if (!line.startsWith(keyword1)) {
++ continue;
++ }
++ int pos = line.indexOf(keyword2);
++ if (pos >= 0) {
++ ignoreSet.add(line.substring(pos + keyword2.length()));
++ }
++ }
++ } catch(ServletException se) {
++ fail("Occur exception.");
++ } finally {
++ LogManager.getRootLogger().removeAppender(appender);
++ LogManager.getRootLogger().setAdditivity(true);
++ }
++
++ // Check
++ assertEquals("ignore num no match", 2, ignoreSet.size());
++ assertTrue("not exists ignore parameter class.xxx.case4", ignoreSet.contains("class.xxx.case4"));
++ assertTrue("not exists ignore parameter xxx.class.case4", ignoreSet.contains("xxx.class.case4"));
++ assertEquals("ActionForm property not equal", stringValue, mockForm.getStringProperty());
++
++ }
++
+ }
diff --git a/struts-1.3.10-CVE-2016-1181-CVE-2016-1182.patch b/struts-1.3.10-CVE-2016-1181-CVE-2016-1182.patch
new file mode 100644
index 0000000..a92912e
--- /dev/null
+++ b/struts-1.3.10-CVE-2016-1181-CVE-2016-1182.patch
@@ -0,0 +1,40 @@
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/action/ActionServlet.java struts-1.3.10.CVE-2016-1181-CVE-2016-1182/src/core/src/main/java/org/apache/struts/action/ActionServlet.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/action/ActionServlet.java 2008-06-05 00:14:28.000000000 +0200
++++ struts-1.3.10.CVE-2016-1181-CVE-2016-1182/src/core/src/main/java/org/apache/struts/action/ActionServlet.java 2016-06-22 15:19:33.998721694 +0200
+@@ -23,6 +23,7 @@
+ import org.apache.commons.beanutils.BeanUtils;
+ import org.apache.commons.beanutils.ConvertUtils;
+ import org.apache.commons.beanutils.PropertyUtils;
++import org.apache.commons.beanutils.SuppressPropertiesBeanIntrospector;
+ import org.apache.commons.beanutils.converters.BigDecimalConverter;
+ import org.apache.commons.beanutils.converters.BigIntegerConverter;
+ import org.apache.commons.beanutils.converters.BooleanConverter;
+@@ -76,6 +77,7 @@
+
+ import java.util.ArrayList;
+ import java.util.Enumeration;
++import java.util.HashSet;
+ import java.util.Iterator;
+ import java.util.List;
+ import java.util.MissingResourceException;
+@@ -1700,8 +1702,19 @@
+ */
+ protected void initOther()
+ throws ServletException {
+- String value;
+
++ /* Fix CVE-2016-1181 CVE-2016-1182 start */
++ HashSet suppressProperties = new HashSet();
++ suppressProperties.add("class");
++ suppressProperties.add("multipartRequestHandler");
++ suppressProperties.add("resultValueMap");
++
++ PropertyUtils.addBeanIntrospector(
++ new SuppressPropertiesBeanIntrospector(suppressProperties));
++ PropertyUtils.clearDescriptors();
++
++ String value = null;
++ /* Fix CVE-2016-1181 CVE-2016-1182 end */
+ value = getServletConfig().getInitParameter("config");
+
+ if (value != null) {
diff --git a/struts-1.3.10-clean-src.tar.gz b/struts-1.3.10-clean-src.tar.gz
new file mode 100644
index 0000000..f61111d
Binary files /dev/null and b/struts-1.3.10-clean-src.tar.gz differ
diff --git a/struts-1.3.10-fix-build.patch b/struts-1.3.10-fix-build.patch
new file mode 100644
index 0000000..d83a675
--- /dev/null
+++ b/struts-1.3.10-fix-build.patch
@@ -0,0 +1,598 @@
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockHttpServletRequest.java struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockHttpServletRequest.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockHttpServletRequest.java 2008-06-05 00:14:08.000000000 +0200
++++ struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockHttpServletRequest.java 2015-08-25 13:53:15.103688346 +0200
+@@ -20,16 +20,29 @@
+ */
+ package org.apache.struts.mock;
+
++import javax.servlet.AsyncContext;
++import javax.servlet.DispatcherType;
+ import javax.servlet.RequestDispatcher;
++import javax.servlet.ServletContext;
++import javax.servlet.ServletException;
+ import javax.servlet.ServletInputStream;
++import javax.servlet.ServletRequest;
++import javax.servlet.ServletResponse;
+ import javax.servlet.http.Cookie;
+ import javax.servlet.http.HttpServletRequest;
++import javax.servlet.http.HttpServletResponse;
+ import javax.servlet.http.HttpSession;
++import javax.servlet.http.HttpUpgradeHandler;
++import javax.servlet.http.Part;
+
+ import java.io.BufferedReader;
++import java.io.IOException;
++
++import java.lang.IllegalStateException;
+
+ import java.security.Principal;
+
++import java.util.Collection;
+ import java.util.Enumeration;
+ import java.util.HashMap;
+ import java.util.Locale;
+@@ -425,4 +438,100 @@
+ public void setCharacterEncoding(String name) {
+ throw new UnsupportedOperationException();
+ }
++
++ public int getLocalPort() {
++ throw new UnsupportedOperationException();
++ }
++
++ public String getLocalAddr() {
++ throw new UnsupportedOperationException();
++ }
++
++ public String getLocalName() {
++ throw new UnsupportedOperationException();
++ }
++
++ public int getRemotePort() {
++ throw new UnsupportedOperationException();
++ }
++
++ public String getRemoteName() {
++ throw new UnsupportedOperationException();
++ }
++
++ public Part getPart(String name) throws IOException, IllegalStateException, ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public Collection getParts() throws IOException, IllegalStateException, ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void logout() throws ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void login(String username, String password) throws ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public boolean authenticate(HttpServletResponse response) throws IOException, ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public DispatcherType getDispatcherType() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public AsyncContext getAsyncContext() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public boolean isAsyncSupported() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public boolean isAsyncStarted() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public AsyncContext startAsync() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public ServletContext getServletContext() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public T upgrade(Class arg0) throws IOException, ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not implemented yet");
++ }
++
++ public String changeSessionId() {
++ // TODO
++ throw new UnsupportedOperationException("Not implemented yet");
++ }
++
++ public long getContentLengthLong() {
++ // TODO
++ throw new UnsupportedOperationException("Not implemented yet");
++ }
++
+ }
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockHttpServletResponse.java struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockHttpServletResponse.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockHttpServletResponse.java 2008-06-05 00:14:16.000000000 +0200
++++ struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockHttpServletResponse.java 2015-08-25 13:53:15.103688346 +0200
+@@ -20,6 +20,7 @@
+ */
+ package org.apache.struts.mock;
+
++import javax.servlet.ServletException;
+ import javax.servlet.ServletOutputStream;
+ import javax.servlet.http.Cookie;
+ import javax.servlet.http.HttpServletResponse;
+@@ -27,6 +28,7 @@
+ import java.io.IOException;
+ import java.io.PrintWriter;
+
++import java.util.Collection;
+ import java.util.Locale;
+
+ /**
+@@ -169,7 +171,46 @@
+ throw new UnsupportedOperationException();
+ }
+
++ public String getContentType() {
++ throw new UnsupportedOperationException();
++ }
++
+ public void setLocale(Locale locale) {
+ throw new UnsupportedOperationException();
+ }
++
++ public void setCharacterEncoding(String enc) {
++ throw new UnsupportedOperationException();
++ }
++
++ public Collection getHeaderNames() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public String getHeader(String name) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public Collection getHeaders(String name) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void logout() throws ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public int getStatus() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void setContentLengthLong(long arg0) {
++ // TODO
++ throw new UnsupportedOperationException("Not implemented yet");
++ }
++
+ }
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockPageContext.java struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockPageContext.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockPageContext.java 2008-06-05 00:14:08.000000000 +0200
++++ struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockPageContext.java 2015-08-25 13:53:15.104688299 +0200
+@@ -20,6 +20,7 @@
+ */
+ package org.apache.struts.mock;
+
++import javax.el.ELContext;
+ import javax.servlet.Servlet;
+ import javax.servlet.ServletConfig;
+ import javax.servlet.ServletContext;
+@@ -29,6 +30,8 @@
+ import javax.servlet.http.HttpSession;
+ import javax.servlet.jsp.JspWriter;
+ import javax.servlet.jsp.PageContext;
++import javax.servlet.jsp.el.VariableResolver;
++import javax.servlet.jsp.el.ExpressionEvaluator;
+ import javax.servlet.jsp.tagext.BodyContent;
+
+ import java.io.IOException;
+@@ -533,6 +536,22 @@
+ throw new UnsupportedOperationException();
+ }
+
++ public void include(String relativeUrlPath, boolean flush) {
++ throw new UnsupportedOperationException();
++ }
++
++ public VariableResolver getVariableResolver() {
++ throw new UnsupportedOperationException();
++ }
++
++ public ELContext getELContext() {
++ throw new UnsupportedOperationException();
++ }
++
++ public ExpressionEvaluator getExpressionEvaluator() {
++ throw new UnsupportedOperationException();
++ }
++
+ public void initialize(Servlet servlet, ServletRequest request,
+ ServletResponse response, String errorPageURL, boolean needsSession,
+ int bufferSize, boolean autoFlush) {
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockServletContext.java struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockServletContext.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/MockServletContext.java 2008-06-05 00:14:06.000000000 +0200
++++ struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/MockServletContext.java 2015-08-25 13:53:15.104688299 +0200
+@@ -23,16 +23,32 @@
+ import org.apache.commons.logging.Log;
+ import org.apache.commons.logging.LogFactory;
+
++import javax.servlet.Filter;
++import javax.servlet.FilterRegistration;
++import javax.servlet.FilterRegistration.Dynamic;
+ import javax.servlet.RequestDispatcher;
+ import javax.servlet.Servlet;
+ import javax.servlet.ServletContext;
++import javax.servlet.ServletException;
++import javax.servlet.SessionCookieConfig;
++import javax.servlet.SessionTrackingMode;
++import javax.servlet.ServletRegistration;
++import javax.servlet.descriptor.JspConfigDescriptor;
+
+ import java.io.InputStream;
+
++import java.lang.Class;
++import java.lang.ClassLoader;
++import java.lang.IllegalArgumentException;
++import java.lang.IllegalStateException;
++import java.lang.UnsupportedOperationException;
++
+ import java.net.URL;
+
+ import java.util.Enumeration;
++import java.util.EventListener;
+ import java.util.HashMap;
++import java.util.Map;
+ import java.util.Set;
+
+ /**
+@@ -91,6 +107,10 @@
+ throw new UnsupportedOperationException();
+ }
+
++ public String getContextPath() {
++ throw new UnsupportedOperationException();
++ }
++
+ public String getInitParameter(String name) {
+ return ((String) parameters.get(name));
+ }
+@@ -182,4 +202,139 @@
+ attributes.put(name, value);
+ }
+ }
++
++ public JspConfigDescriptor getJspConfigDescriptor() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public ClassLoader getClassLoader() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void declareRoles(String... roleNames) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public T createListener(Class c) throws ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void addListener(T t) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void addListener(String className) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void addListener(Class extends EventListener> listenerClass) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public Set getEffectiveSessionTrackingModes() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public Set getDefaultSessionTrackingModes() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public void setSessionTrackingModes(Set sessionTrackingModes) throws IllegalStateException, IllegalArgumentException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public SessionCookieConfig getSessionCookieConfig() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public Map getFilterRegistrations() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public FilterRegistration getFilterRegistration(String filterName) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public T createFilter(Class c) throws ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public FilterRegistration.Dynamic addFilter(String filterName, Class extends Filter> filterClass) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public FilterRegistration.Dynamic addFilter(String filterName, Filter filter) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public FilterRegistration.Dynamic addFilter(String filterName, String className) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public Map getServletRegistrations() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public ServletRegistration getServletRegistration(String servletName) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public T createServlet(Class c) throws ServletException {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public ServletRegistration.Dynamic addServlet(String servletName, Class extends Servlet> servletClass) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public ServletRegistration.Dynamic addServlet(String servletName, String className) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public boolean setInitParameter(String name, String value) {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public int getEffectiveMinorVersion() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public int getEffectiveMajorVersion() {
++ // TODO
++ throw new UnsupportedOperationException("Not supported.");
++ }
++
++ public String getVirtualServerName() {
++ // TODO
++ throw new UnsupportedOperationException("Not implemented yet");
++ }
+ }
+diff -Nru struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/TestMockBase.java struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/TestMockBase.java
+--- struts-1.3.10/src/core/src/main/java/org/apache/struts/mock/TestMockBase.java 2008-06-05 00:14:06.000000000 +0200
++++ struts-1.3.10.build/src/core/src/main/java/org/apache/struts/mock/TestMockBase.java 2015-08-25 13:53:15.104688299 +0200
+@@ -64,7 +64,7 @@
+ }
+
+ public static void main(String[] args) {
+- junit.awtui.TestRunner.main(new String[] { TestMockBase.class.getName() });
++ junit.textui.TestRunner.main(new String[] { TestMockBase.class.getName() });
+ }
+
+ public static Test suite() {
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestActionMessage.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestActionMessage.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestActionMessage.java 2008-06-05 00:12:56.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestActionMessage.java 2015-08-25 13:53:15.105688251 +0200
+@@ -60,7 +60,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestActionMessage.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestActionMessages.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestActionMessages.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestActionMessages.java 2008-06-05 00:12:58.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestActionMessages.java 2015-08-25 13:53:15.105688251 +0200
+@@ -57,7 +57,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestActionMessages.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestActionServlet.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestActionServlet.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestActionServlet.java 2008-06-05 00:12:58.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestActionServlet.java 2015-08-25 13:53:15.106688204 +0200
+@@ -92,7 +92,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestActionServlet.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestDynaActionFormClass.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestDynaActionFormClass.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestDynaActionFormClass.java 2008-06-05 00:12:58.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestDynaActionFormClass.java 2015-08-25 13:53:15.106688204 +0200
+@@ -93,7 +93,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestDynaActionFormClass.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestDynaActionForm.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestDynaActionForm.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/action/TestDynaActionForm.java 2008-06-05 00:12:58.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/action/TestDynaActionForm.java 2015-08-25 13:53:15.107688156 +0200
+@@ -90,7 +90,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestDynaActionForm.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/config/TestActionConfigMatcher.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/config/TestActionConfigMatcher.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/config/TestActionConfigMatcher.java 2008-06-05 00:12:52.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/config/TestActionConfigMatcher.java 2015-08-25 13:53:15.107688156 +0200
+@@ -40,7 +40,7 @@
+ }
+
+ public static void main(String[] args) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestActionConfigMatcher.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestPropertyMessageResources.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/util/TestPropertyMessageResources.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestPropertyMessageResources.java 2008-06-05 00:13:00.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/util/TestPropertyMessageResources.java 2015-08-25 13:53:15.108688109 +0200
+@@ -45,7 +45,7 @@
+ }
+
+ public static void main(String[] args) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestPropertyMessageResources.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestRequestUtils.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/util/TestRequestUtils.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestRequestUtils.java 2008-06-05 00:13:02.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/util/TestRequestUtils.java 2015-08-25 13:53:15.108688109 +0200
+@@ -49,7 +49,7 @@
+ }
+
+ public static void main(String[] args) {
+- junit.awtui.TestRunner.main(new String[] {
++ junit.textui.TestRunner.main(new String[] {
+ TestRequestUtils.class.getName()
+ });
+ }
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java 2008-06-05 00:13:00.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/util/TestRequestUtilsPopulate.java 2015-08-25 13:53:15.109688061 +0200
+@@ -55,7 +55,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(
++ junit.textui.TestRunner.main(
+ new String[] { TestRequestUtilsPopulate.class.getName()});
+ }
+
+diff -Nru struts-1.3.10/src/core/src/test/java/org/apache/struts/validator/TestValidWhen.java struts-1.3.10.build/src/core/src/test/java/org/apache/struts/validator/TestValidWhen.java
+--- struts-1.3.10/src/core/src/test/java/org/apache/struts/validator/TestValidWhen.java 2008-06-05 00:12:54.000000000 +0200
++++ struts-1.3.10.build/src/core/src/test/java/org/apache/struts/validator/TestValidWhen.java 2015-08-25 13:53:15.109688061 +0200
+@@ -57,7 +57,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] { TestValidWhen.class.getName() });
++ junit.textui.TestRunner.main(new String[] { TestValidWhen.class.getName() });
+ }
+
+ /**
+diff -Nru struts-1.3.10/src/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java struts-1.3.10.build/src/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java
+--- struts-1.3.10/src/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java 2008-06-05 00:04:20.000000000 +0200
++++ struts-1.3.10.build/src/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java 2015-08-25 13:53:15.111687966 +0200
+@@ -55,7 +55,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] { TestHtmlTag.class.getName() });
++ junit.textui.TestRunner.main(new String[] { TestHtmlTag.class.getName() });
+ }
+
+ /**
+diff -Nru struts-1.3.10/src/taglib/src/test/java/org/apache/struts/taglib/TestTagUtils.java struts-1.3.10.build/src/taglib/src/test/java/org/apache/struts/taglib/TestTagUtils.java
+--- struts-1.3.10/src/taglib/src/test/java/org/apache/struts/taglib/TestTagUtils.java 2008-06-05 00:04:22.000000000 +0200
++++ struts-1.3.10.build/src/taglib/src/test/java/org/apache/struts/taglib/TestTagUtils.java 2015-08-25 13:53:15.112687918 +0200
+@@ -70,7 +70,7 @@
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+- junit.awtui.TestRunner.main(new String[] { TestTagUtils.class.getName() });
++ junit.textui.TestRunner.main(new String[] { TestTagUtils.class.getName() });
+ }
+
+ /**
+diff -Nru struts-1.3.10/src/tiles/src/test/java/org/apache/struts/tiles/TestTilesPlugin.java struts-1.3.10.build/src/tiles/src/test/java/org/apache/struts/tiles/TestTilesPlugin.java
+--- struts-1.3.10/src/tiles/src/test/java/org/apache/struts/tiles/TestTilesPlugin.java 2008-06-05 00:02:02.000000000 +0200
++++ struts-1.3.10.build/src/tiles/src/test/java/org/apache/struts/tiles/TestTilesPlugin.java 2015-08-25 13:53:15.112687918 +0200
+@@ -55,7 +55,7 @@
+
+
+ public static void main(String args[]) {
+- junit.awtui.TestRunner.main
++ junit.textui.TestRunner.main
+ (new String[] { TestTilesPlugin.class.getName() } );
+ }
+
diff --git a/struts-1.3.10-src.zip b/struts-1.3.10-src.zip
new file mode 100644
index 0000000..0cde9f5
Binary files /dev/null and b/struts-1.3.10-src.zip differ
diff --git a/struts.spec b/struts.spec
new file mode 100644
index 0000000..2b666ff
--- /dev/null
+++ b/struts.spec
@@ -0,0 +1,121 @@
+Name: struts
+Version: 1.3.10
+Release: 1
+Summary: Web application framework
+License: ASL 2.0
+URL: http://struts.apache.org/
+# wget http://archive.apache.org/dist/struts/source/struts-1.3.10-src.zip
+# remove non free resources
+# unzip -qq struts-1.3.10-src.zip
+# rm -r struts-1.3.10/src/core/src/main/resources/org/apache/struts/resources/web-app_2_3.dtd
+# tar czf struts-1.3.10-clean-src.tar.gz struts-1.3.10
+Source0: struts-%{version}-clean-src.tar.gz
+
+# fix build for junit servlet-3.0-api
+Patch1: struts-1.3.10-fix-build.patch
+# Thanks to Arun Babu Neelicattu aneelica@redhat.com
+# and Brandon.Vincent@asu.edu
+Patch2: struts-1.3.10-CVE-2014-0114.patch
+Patch3: struts-1.3.10-CVE-2015-0899.patch
+Patch4: struts-1.3.10-CVE-2016-1181-CVE-2016-1182.patch
+
+BuildRequires: maven-local mvn(antlr:antlr) mvn(commons-beanutils:commons-beanutils)
+BuildRequires: mvn(commons-chain:commons-chain) mvn(commons-digester:commons-digester)
+BuildRequires: mvn(commons-fileupload:commons-fileupload) mvn(commons-logging:commons-logging)
+BuildRequires: mvn(commons-validator:commons-validator) mvn(junit:junit)
+BuildRequires: mvn(log4j:log4j:1.2.17) mvn(org.apache.bsf:bsf)
+BuildRequires: mvn(org.apache.taglibs:taglibs-standard-jstlel)
+BuildRequires: mvn(org.jboss.spec.javax.el:jboss-el-api_3.0_spec)
+BuildRequires: mvn(org.jboss.spec.javax.faces:jboss-jsf-api_2.2_spec)
+BuildRequires: mvn(org.jboss.spec.javax.servlet.jsp:jboss-jsp-api_2.3_spec)
+BuildRequires: mvn(org.jboss.spec.javax.servlet:jboss-servlet-api_3.1_spec) mvn(oro:oro)
+
+BuildArch: noarch
+Obsoletes: %{name}-manual < %{version}
+Obsoletes: %{name}-webapps-tomcat5 < %{version}
+
+%description
+Welcome to the Struts Framework! The goal of this project is to provide
+an open source framework useful in building web applications with Java
+Servlet and JavaServer Pages (JSP) technology. Struts encourages
+application architectures based on the Model-View-Controller (MVC)
+design paradigm, colloquially known as Model 2 in discussions on various
+servlet and JSP related mailing lists.
+Struts includes the following primary areas of functionality:
+A controller servlet that dispatches requests to appropriate Action
+classes provided by the application developer.
+JSP custom tag libraries, and associated support in the controller
+servlet, that assists developers in creating interactive form-based
+applications.
+Utility classes to support XML parsing, automatic population of
+JavaBeans properties based on the Java reflection APIs, and
+internationalization of prompts and messages.
+
+%package javadoc
+Summary: Javadoc for %{name}
+
+%description javadoc
+This package contains javadoc for %{name}.
+
+%prep
+%setup -q
+find -name "*.jar" -delete
+find -name "*.class" -delete
+
+%patch1 -p1
+%patch2 -p0
+%patch3 -p1
+%patch4 -p1
+
+sed -i 's/\r//' LICENSE.txt NOTICE.txt
+
+# fix non ASCII chars
+for s in src/tiles/src/main/java/org/apache/struts/tiles/ComponentDefinition.java;do
+ native2ascii -encoding UTF8 ${s} ${s}
+done
+
+cd src
+
+%pom_remove_parent
+
+%pom_change_dep -r :servlet-api org.jboss.spec.javax.servlet:jboss-servlet-api_3.1_spec:1.0.0.Beta1
+%pom_change_dep -r :jstl org.apache.taglibs:taglibs-standard-jstlel:1.2.3
+%pom_remove_dep -r taglibs:standard
+
+%pom_change_dep -r :jsp-api org.jboss.spec.javax.servlet.jsp:jboss-jsp-api_2.3_spec:1.0.0.Beta1
+%pom_change_dep -r :myfaces-jsf-api org.jboss.spec.javax.faces:jboss-jsf-api_2.2_spec:2.2.0
+%pom_change_dep -r :bsf org.apache.bsf:
+
+# package javax.servlet.jsp.el does not exist
+%pom_add_dep org.jboss.spec.javax.servlet.jsp:jboss-jsp-api_2.3_spec:1.0.0.Beta1 core
+
+%mvn_file :%{name}-core %{name}/core
+%mvn_file :%{name}-el %{name}/el
+%mvn_file :%{name}-extras %{name}/extras
+%mvn_file :%{name}-faces %{name}/faces
+%mvn_file :%{name}-mailreader-dao %{name}/mailreader-dao
+%mvn_file :%{name}-scripting %{name}/scripting
+%mvn_file :%{name}-taglib %{name}/taglib
+%mvn_file :%{name}-tiles %{name}/tiles
+
+%build
+
+cd src
+%mvn_build -- -Dproject.build.sourceEncoding=UTF-8
+
+%install
+
+(
+cd src
+%mvn_install
+)
+
+%files -f src/.mfiles
+%license LICENSE.txt NOTICE.txt
+
+%files javadoc -f src/.mfiles-javadoc
+%license LICENSE.txt NOTICE.txt
+
+%changelog
+* Mon Aug 17 2020 wangxiao - 1.3.10-1
+- package init
diff --git a/struts.yaml b/struts.yaml
new file mode 100644
index 0000000..358e876
--- /dev/null
+++ b/struts.yaml
@@ -0,0 +1,5 @@
+git_url: https://github.com/apache/struts
+version_control: github
+src_repo: apache/struts
+tag_prefix: "STRUTS_"
+seperator: "_"