diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 76fcf38..a38cb43 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -32,6 +32,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 611e7c8..f0a3acf 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,8 +4,8 @@
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 7ffebf6..7d583ac 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -3,6 +3,9 @@
+
+
+
diff --git a/build.gradle b/build.gradle
index d640ba4..a7934ee 100644
--- a/build.gradle
+++ b/build.gradle
@@ -35,6 +35,8 @@ repositories {
dependencies {
implementation 'javax.servlet:javax.servlet-api:3.1.0'
testCompileClasspath 'org.junit.jupiter:junit-jupiter:5.8.2'
+ testImplementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.76'
+ testImplementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.76'
runtimeClasspath files(ncoreGenerateControlDataJar)
runtimeClasspath files(genJar)
annotationProcessor 'biz.redsoft.ncore:ncoreAnnotationProcessor:1.0.+'
diff --git a/src/main/java/biz/redsoft/sample/MainForm.java b/src/main/java/biz/redsoft/sample/MainForm.java
deleted file mode 100644
index 97ff2b8..0000000
--- a/src/main/java/biz/redsoft/sample/MainForm.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2023 Red Soft Corporation.
- *
- * This file is part of Red nCore.
- *
- * Red nCore is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * Red nCore is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Red nCore; see the file COPYING. If not, write to the
- * Red Soft Corporation, 117105, Russia, Moscow, Nagornyy proyezd, 5.
- *
- * Linking this library statically or dynamically with other modules is
- * making a combined work based on this library. Thus, the terms and
- * conditions of the GNU General Public License cover the whole
- * combination.
- *
- * As a special exception, the copyright holders of this library give you
- * permission to link this library with independent modules to produce an
- * executable, regardless of the license terms of these independent
- * modules, and to copy and distribute the resulting executable under
- * terms of your choice, provided that you also meet, for each linked
- * independent module, the terms and conditions of the license of that
- * module. An independent module is a module which is not derived from
- * or based on this library. If you modify this library, you may extend
- * this exception to your version of the library, but you are not
- * obligated to do so. If you do not wish to do so, delete this
- * exception statement from your version.
- */
-
-package biz.redsoft.sample;
-
-public class MainForm extends biz.redsoft.ncore.client.MainForm {
-
- public static void main(String[] args) throws Throwable {
- biz.redsoft.ncore.client.MainForm.main(args);
- }
-}
diff --git a/src/main/resources/META-INF/resources/VAADIN/themes/img/page_white_delete.png b/src/main/resources/META-INF/resources/VAADIN/themes/img/page_white_delete.png
new file mode 100644
index 0000000..644935f
Binary files /dev/null and b/src/main/resources/META-INF/resources/VAADIN/themes/img/page_white_delete.png differ
diff --git a/src/main/resources/META-INF/resources/VAADIN/themes/img/upload_file.gif b/src/main/resources/META-INF/resources/VAADIN/themes/img/upload_file.gif
new file mode 100644
index 0000000..9bffce7
Binary files /dev/null and b/src/main/resources/META-INF/resources/VAADIN/themes/img/upload_file.gif differ
diff --git a/src/test/java/biz/redsoft/sample/TomcatStarter.java b/src/test/java/biz/redsoft/sample/TomcatStarter.java
new file mode 100644
index 0000000..49006e6
--- /dev/null
+++ b/src/test/java/biz/redsoft/sample/TomcatStarter.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2017 Red Soft Corporation.
+ *
+ * This file is part of Red nCore.
+ *
+ * Red nCore is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * Red nCore is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Red nCore; see the file COPYING. If not, write to the
+ * Red Soft Corporation, 117105, Russia, Moscow, Nagornyy proyezd, 5.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole
+ * combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent
+ * modules, and to copy and distribute the resulting executable under
+ * terms of your choice, provided that you also meet, for each linked
+ * independent module, the terms and conditions of the license of that
+ * module. An independent module is a module which is not derived from
+ * or based on this library. If you modify this library, you may extend
+ * this exception to your version of the library, but you are not
+ * obligated to do so. If you do not wish to do so, delete this
+ * exception statement from your version.
+ */
+
+package biz.redsoft.sample;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+
+import javax.servlet.ServletException;
+
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.Server;
+import org.apache.catalina.WebResourceRoot;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.catalina.webresources.DirResourceSet;
+import org.apache.catalina.webresources.FileResourceSet;
+import org.apache.catalina.webresources.StandardRoot;
+import org.apache.tomcat.util.scan.StandardJarScanner;
+
+/**
+ * @author Victor Bellavin
+ */
+public class TomcatStarter {
+ private String contextPath = "/ncore";
+ private int port = 8080;
+
+ private int shutdownPort = 8020;
+ private String shutdownCommand = "SHUTDOWN";
+
+ public void start() throws ServletException, LifecycleException {
+ System.setProperty("catalina.home", new File(".").getAbsolutePath());
+ final Tomcat tomcat = new Tomcat();
+ tomcat.setPort(port);
+ tomcat.setBaseDir(".");
+ tomcat.getHost().setAppBase(".");
+ tomcat.getConnector(); // initialize standard HTTP 1.1 connector
+ tomcat.enableNaming();
+ final Server server = tomcat.getServer();
+ server.setPort(shutdownPort);
+ server.setShutdown(shutdownCommand);
+ final StandardContext webContext = (StandardContext) tomcat.addWebapp(contextPath, "src/main/webapp");
+ webContext.setUseNaming(true);
+ final WebResourceRoot resources = new StandardRoot(webContext);
+ //aliases to resources
+ final String base = ap("");
+ resources.addPreResources(new DirResourceSet(resources, "/META-INF/resources", ap("src/main/resources"), "/META-INF/resources"));
+ //resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes/export_templates", base, "/export_templates"));
+ if (new File(base, "ncore-properties-local.xml").exists())
+ resources.addPreResources(new FileResourceSet(resources, "/WEB-INF/ncore-properties-local.xml", base, "/ncore-properties-local.xml"));
+ //resources.addPreResources(new FileResourceSet(resources, "/WEB-INF/ncore-properties-local-openid.xml", base, "/ncore-properties-local-openid.xml"));
+ resources.addPreResources(new FileResourceSet(resources, "/WEB-INF/logback.xml", base, "/logback.xml"));
+ webContext.setResources(resources);
+ // IDEA не всегда корректно формирует пути. Отключим проверку ресурсов.
+ ((StandardJarScanner)webContext.getJarScanner()).setScanClassPath(false);
+ webContext.setWorkDir("build/tomcat/work");
+ tomcat.start();
+ server.await();
+ tomcat.stop();
+ }
+
+ private String ap(String s) {
+ return new File(s).getAbsolutePath();
+ }
+
+ public void stop() throws IOException {
+ final InetAddress serverAddress = InetAddress.getByName("localhost");
+ final Socket socket = new Socket(serverAddress, shutdownPort);
+ try (OutputStream os = socket.getOutputStream()) {
+ final byte[] buffer = shutdownCommand.getBytes();
+ os.write(buffer, 0, buffer.length);
+ os.flush();
+ }
+ }
+
+ public static void main(String[] args) throws ServletException, LifecycleException, IOException {
+ if (args.length > 0) {
+ String command = args[0];
+ if ("start".equals(command))
+ new TomcatStarter().start();
+ else if ("stop".equals(command))
+ new TomcatStarter().stop();
+ }
+ }
+}