Author: pero
Date: Thu Apr 29 06:37:20 2010
New Revision: 939212
URL: http://svn.apache.org/viewvc?rev=939212&view=rev
Log:
Fix my IDE and use spaces. - No functional change
Modified:
tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
tomcat/trunk/test/org/apache/catalina/startup/DuplicateMappingParamServlet.java
tomcat/trunk/test/org/apache/catalina/startup/NoMappingParamServlet.java
tomcat/trunk/test/org/apache/catalina/startup/ParamServlet.java
tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java
Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=939212&r1=939211&r2=939212&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Thu Apr 29
06:37:20 2010
@@ -1900,13 +1900,13 @@ public class ContextConfig
break;
}
}
- if(servletName == null) {
- // classname is default servletName as annotation has no name!
+ if (servletName == null) {
+ // classname is default servletName as annotation has no name!
servletName = className;
}
ServletDef servletDef = fragment.getServlets().get(servletName);
boolean isWebXMLservletDef = servletDef != null;
- if(!isWebXMLservletDef) {
+ if (!isWebXMLservletDef) {
servletDef = new ServletDef();
servletDef.setServletName(servletName);
servletDef.setServletClass(className);
@@ -1914,7 +1914,7 @@ public class ContextConfig
boolean urlPatternsSet = false;
String[] urlPatterns = null;
- //ElementValuePair[] evps = ae.getElementValuePairs();
+ // ElementValuePair[] evps = ae.getElementValuePairs();
for (ElementValuePair evp : evps) {
String name = evp.getNameString();
if ("value".equals(name) || "urlPatterns".equals(name)) {
@@ -1925,62 +1925,65 @@ public class ContextConfig
urlPatternsSet = true;
urlPatterns = processAnnotationsStringArray(evp.getValue());
} else if ("description".equals(name)) {
- if(servletDef.getDescription() == null) {
-
servletDef.setDescription(evp.getValue().stringifyValue());
- }
+ if (servletDef.getDescription() == null) {
+ servletDef.setDescription(evp.getValue().stringifyValue());
+ }
} else if ("displayName".equals(name)) {
- if(servletDef.getDisplayName() == null) {
-
servletDef.setDisplayName(evp.getValue().stringifyValue());
- }
+ if (servletDef.getDisplayName() == null) {
+ servletDef.setDisplayName(evp.getValue().stringifyValue());
+ }
} else if ("largeIcon".equals(name)) {
- if(servletDef.getLargeIcon() == null) {
-
servletDef.setLargeIcon(evp.getValue().stringifyValue());
- }
+ if (servletDef.getLargeIcon() == null) {
+ servletDef.setLargeIcon(evp.getValue().stringifyValue());
+ }
} else if ("smallIcon".equals(name)) {
- if(servletDef.getSmallIcon() == null) {
-
servletDef.setSmallIcon(evp.getValue().stringifyValue());
- }
+ if (servletDef.getSmallIcon() == null) {
+ servletDef.setSmallIcon(evp.getValue().stringifyValue());
+ }
} else if ("asyncSupported".equals(name)) {
- if(servletDef.getAsyncSupported() == null) {
-
servletDef.setAsyncSupported(evp.getValue().stringifyValue());
- }
- } else if ("loadOnStartup".equals(name)) {
- if(servletDef.getLoadOnStartup() == null) {
-
servletDef.setLoadOnStartup(evp.getValue().stringifyValue());
- }
+ if (servletDef.getAsyncSupported() == null) {
+ servletDef.setAsyncSupported(evp.getValue()
+ .stringifyValue());
+ }
+ } else if ("loadOnStartup".equals(name)) {
+ if (servletDef.getLoadOnStartup() == null) {
+ servletDef
+ .setLoadOnStartup(evp.getValue().stringifyValue());
+ }
} else if ("initParams".equals(name)) {
- Map<String,String> initParams =
- processAnnotationWebInitParams(evp.getValue());
- if(isWebXMLservletDef) {
- Map<String,String> webXMLInitParams =
servletDef.getParameterMap();
- for (Map.Entry<String, String> entry :
initParams.entrySet()) {
- if (webXMLInitParams.get(entry.getKey()) ==
null) {
-
servletDef.addInitParameter(entry.getKey(),
- entry.getValue());
- }
- }
- }
- else {
- for (Map.Entry<String, String> entry :
initParams
- .entrySet()) {
-
servletDef.addInitParameter(entry.getKey(), entry
- .getValue());
- }
+ Map<String, String> initParams =
processAnnotationWebInitParams(evp
+ .getValue());
+ if (isWebXMLservletDef) {
+ Map<String, String> webXMLInitParams = servletDef
+ .getParameterMap();
+ for (Map.Entry<String, String> entry : initParams
+ .entrySet()) {
+ if (webXMLInitParams.get(entry.getKey()) == null) {
+ servletDef.addInitParameter(entry.getKey(), entry
+ .getValue());
+ }
+ }
+ } else {
+ for (Map.Entry<String, String> entry : initParams
+ .entrySet()) {
+ servletDef.addInitParameter(entry.getKey(), entry
+ .getValue());
+ }
}
} else {
// Ignore
}
}
- if(!isWebXMLservletDef && urlPatterns != null) {
- fragment.addServlet(servletDef);
- }
- if(urlPatternsSet) {
- if
(!fragment.getServletMappings().containsValue(servletName)) {
- for (String urlPattern : urlPatterns) {
- fragment.addServletMapping(urlPattern,
servletName);
- }
- }
- }
+ if (!isWebXMLservletDef && urlPatterns != null) {
+ fragment.addServlet(servletDef);
+ }
+ if (urlPatternsSet) {
+ if (!fragment.getServletMappings().containsValue(servletName)) {
+ for (String urlPattern : urlPatterns) {
+ fragment.addServletMapping(urlPattern, servletName);
+ }
+ }
+ }
}
Modified:
tomcat/trunk/test/org/apache/catalina/startup/DuplicateMappingParamServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/DuplicateMappingParamServlet.java?rev=939212&r1=939211&r2=939212&view=diff
==============================================================================
---
tomcat/trunk/test/org/apache/catalina/startup/DuplicateMappingParamServlet.java
(original)
+++
tomcat/trunk/test/org/apache/catalina/startup/DuplicateMappingParamServlet.java
Thu Apr 29 06:37:20 2010
@@ -27,19 +27,20 @@ import javax.servlet.http.HttpServletReq
import javax.servlet.http.HttpServletResponse;
/**
-*
-* @author Peter Rossbach
-* @version $Revision$ $Date$
-*/
-...@webservlet(value = "/annotation/overwrite", urlPatterns = {"/param2"},
name= "param", initParams = {
+ *
+ * @author Peter Rossbach
+ * @version $Revision$ $Date: 2010-04-29 00:16:49 +0200 (Thu, 29 Apr
+ * 2010) $
+ */
+...@webservlet(value = "/annotation/overwrite", urlPatterns = { "/param2" },
name = "param", initParams = {
@WebInitParam(name = "foo", value = "Hello"),
@WebInitParam(name = "bar", value = "World!") })
public class DuplicateMappingParamServlet extends HttpServlet {
- public void doGet(HttpServletRequest req, HttpServletResponse res)
- throws IOException, ServletException
- {
- PrintWriter out = res.getWriter();
- out.print("<p>" + getInitParameter("foo") + " " +
getInitParameter("bar") + "</p>");
- }
+ public void doGet(HttpServletRequest req, HttpServletResponse res)
+ throws IOException, ServletException {
+ PrintWriter out = res.getWriter();
+ out.print("<p>" + getInitParameter("foo") + " "
+ + getInitParameter("bar") + "</p>");
+ }
}
Modified:
tomcat/trunk/test/org/apache/catalina/startup/NoMappingParamServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/NoMappingParamServlet.java?rev=939212&r1=939211&r2=939212&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/NoMappingParamServlet.java
(original)
+++ tomcat/trunk/test/org/apache/catalina/startup/NoMappingParamServlet.java
Thu Apr 29 06:37:20 2010
@@ -27,19 +27,20 @@ import javax.servlet.http.HttpServletReq
import javax.servlet.http.HttpServletResponse;
/**
-*
-* @author Peter Rossbach
-* @version $Revision$ $Date$
-*/
-...@webservlet(name= "param1", initParams = {
+ *
+ * @author Peter Rossbach
+ * @version $Revision$ $Date: 2010-04-29 00:16:49 +0200 (Thu, 29 Apr
+ * 2010) $
+ */
+...@webservlet(name = "param1", initParams = {
@WebInitParam(name = "foo", value = "Hello"),
@WebInitParam(name = "bar", value = "World!") })
public class NoMappingParamServlet extends HttpServlet {
- public void doGet(HttpServletRequest req, HttpServletResponse res)
- throws IOException, ServletException
- {
- PrintWriter out = res.getWriter();
- out.print("<p>" + getInitParameter("foo") + " " +
getInitParameter("bar") + "</p>");
- }
+ public void doGet(HttpServletRequest req, HttpServletResponse res)
+ throws IOException, ServletException {
+ PrintWriter out = res.getWriter();
+ out.print("<p>" + getInitParameter("foo") + " "
+ + getInitParameter("bar") + "</p>");
+ }
}
Modified: tomcat/trunk/test/org/apache/catalina/startup/ParamServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/ParamServlet.java?rev=939212&r1=939211&r2=939212&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/ParamServlet.java (original)
+++ tomcat/trunk/test/org/apache/catalina/startup/ParamServlet.java Thu Apr 29
06:37:20 2010
@@ -27,22 +27,20 @@ import javax.servlet.http.HttpServletReq
import javax.servlet.http.HttpServletResponse;
/**
- *
+ *
* @author Peter Rossbach
- * @version $Revision$ $Date$
+ * @version $Revision$ $Date: 2010-04-29 00:16:49 +0200 (Thu, 29 Apr
+ * 2010) $
*/
-...@webservlet(value = "/annotation/overwrite", name= "param", initParams = {
+...@webservlet(value = "/annotation/overwrite", name = "param", initParams = {
@WebInitParam(name = "foo", value = "Hello"),
- @WebInitParam(name = "bar", value = "World!") },
- displayName="param", description="param",
- largeIcon="paramLarge.png",smallIcon="paramSmall.png",
- loadOnStartup= 0, asyncSupported= false)
+ @WebInitParam(name = "bar", value = "World!") }, displayName =
"param", description = "param", largeIcon = "paramLarge.png", smallIcon =
"paramSmall.png", loadOnStartup = 0, asyncSupported = false)
public class ParamServlet extends HttpServlet {
- public void doGet(HttpServletRequest req, HttpServletResponse res)
- throws IOException, ServletException
- {
- PrintWriter out = res.getWriter();
- out.print("<p>" + getInitParameter("foo") + " " +
getInitParameter("bar") + "</p>");
- }
+ public void doGet(HttpServletRequest req, HttpServletResponse res)
+ throws IOException, ServletException {
+ PrintWriter out = res.getWriter();
+ out.print("<p>" + getInitParameter("foo") + " "
+ + getInitParameter("bar") + "</p>");
+ }
}
Modified:
tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java?rev=939212&r1=939211&r2=939212&view=diff
==============================================================================
---
tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java
(original)
+++
tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java
Thu Apr 29 06:37:20 2010
@@ -24,147 +24,150 @@ import org.apache.catalina.deploy.Servle
import org.apache.catalina.deploy.WebXml;
/**
-* Check Servlet 3.0 Spec 8.2.3.3: Override annotation parameter from web.xml
or fragment.
-*
-* @author Peter Rossbach
-* @version $Revision$ $Date$
-*/
+ * Check Servlet 3.0 Spec 8.2.3.3: Override annotation parameter from web.xml
or
+ * fragment.
+ *
+ * @author Peter Rossbach
+ * @version $Revision$ $Date: 2010-04-29 00:16:49 +0200 (Thu, 29 Apr
+ * 2010) $
+ */
public class TestContextConfigAnnotation extends TestCase {
- public void testAnnotation() throws Exception {
- WebXml webxml = new WebXml();
- ContextConfig config = new ContextConfig();
- File pFile =
paramServletClassResource("org/apache/catalina/startup/ParamServlet");
- assertTrue(pFile.exists());
- config.processAnnotationsFile(pFile, webxml);
- ServletDef servletDef = webxml.getServlets().get("param");
- assertNotNull(servletDef);
- assertEquals("Hello", servletDef.getParameterMap().get("foo"));
- assertEquals("World!", servletDef.getParameterMap().get("bar"));
- assertEquals("param", webxml.getServletMappings().get(
- "/annotation/overwrite"));
-
- assertEquals("param", servletDef.getDescription());
- assertEquals("param", servletDef.getDisplayName());
- assertEquals("paramLarge.png", servletDef.getLargeIcon());
- assertEquals("paramSmall.png", servletDef.getSmallIcon());
- assertEquals(Boolean.FALSE, servletDef.getAsyncSupported());
- assertEquals(new Integer(0), servletDef.getLoadOnStartup());
- assertNull(servletDef.getEnabled());
- assertNull(servletDef.getJspFile());
-
- }
-
- public void testOverwriteAnnotation() throws Exception {
- WebXml webxml = new WebXml();
- ServletDef servletDef = new ServletDef();
- servletDef.setServletName("param");
-
servletDef.setServletClass("org.apache.catalina.startup.ParamServlet");
- servletDef.addInitParameter("foo", "tomcat");
- servletDef.setDescription("Description");
- servletDef.setDisplayName("DisplayName");
- servletDef.setLargeIcon("LargeIcon");
- servletDef.setSmallIcon("SmallIcon");
- servletDef.setAsyncSupported("true");
- servletDef.setLoadOnStartup("1");
-
- webxml.addServlet(servletDef);
- webxml.addServletMapping("/param", "param");
- ContextConfig config = new ContextConfig();
- File pFile =
paramServletClassResource("org/apache/catalina/startup/ParamServlet");
- assertTrue(pFile.exists());
- config.processAnnotationsFile(pFile, webxml);
-
- assertEquals(servletDef, webxml.getServlets().get("param"));
-
- assertEquals("tomcat", servletDef.getParameterMap().get("foo"));
- assertEquals("param",
webxml.getServletMappings().get("/param"));
- // annotation mapping not added s. Servlet Spec 3.0 (Nov 2009)
8.2.3.3.vi page 81
- assertNull(webxml.getServletMappings().get(
- "/annotation/overwrite"));
-
- assertEquals("Description", servletDef.getDescription());
- assertEquals("DisplayName", servletDef.getDisplayName());
- assertEquals("LargeIcon", servletDef.getLargeIcon());
- assertEquals("SmallIcon", servletDef.getSmallIcon());
- assertEquals(Boolean.TRUE, servletDef.getAsyncSupported());
- assertEquals(new Integer(1), servletDef.getLoadOnStartup());
- assertNull(servletDef.getEnabled());
- assertNull(servletDef.getJspFile());
- }
-
- public void testNoMapping() throws Exception {
- WebXml webxml = new WebXml();
- ContextConfig config = new ContextConfig();
- File pFile =
paramServletClassResource("org/apache/catalina/startup/NoMappingParamServlet");
- assertTrue(pFile.exists());
- config.processAnnotationsFile(pFile, webxml);
- ServletDef servletDef = webxml.getServlets().get("param1");
- assertNull(servletDef);
-
- webxml.addServletMapping("/param", "param1");
- config.processAnnotationsFile(pFile, webxml);
- servletDef = webxml.getServlets().get("param1");
- assertNull(servletDef);
-
- }
-
- public void testSetupWebXMLNoMapping() throws Exception {
- WebXml webxml = new WebXml();
- ServletDef servletDef = new ServletDef();
- servletDef.setServletName("param1");
- servletDef
-
.setServletClass("org.apache.catalina.startup.NoMappingParamServlet");
- servletDef.addInitParameter("foo", "tomcat");
-
- webxml.addServlet(servletDef);
- webxml.addServletMapping("/param", "param1");
- ContextConfig config = new ContextConfig();
- File pFile =
paramServletClassResource("org/apache/catalina/startup/NoMappingParamServlet");
- assertTrue(pFile.exists());
- config.processAnnotationsFile(pFile, webxml);
- assertEquals("tomcat", servletDef.getParameterMap().get("foo"));
- assertEquals("World!", servletDef.getParameterMap().get("bar"));
- ServletDef servletDef1 = webxml.getServlets().get("param1");
- assertNotNull(servletDef1);
- assertEquals(servletDef, servletDef1);
- }
-
- public void testDuplicateMapping() throws Exception {
- WebXml webxml = new WebXml();
- ContextConfig config = new ContextConfig();
- File pFile =
paramServletClassResource("org/apache/catalina/startup/DuplicateMappingParamServlet");
- assertTrue(pFile.exists());
- try {
- config.processAnnotationsFile(pFile, webxml);
- fail();
- } catch (IllegalArgumentException ex) {
- // ingore
- }
- ServletDef servletDef = webxml.getServlets().get("param");
- assertNull(servletDef);
- }
-
- /**
- * Find newest class resource at eclipse and ant standard class output
dirs!
- * @param className
- * @return File Resource
- */
- private File paramServletClassResource(String className) {
- File antFile = new File("output/testclasses/" + className +
".class");
- File eclipseFile = new File(".settings/output/" + className +
".class");
- if (antFile.exists()) {
- if (eclipseFile.exists()) {
- if (antFile.lastModified() >=
eclipseFile.lastModified()) {
- return antFile;
- } else {
- return eclipseFile;
- }
- } else {
- return antFile;
- }
- } else {
- return eclipseFile;
- }
- }
+ public void testAnnotation() throws Exception {
+ WebXml webxml = new WebXml();
+ ContextConfig config = new ContextConfig();
+ File pFile =
paramServletClassResource("org/apache/catalina/startup/ParamServlet");
+ assertTrue(pFile.exists());
+ config.processAnnotationsFile(pFile, webxml);
+ ServletDef servletDef = webxml.getServlets().get("param");
+ assertNotNull(servletDef);
+ assertEquals("Hello", servletDef.getParameterMap().get("foo"));
+ assertEquals("World!", servletDef.getParameterMap().get("bar"));
+ assertEquals("param", webxml.getServletMappings().get(
+ "/annotation/overwrite"));
+
+ assertEquals("param", servletDef.getDescription());
+ assertEquals("param", servletDef.getDisplayName());
+ assertEquals("paramLarge.png", servletDef.getLargeIcon());
+ assertEquals("paramSmall.png", servletDef.getSmallIcon());
+ assertEquals(Boolean.FALSE, servletDef.getAsyncSupported());
+ assertEquals(new Integer(0), servletDef.getLoadOnStartup());
+ assertNull(servletDef.getEnabled());
+ assertNull(servletDef.getJspFile());
+
+ }
+
+ public void testOverwriteAnnotation() throws Exception {
+ WebXml webxml = new WebXml();
+ ServletDef servletDef = new ServletDef();
+ servletDef.setServletName("param");
+ servletDef.setServletClass("org.apache.catalina.startup.ParamServlet");
+ servletDef.addInitParameter("foo", "tomcat");
+ servletDef.setDescription("Description");
+ servletDef.setDisplayName("DisplayName");
+ servletDef.setLargeIcon("LargeIcon");
+ servletDef.setSmallIcon("SmallIcon");
+ servletDef.setAsyncSupported("true");
+ servletDef.setLoadOnStartup("1");
+
+ webxml.addServlet(servletDef);
+ webxml.addServletMapping("/param", "param");
+ ContextConfig config = new ContextConfig();
+ File pFile =
paramServletClassResource("org/apache/catalina/startup/ParamServlet");
+ assertTrue(pFile.exists());
+ config.processAnnotationsFile(pFile, webxml);
+
+ assertEquals(servletDef, webxml.getServlets().get("param"));
+
+ assertEquals("tomcat", servletDef.getParameterMap().get("foo"));
+ assertEquals("param", webxml.getServletMappings().get("/param"));
+ // annotation mapping not added s. Servlet Spec 3.0 (Nov 2009)
+ // 8.2.3.3.vi page 81
+ assertNull(webxml.getServletMappings().get("/annotation/overwrite"));
+
+ assertEquals("Description", servletDef.getDescription());
+ assertEquals("DisplayName", servletDef.getDisplayName());
+ assertEquals("LargeIcon", servletDef.getLargeIcon());
+ assertEquals("SmallIcon", servletDef.getSmallIcon());
+ assertEquals(Boolean.TRUE, servletDef.getAsyncSupported());
+ assertEquals(new Integer(1), servletDef.getLoadOnStartup());
+ assertNull(servletDef.getEnabled());
+ assertNull(servletDef.getJspFile());
+ }
+
+ public void testNoMapping() throws Exception {
+ WebXml webxml = new WebXml();
+ ContextConfig config = new ContextConfig();
+ File pFile =
paramServletClassResource("org/apache/catalina/startup/NoMappingParamServlet");
+ assertTrue(pFile.exists());
+ config.processAnnotationsFile(pFile, webxml);
+ ServletDef servletDef = webxml.getServlets().get("param1");
+ assertNull(servletDef);
+
+ webxml.addServletMapping("/param", "param1");
+ config.processAnnotationsFile(pFile, webxml);
+ servletDef = webxml.getServlets().get("param1");
+ assertNull(servletDef);
+
+ }
+
+ public void testSetupWebXMLNoMapping() throws Exception {
+ WebXml webxml = new WebXml();
+ ServletDef servletDef = new ServletDef();
+ servletDef.setServletName("param1");
+ servletDef
+
.setServletClass("org.apache.catalina.startup.NoMappingParamServlet");
+ servletDef.addInitParameter("foo", "tomcat");
+
+ webxml.addServlet(servletDef);
+ webxml.addServletMapping("/param", "param1");
+ ContextConfig config = new ContextConfig();
+ File pFile =
paramServletClassResource("org/apache/catalina/startup/NoMappingParamServlet");
+ assertTrue(pFile.exists());
+ config.processAnnotationsFile(pFile, webxml);
+ assertEquals("tomcat", servletDef.getParameterMap().get("foo"));
+ assertEquals("World!", servletDef.getParameterMap().get("bar"));
+ ServletDef servletDef1 = webxml.getServlets().get("param1");
+ assertNotNull(servletDef1);
+ assertEquals(servletDef, servletDef1);
+ }
+
+ public void testDuplicateMapping() throws Exception {
+ WebXml webxml = new WebXml();
+ ContextConfig config = new ContextConfig();
+ File pFile =
paramServletClassResource("org/apache/catalina/startup/DuplicateMappingParamServlet");
+ assertTrue(pFile.exists());
+ try {
+ config.processAnnotationsFile(pFile, webxml);
+ fail();
+ } catch (IllegalArgumentException ex) {
+ // ingore
+ }
+ ServletDef servletDef = webxml.getServlets().get("param");
+ assertNull(servletDef);
+ }
+
+ /**
+ * Find newest class resource at eclipse and ant standard class output
dirs!
+ *
+ * @param className
+ * @return File Resource
+ */
+ private File paramServletClassResource(String className) {
+ File antFile = new File("output/testclasses/" + className + ".class");
+ File eclipseFile = new File(".settings/output/" + className +
".class");
+ if (antFile.exists()) {
+ if (eclipseFile.exists()) {
+ if (antFile.lastModified() >= eclipseFile.lastModified()) {
+ return antFile;
+ } else {
+ return eclipseFile;
+ }
+ } else {
+ return antFile;
+ }
+ } else {
+ return eclipseFile;
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]