Просмотр исходного кода

Merge branch 'feature/java11' into 'develop'

Feature/java11

See merge request o2oa/o2oa!1516
o2null 5 лет назад
Родитель
Сommit
d6d031bd7d
32 измененных файлов с 383 добавлено и 1780 удалено
  1. 1 1
      o2server/start_aix.sh
  2. 1 1
      o2server/start_aix_debug.sh
  3. 1 1
      o2server/start_arm_debug.sh
  4. 1 1
      o2server/start_linux_debug.sh
  5. 1 1
      o2server/start_macos.sh
  6. 1 1
      o2server/start_macos_debug.sh
  7. 1 1
      o2server/start_raspberrypi.sh
  8. 1 1
      o2server/start_raspberrypi_debug.sh
  9. 1 1
      o2server/start_risc.sh
  10. 1 1
      o2server/start_risc_debug.sh
  11. 1 1
      o2server/start_windows.bat
  12. 1 1
      o2server/start_windows_debug.bat
  13. 1 1
      o2server/stop_aix.sh
  14. 1 1
      o2server/stop_arm.sh
  15. 1 1
      o2server/stop_linux.sh
  16. 1 1
      o2server/stop_macos.sh
  17. 1 1
      o2server/stop_raspberrypi.sh
  18. 1 1
      o2server/stop_risc.sh
  19. 1 1
      o2server/stop_windows.bat
  20. 10 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/JarTools.java
  21. 16 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/PathTools.java
  22. 23 53
      o2server/x_console/src/main/java/com/x/server/console/InstrumentationAgent.java
  23. 71 83
      o2server/x_console/src/main/java/com/x/server/console/Main.java
  24. 95 101
      o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java
  25. 4 4
      o2server/x_console/src/main/java/com/x/server/console/ResourceFactory.java
  26. 4 7
      o2server/x_console/src/main/java/com/x/server/console/server/JettySeverTools.java
  27. 111 88
      o2server/x_console/src/main/java/com/x/server/console/server/application/ApplicationServerTools.java
  28. 4 1
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/jest/BaseAction.java
  29. 16 18
      o2server/x_query_service_processing/src/main/webapp/describe/sources/com/x/query/service/processing/factory/QueryFactory.java
  30. 8 8
      o2server/x_query_service_processing/src/main/webapp/describe/sources/com/x/query/service/processing/jaxrs/neural/ActionListCalculateWithWork.java
  31. 2 4
      o2server/x_query_service_processing/src/main/webapp/describe/sources/com/x/query/service/processing/jaxrs/neural/BaseAction.java
  32. 0 1393
      o2server/x_teamwork_assemble_control/src/main/webapp/jest

+ 1 - 1
o2server/start_aix.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/aix/bin/java -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/aix/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_aix_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/aix/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/aix/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_arm_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/arm/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/arm/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_linux_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/linux/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/linux/bin/java -javaagent:${current_dir}/console.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_macos.sh

@@ -149,4 +149,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo ${current_dir}/jvm/macos/bin/java -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo ${current_dir}/jvm/macos/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_macos_debug.sh

@@ -149,4 +149,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo ${current_dir}/jvm/macos/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo ${current_dir}/jvm/macos/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_raspberrypi.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		sudo rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -server -Xms1g -Xmx1g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -javaagent:${current_dir}/console.jar -server -Xms1g -Xmx1g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_raspberrypi_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		sudo rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms1g -Xmx1g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms1g -Xmx1g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_risc.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/risc/bin/java -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/risc/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_risc_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/risc/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/risc/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_windows.bat

@@ -144,5 +144,5 @@ if exist "%~dp0local\update" (
 	)
 )
 @echo on
-"%~dp0jvm\windows\bin\java" -server -Xms2g -Xmx5g -Duser.timezone=GMT+08 -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
+"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -server -Xms2g -Xmx5g -Duser.timezone=GMT+08 -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
 pause

+ 1 - 1
o2server/start_windows_debug.bat

@@ -144,5 +144,5 @@ if exist "%~dp0local\update" (
 	)
 )
 @echo on
-"%~dp0jvm\windows\bin\java" -server -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
+"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -server -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
 pause

+ 1 - 1
o2server/stop_aix.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/aix/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit
+$(cd "$(dirname "$0")"; pwd)/jvm/aix/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit

+ 1 - 1
o2server/stop_arm.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/arm/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit
+$(cd "$(dirname "$0")"; pwd)/jvm/arm/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit

+ 1 - 1
o2server/stop_linux.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/linux/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit
+$(cd "$(dirname "$0")"; pwd)/jvm/linux/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit

+ 1 - 1
o2server/stop_macos.sh

@@ -1 +1 @@
-sudo $(cd "$(dirname "$0")"; pwd)/jvm/macos/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit
+sudo $(cd "$(dirname "$0")"; pwd)/jvm/macos/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit

+ 1 - 1
o2server/stop_raspberrypi.sh

@@ -1 +1 @@
-sudo $(cd "$(dirname "$0")"; pwd)/jvm/raspberrypi/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit
+sudo $(cd "$(dirname "$0")"; pwd)/jvm/raspberrypi/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit

+ 1 - 1
o2server/stop_risc.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/risc/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit
+$(cd "$(dirname "$0")"; pwd)/jvm/risc/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit

+ 1 - 1
o2server/stop_windows.bat

@@ -1 +1 @@
-"%~dp0jvm\windows\bin\java" -cp "%~dp0console.jar" com.x.server.console.swapcommand.Exit
+"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -cp "%~dp0console.jar" com.x.server.console.swapcommand.Exit

+ 10 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/JarTools.java

@@ -6,6 +6,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.InputStream;
+import java.nio.file.Path;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.jar.JarEntry;
@@ -19,7 +20,11 @@ import org.apache.commons.lang3.StringUtils;
 public class JarTools {
 
 	private JarTools() {
-	};
+	}
+
+	public static void unjar(byte[] bytes, String sub, Path dist, boolean force) {
+		unjar(bytes, sub, dist.toFile(), force);
+	}
 
 	public static void unjar(byte[] bytes, String sub, String dist, boolean force) {
 		unjar(bytes, sub, new File(dist), force);
@@ -66,6 +71,10 @@ public class JarTools {
 		unjar(new File(source), sub, new File(dist), force);
 	}
 
+	public static void unjar(Path source, String sub, Path dist, boolean force) {
+		unjar(source.toFile(), sub, dist.toFile(), force);
+	}
+
 	public static void unjar(File source, String sub, File dist, boolean force) {
 		try (JarFile jarFile = new JarFile(source)) {
 			FileUtils.forceMkdir(dist);

+ 16 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/PathTools.java

@@ -0,0 +1,16 @@
+package com.x.base.core.project.tools;
+
+public class PathTools {
+
+	private PathTools() {
+		// nothing
+	}
+
+	public static final String WEB_INF = "WEB-INF";
+	public static final String WEB_INF_WEB_XML = "WEB-INF/web.xml";
+	public static final String WEB_INF_CLASSES = "WEB-INF/classes";
+	public static final String WEB_INF_LASTMODIFIED = "WEB-INF/lastModified";
+	public static final String META_INF = "META";
+	public static final String DOT_WAR = ".war";
+
+}

+ 23 - 53
o2server/x_console/src/main/java/com/x/server/console/InstrumentationAgent.java

@@ -2,9 +2,7 @@ package com.x.server.console;
 
 import java.io.IOException;
 import java.lang.instrument.Instrumentation;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.net.URLClassLoader;
+import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -14,65 +12,54 @@ import java.util.stream.Stream;
 
 public class InstrumentationAgent {
 
+	private InstrumentationAgent() {
+		// nothing
+	}
+
 	private static Instrumentation INST;
 
 	private static final String CFG = "manifest.cfg";
 	private static final String GIT = ".gitignore";
-
-	public static void agentmain(String args, Instrumentation inst) {
-		INST = inst;
-		try {
-			Path base = getBasePath();
-			if (Files.exists(base.resolve("custom/jars"))) {
-				load(base, "custom/jars");
-			}
-			if (Files.exists(base.resolve("dynamic/jars"))) {
-				load(base, "dynamic/jars");
-			}
-			load(base, "store/jars");
-			load(base, "commons/ext");
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
+	private static final String CUSTOM_JARS = "custom/jars";
+	private static final String DYNAMIC_JARS = "dynamic/jars";
+	private static final String STORE_JARS = "store/jars";
+	private static final String COMMONS_EXT = "commons/ext";
 
 	public static void premain(String args, Instrumentation inst) {
 		INST = inst;
 		try {
 			Path base = getBasePath();
-			if (Files.exists(base.resolve("custom/jars"))) {
-				load(base, "custom/jars");
+			if (Files.exists(base.resolve(CUSTOM_JARS))) {
+				load(base, CUSTOM_JARS);
 			}
-			if (Files.exists(base.resolve("dynamic/jars"))) {
-				load(base, "dynamic/jars");
+			if (Files.exists(base.resolve(DYNAMIC_JARS))) {
+				load(base, DYNAMIC_JARS);
 			}
-			load(base, "store/jars");
-			load(base, "commons/ext");
+			load(base, STORE_JARS);
+			load(base, COMMONS_EXT);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
 
-	private static void load(Path base, String sub) throws Exception {
+	private static void load(Path base, String sub) throws IOException {
 		Path dir = base.resolve(sub);
 		Path cfg = dir.resolve(CFG);
 		if (Files.exists(dir) && Files.isDirectory(dir) && Files.exists(cfg) && Files.isRegularFile(cfg)) {
 			List<String> names = Files.readAllLines(cfg);
 			if (names.isEmpty()) {
-				throw new Exception(String.format("%s manifest is empty.", sub));
+				throw new IOException(String.format("%s manifest is empty.", sub));
 			}
 			try (Stream<Path> stream = Files.list(dir)) {
 				stream.filter(o -> !(o.getFileName().toString().equalsIgnoreCase(CFG)
 						|| o.getFileName().toString().equalsIgnoreCase(GIT))).forEach(o -> {
 							try {
 								if (names.remove(o.getFileName().toString())) {
-									// addURLToClassPath(o);
-									System.out.println("load jar:" + o.toString());
 									INST.appendToSystemClassLoaderSearch(new JarFile(o.toString()));
 								} else {
 									Files.delete(o);
-									System.out.printf("delete unnecessary file from %s: %s.", sub,
-											o.getFileName().toString());
+									System.out.println(String.format("delete unnecessary file from %s: %s.", sub,
+											o.getFileName().toString()));
 								}
 							} catch (IOException e) {
 								e.printStackTrace();
@@ -80,37 +67,20 @@ public class InstrumentationAgent {
 						});
 			}
 			for (String name : names) {
-				System.out.printf("can not load jar from %s: %s", sub, name);
+				System.out.println(String.format("can not load jar from %s: %s", sub, name));
 			}
 		} else {
-			throw new Exception(String.format("invalid directory: %s", sub));
+			throw new IOException(String.format("invalid directory: %s", sub));
 		}
 	}
 
-	private static Path getBasePath() throws Exception {
+	private static Path getBasePath() throws IOException, URISyntaxException {
 		Path path = Paths.get(InstrumentationAgent.class.getProtectionDomain().getCodeSource().getLocation().toURI());
 		Path version = path.resolveSibling("version.o2");
 		if (Files.exists(version) && Files.isRegularFile(version)) {
 			return version.getParent();
 		}
-		throw new Exception("can not define o2server base directory.");
+		throw new IOException("can not define o2server base directory.");
 	}
 
-	private static void addURLToClassPath(Path jarPath) {
-		ClassLoader classLoader = ClassLoader.getSystemClassLoader();
-		try {
-			if (classLoader instanceof URLClassLoader) {
-				Method method = classLoader.getClass().getDeclaredMethod("addURL", URL.class);
-				method.setAccessible(true);
-				method.invoke(classLoader, jarPath.toUri().toURL());
-			} else {
-				Method method = classLoader.getClass().getDeclaredMethod("appendToClassPathForInstrumentation",
-						String.class);
-				method.setAccessible(true);
-				method.invoke(classLoader, jarPath.toAbsolutePath().toString());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
 }

+ 71 - 83
o2server/x_console/src/main/java/com/x/server/console/Main.java

@@ -51,88 +51,77 @@ public class Main {
 
 	private static final String MANIFEST_FILENAME = "manifest.cfg";
 	private static final String GITIGNORE_FILENAME = ".gitignore";
-	public static boolean slf4jOtherImplOn = false;
+	private static final LinkedBlockingQueue<String> commandQueue = new LinkedBlockingQueue<>();
+
+	private static final Thread swapCommandThread = new Thread(() -> {
+		// 文件中的命令输出到解析器
+		try (RandomAccessFile raf = new RandomAccessFile(Config.base() + "/command.swap", "rw")) {
+			FileChannel fc = raf.getChannel();
+			MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 256);
+			byte[] fillBytes = new byte[256];
+			byte[] readBytes = new byte[256];
+			Arrays.fill(fillBytes, (byte) 0);
+			mbb.put(fillBytes);
+			FileLock flock = null;
+			String cmd = "";
+			while (true) {
+				flock = fc.lock();
+				mbb.position(0);
+				mbb.get(readBytes, 0, 256);
+				mbb.position(0);
+				mbb.put(fillBytes);
+				flock.release();
+				if (!Arrays.equals(readBytes, fillBytes)) {
+					cmd = StringUtils.trim(new String(readBytes, DefaultCharset.charset));
+					System.out.println("read command:" + cmd);
+					commandQueue.put(cmd);
+					continue;
+				}
+				Thread.sleep(1500);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	});
+
+	private static final Thread consoleCommandThread = new Thread(() -> {
+		// 将屏幕命令输出到解析器
+		try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
+			String cmd = "";
+			while (null != cmd) {
+				cmd = reader.readLine();
+				// 在linux环境中当前端console窗口关闭后会导致可以立即read到一个null的input值
+				if (null != cmd) {
+					commandQueue.put(cmd);
+					continue;
+				}
+				Thread.sleep(5000);
+			}
+		} catch (Exception e) {
+			System.out.println("console input closed!");
+		}
+	});
 
-	public static void main(String[] args) throws Exception {
+	private static void init() throws Exception {
 		String base = getBasePath();
 		pid(base);
 		scanWar(base);
-		// loadJars(base);
-		/* getVersion需要FileUtils在后面运行 */
 		cleanTempDir(base);
 		createTempClassesDirectory(base);
-		// LogTools.setSlf4jSimple();
-		try {
-			Main.class.getClassLoader().loadClass("org.slf4j.impl.SimpleLogger");
-			LogTools.setSlf4jSimple();
-		} catch (ClassNotFoundException ex) {
-			System.out.println("ignore:" + ex.getMessage());
-			slf4jOtherImplOn = true;
-		}
-		org.slf4j.impl.StaticLoggerBinder.getSingleton();
+		LogTools.setSlf4jSimple();
+		// org.slf4j.impl.StaticLoggerBinder.getSingleton();
 		SystemOutErrorSideCopyBuilder.start();
 		ResourceFactory.bind();
 		CommandFactory.printStartHelp();
-		/* 以下可以使用Config */
+	}
+
+	public static void main(String[] args) throws Exception {
+		init();
 		if (null == Config.currentNode()) {
 			throw new Exception("无法找到当前节点,请检查config/node_{name}.json与local/node.cfg文件内容中的名称是否一致.");
 		}
-		final LinkedBlockingQueue<String> commandQueue = new LinkedBlockingQueue<>();
-		// try (PipedInputStream pipedInput = new PipedInputStream();
-		// PipedOutputStream pipedOutput = new PipedOutputStream(pipedInput)) {
-		new Thread() {
-			/* 文件中的命令输出到解析器 */
-			public void run() {
-				try (RandomAccessFile raf = new RandomAccessFile(Config.base() + "/command.swap", "rw")) {
-					FileChannel fc = raf.getChannel();
-					MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 256);
-					byte[] fillBytes = new byte[256];
-					byte[] readBytes = new byte[256];
-					Arrays.fill(fillBytes, (byte) 0);
-					mbb.put(fillBytes);
-					FileLock flock = null;
-					String cmd = "";
-					while (true) {
-						flock = fc.lock();
-						mbb.position(0);
-						mbb.get(readBytes, 0, 256);
-						mbb.position(0);
-						mbb.put(fillBytes);
-						flock.release();
-						if (!Arrays.equals(readBytes, fillBytes)) {
-							cmd = StringUtils.trim(new String(readBytes, DefaultCharset.charset));
-							System.out.println("read command:" + cmd);
-							commandQueue.put(cmd);
-							continue;
-						}
-						Thread.sleep(1000);
-					}
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		}.start();
-		new Thread() {
-			/* 将屏幕命令输出到解析器 */
-			public void run() {
-				try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
-					String cmd = "";
-					while (null != cmd) {
-						cmd = reader.readLine();
-						/** 在linux环境中当前端console窗口关闭后会导致可以立即read到一个null的input值 */
-						if (null != cmd) {
-							commandQueue.put(cmd);
-							continue;
-						}
-						Thread.sleep(5000);
-					}
-				} catch (Exception e) {
-					System.out.println("console input closed!");
-				}
-			}
-		}.start();
-
-		/* 启动NodeAgent */
+		swapCommandThread.start();
+		consoleCommandThread.start();
 		if (BooleanUtils.isTrue(Config.currentNode().nodeAgentEnable())) {
 			NodeAgent nodeAgent = new NodeAgent();
 			nodeAgent.setCommandQueue(commandQueue);
@@ -143,7 +132,7 @@ public class Main {
 		SchedulerBuilder schedulerBuilder = new SchedulerBuilder();
 		Scheduler scheduler = schedulerBuilder.start();
 
-		if (Config.currentNode().autoStart()) {
+		if (BooleanUtils.isTrue(Config.currentNode().autoStart())) {
 			startAll();
 		}
 
@@ -246,10 +235,9 @@ public class Main {
 			if (matcher.find()) {
 				exit();
 			}
-
 			System.out.println("unknown command:" + cmd);
 		}
-		/* 关闭定时器 */
+		// 关闭定时器
 		scheduler.shutdown();
 		SystemOutErrorSideCopyBuilder.stop();
 	}
@@ -282,7 +270,7 @@ public class Main {
 
 	private static void startDataServer() {
 		try {
-			if (Servers.dataServerIsRunning()) {
+			if (BooleanUtils.isTrue(Servers.dataServerIsRunning())) {
 				System.out.println("data server is running.");
 			} else {
 				Servers.startDataServer();
@@ -294,7 +282,7 @@ public class Main {
 
 	private static void stopDataServer() {
 		try {
-			if (!Servers.dataServerIsRunning()) {
+			if (BooleanUtils.isFalse(Servers.dataServerIsRunning())) {
 				System.out.println("data server is not running.");
 			} else {
 				Servers.stopDataServer();
@@ -306,7 +294,7 @@ public class Main {
 
 	private static void startStorageServer() {
 		try {
-			if (Servers.storageServerIsRunning()) {
+			if (BooleanUtils.isTrue(Servers.storageServerIsRunning())) {
 				System.out.println("storage server is running.");
 			} else {
 				Servers.startStorageServer();
@@ -318,7 +306,7 @@ public class Main {
 
 	private static void stopStorageServer() {
 		try {
-			if (!Servers.storageServerIsRunning()) {
+			if (BooleanUtils.isFalse(Servers.storageServerIsRunning())) {
 				System.out.println("storage server is not running.");
 			} else {
 				Servers.stopStorageServer();
@@ -330,7 +318,7 @@ public class Main {
 
 	private static void startApplicationServer() {
 		try {
-			if (Servers.applicationServerIsRunning()) {
+			if (BooleanUtils.isTrue(Servers.applicationServerIsRunning())) {
 				System.out.println("application server is running.");
 			} else {
 				Servers.startApplicationServer();
@@ -342,7 +330,7 @@ public class Main {
 
 	private static void stopApplicationServer() {
 		try {
-			if (!Servers.applicationServerIsRunning()) {
+			if (BooleanUtils.isFalse(Servers.applicationServerIsRunning())) {
 				System.out.println("application server is not running.");
 			} else {
 				Servers.stopApplicationServer();
@@ -354,7 +342,7 @@ public class Main {
 
 	private static void startCenterServer() {
 		try {
-			if (Servers.centerServerIsRunning()) {
+			if (BooleanUtils.isTrue(Servers.centerServerIsRunning())) {
 				System.out.println("center server is running.");
 			} else {
 				Servers.startCenterServer();
@@ -366,7 +354,7 @@ public class Main {
 
 	private static void stopCenterServer() {
 		try {
-			if (!Servers.centerServerIsRunning()) {
+			if (BooleanUtils.isFalse(Servers.centerServerIsRunning())) {
 				System.out.println("center server is not running.");
 			} else {
 				Servers.stopCenterServer();
@@ -378,7 +366,7 @@ public class Main {
 
 	private static void startWebServer() {
 		try {
-			if (Servers.webServerIsRunning()) {
+			if (BooleanUtils.isTrue(Servers.webServerIsRunning())) {
 				System.out.println("web server is running.");
 			} else {
 				Servers.startWebServer();
@@ -390,7 +378,7 @@ public class Main {
 
 	private static void stopWebServer() {
 		try {
-			if (!Servers.webServerIsRunning()) {
+			if (BooleanUtils.isFalse(Servers.webServerIsRunning())) {
 				System.out.println("web server is not running.");
 			} else {
 				Servers.stopWebServer();

+ 95 - 101
o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java

@@ -63,13 +63,10 @@ public class NodeAgent extends Thread {
 
 	private static Logger logger = LoggerFactory.getLogger(NodeAgent.class);
 
-	public NodeAgent() {
-	}
-
 	public static final Pattern redeploy_pattern = Pattern.compile("^redeploy:(.+)$", Pattern.CASE_INSENSITIVE);
-	
+
 	public static final Pattern uninstall_pattern = Pattern.compile("^uninstall:(.+)$", Pattern.CASE_INSENSITIVE);
-	
+
 	public static final Pattern syncFile_pattern = Pattern.compile("^syncFile:(.+)$", Pattern.CASE_INSENSITIVE);
 
 	public static final Pattern upload_resource_pattern = Pattern.compile("^uploadResource:(.+)$",
@@ -114,7 +111,7 @@ public class NodeAgent extends Thread {
 								continue;
 							}
 						}
-						
+
 						matcher = syncFile_pattern.matcher(commandObject.getCommand());
 						if (matcher.find()) {
 							String strCommand = commandObject.getCommand();
@@ -122,7 +119,7 @@ public class NodeAgent extends Thread {
 							strCommand = strCommand.substring(strCommand.indexOf(":") + 1, strCommand.length());
 							logger.info("收接到同步命令:" + strCommand);
 							String syncFilePath = dis.readUTF();
-							File file  = new File(Config.base(), syncFilePath);
+							File file = new File(Config.base(), syncFilePath);
 							fos = new FileOutputStream(file);
 							byte[] bytes = new byte[1024];
 							int length = 0;
@@ -131,11 +128,11 @@ public class NodeAgent extends Thread {
 								fos.flush();
 							}
 							fos.close();
-                         	logger.info("同步完成");
+							logger.info("同步完成");
 							continue;
 
 						}
-						
+
 						matcher = uninstall_pattern.matcher(commandObject.getCommand());
 						if (matcher.find()) {
 							String strCommand = commandObject.getCommand();
@@ -145,25 +142,24 @@ public class NodeAgent extends Thread {
 							String filename = dis.readUTF();
 							File tempFile = null;
 							switch (strCommand) {
-								case "customWar":
-									tempFile = Config.dir_custom();
-									break;
-								case "customJar":
-									tempFile = Config.dir_custom_jars();
-									break;
+							case "customWar":
+								tempFile = Config.dir_custom();
+								break;
+							case "customJar":
+								tempFile = Config.dir_custom_jars();
+								break;
 							}
 							logger.info("文件名path:" + tempFile.getAbsolutePath() + File.separator + filename);
 							File file = new File(tempFile.getAbsolutePath() + File.separator + filename);
-							
+
 							filename = filename.substring(0, filename.lastIndexOf("."));
 							// uninstall
-							 boolean result = this.customWarUninstall(filename);
-							 
+							boolean result = this.customWarUninstall(filename);
+
 							logger.info("uninstall:" + result);
 							continue;
 						}
 
-						
 						matcher = redeploy_pattern.matcher(commandObject.getCommand());
 						if (matcher.find()) {
 							String strCommand = commandObject.getCommand();
@@ -173,18 +169,18 @@ public class NodeAgent extends Thread {
 							String filename = dis.readUTF();
 							File tempFile = null;
 							switch (strCommand) {
-								case "storeWar":
-									tempFile = Config.dir_store();
-									break;
-								case "storeJar":
-									tempFile = Config.dir_store_jars();
-									break;
-								case "customWar":
-									tempFile = Config.dir_custom();
-									break;
-								case "customJar":
-									tempFile = Config.dir_custom_jars();
-									break;
+							case "storeWar":
+								tempFile = Config.dir_store();
+								break;
+							case "storeJar":
+								tempFile = Config.dir_store_jars();
+								break;
+							case "customWar":
+								tempFile = Config.dir_custom();
+								break;
+							case "customJar":
+								tempFile = Config.dir_custom_jars();
+								break;
 							}
 							FileTools.forceMkdir(tempFile);
 							logger.info("文件名path:" + tempFile.getAbsolutePath() + File.separator + filename);
@@ -200,7 +196,7 @@ public class NodeAgent extends Thread {
 							bytes = FileUtils.readFileToByteArray(file);
 							filename = filename.substring(0, filename.lastIndexOf("."));
 							// 部署
-							String result = this.redeploy(filename, bytes,true);
+							String result = this.redeploy(filename, bytes, true);
 							logger.info("部署:" + result);
 							continue;
 
@@ -242,28 +238,28 @@ public class NodeAgent extends Thread {
 							strCommand = strCommand.trim();
 							strCommand = strCommand.substring(strCommand.indexOf(":") + 1, strCommand.length());
 							logger.info("收接到命令:" + strCommand);
-							
-							//为了同步文件
-	                        if (strCommand.indexOf("create encrypt")>-1) {
-	                        	matcher = CommandFactory.create_encrypt_key_pattern.matcher(strCommand);
-	                			if (matcher.find()) {
-	                				try {
-	                					boolean CreateEncryptKey = new ActionCreateEncryptKey().execute();
-	                					if(CreateEncryptKey) {
-	                						dos.writeUTF("Create Encrypt Key true");
-	                						dos.flush();
-	                					}else {
-	                						dos.writeUTF("Create Encryp tKey false");
-	                						dos.flush();
-	                					}
-	                				} catch (Exception e) {
-	                					e.printStackTrace();
-	                				}
-	                			}
-							}else {
-							    commandQueue.add(strCommand);
+
+							// 为了同步文件
+							if (strCommand.indexOf("create encrypt") > -1) {
+								matcher = CommandFactory.create_encrypt_key_pattern.matcher(strCommand);
+								if (matcher.find()) {
+									try {
+										boolean CreateEncryptKey = new ActionCreateEncryptKey().execute();
+										if (CreateEncryptKey) {
+											dos.writeUTF("Create Encrypt Key true");
+											dos.flush();
+										} else {
+											dos.writeUTF("Create Encryp tKey false");
+											dos.flush();
+										}
+									} catch (Exception e) {
+										e.printStackTrace();
+									}
+								}
+							} else {
+								commandQueue.add(strCommand);
 							}
-	                        
+
 							continue;
 						}
 
@@ -414,18 +410,18 @@ public class NodeAgent extends Thread {
 		try {
 			logger.print("redeploy:{}.", name);
 			switch (this.type(name)) {
-				case "storeWar":
-					storeWar(name, bytes);
-					break;
-				case "storeJar":
-					storeJar(name, bytes);
-					break;
-				case "customWar":
-					customWar(name, bytes,rebootApp);
-					break;
-				case "customJar":
-					customJar(name, bytes,rebootApp);
-					break;
+			case "storeWar":
+				storeWar(name, bytes);
+				break;
+			case "storeJar":
+				storeJar(name, bytes);
+				break;
+			case "customWar":
+				customWar(name, bytes, rebootApp);
+				break;
+			case "customJar":
+				customJar(name, bytes, rebootApp);
+				break;
 			}
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -485,8 +481,7 @@ public class NodeAgent extends Thread {
 		for (ClassInfo info : classInfos) {
 			contextPaths.add("/" + info.getSimpleName());
 		}
-		
-		
+
 		if (Servers.applicationServerIsRunning()) {
 			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
 			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
@@ -513,7 +508,7 @@ public class NodeAgent extends Thread {
 				}
 			}
 		}
-		
+
 		if (Servers.applicationServerIsRunning()) {
 			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
 			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
@@ -542,10 +537,10 @@ public class NodeAgent extends Thread {
 		}
 	}
 
-	private  boolean customWarUninstall(String simpleName) throws Exception {
+	private boolean customWarUninstall(String simpleName) throws Exception {
 		boolean stop = false;
 		File war = new File(Config.dir_custom(true), simpleName + ".war");
-		//File dir = new File(Config.dir_servers_applicationServer_work(), simpleName);
+		// File dir = new File(Config.dir_servers_applicationServer_work(), simpleName);
 		if (Servers.applicationServerIsRunning()) {
 			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
 			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
@@ -564,12 +559,12 @@ public class NodeAgent extends Thread {
 		}
 		return stop;
 	}
-	
-	private void customWar(String simpleName, byte[] bytes,boolean rebootApp) throws Exception {
+
+	private void customWar(String simpleName, byte[] bytes, boolean rebootApp) throws Exception {
 		File war = new File(Config.dir_custom(true), simpleName + ".war");
 		File dir = new File(Config.dir_servers_applicationServer_work(), simpleName);
 		FileUtils.writeByteArrayToFile(war, bytes, false);
-		boolean isStartApplication = false;//第一次上传
+		boolean isStartApplication = false;// 第一次上传
 		if (Servers.applicationServerIsRunning()) {
 			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
 			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
@@ -585,15 +580,15 @@ public class NodeAgent extends Thread {
 					}
 				}
 			}
-			
-			if(rebootApp) {
-				if(!isStartApplication) {
-				  customWarPublish(simpleName);
+
+			if (rebootApp) {
+				if (!isStartApplication) {
+					customWarPublish(simpleName);
 				}
 			}
 		}
 	}
-	
+
 	private void customWarPublish(String name) throws Exception {
 		File war = new File(Config.dir_custom(), name + ".war");
 		File dir = new File(Config.dir_servers_applicationServer_work(), name);
@@ -613,11 +608,12 @@ public class NodeAgent extends Thread {
 			webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
 			webApp.getInitParams().put("org.eclipse.jetty.jsp.precompiled", "true");
 			webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
-			
+
 			/* stat */
 			if (BooleanUtils.isTrue(Config.currentNode().getApplication().getStatEnable())) {
 				FilterHolder statFilterHolder = new FilterHolder(new WebStatFilter());
-				statFilterHolder.setInitParameter("exclusions",  Config.currentNode().getApplication().getStatExclusions());
+				statFilterHolder.setInitParameter("exclusions",
+						Config.currentNode().getApplication().getStatExclusions());
 				webApp.addFilter(statFilterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
 				ServletHolder statServletHolder = new ServletHolder(StatViewServlet.class);
 				statServletHolder.setInitParameter("sessionStatEnable", "false");
@@ -625,7 +621,7 @@ public class NodeAgent extends Thread {
 			}
 			/* stat end */
 			logger.print("addHandler {} ", webApp.getDisplayName());
-			
+
 			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
 			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
 			hanlderList.addHandler(webApp);
@@ -635,7 +631,7 @@ public class NodeAgent extends Thread {
 		}
 	}
 
-	private void customJar(String simpleName, byte[] bytes,boolean rebootApp) throws Exception {
+	private void customJar(String simpleName, byte[] bytes, boolean rebootApp) throws Exception {
 		File jar = new File(Config.dir_custom_jars(true), simpleName + ".jar");
 		FileUtils.writeByteArrayToFile(jar, bytes, false);
 		List<String> contexts = new ArrayList<>();
@@ -649,7 +645,7 @@ public class NodeAgent extends Thread {
 			for (Handler handler : hanlderList.getHandlers()) {
 				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
 					QuickStartWebApp app = (QuickStartWebApp) handler;
-					if (contexts.contains(app.getContextPath())  ) {
+					if (contexts.contains(app.getContextPath())) {
 						app.stop();
 						logger.print("{} need restart because {} redeployed.", app.getDisplayName(), simpleName);
 						Thread.sleep(3000);
@@ -658,12 +654,12 @@ public class NodeAgent extends Thread {
 					}
 				}
 			}
-			
-			if(rebootApp) {
-				if(!isStartApplication) {
-				  Servers.stopApplicationServer();
-				  Thread.sleep(1000);
-				  Servers.startApplicationServer();
+
+			if (rebootApp) {
+				if (!isStartApplication) {
+					Servers.stopApplicationServer();
+					Thread.sleep(1000);
+					Servers.startApplicationServer();
 				}
 			}
 		}
@@ -671,7 +667,7 @@ public class NodeAgent extends Thread {
 
 	private List<ClassInfo> listModuleDependencyWith(String name) throws Exception {
 		List<ClassInfo> list = new ArrayList<>();
-		try (ScanResult scanResult = new ClassGraph().enableAnnotationInfo().scan()) {
+		try (ScanResult scanResult = new ClassGraph().addClassLoader(ClassLoaderTools.urlClassLoader(true, false, false,false,false)).enableAnnotationInfo().scan()) {
 			List<ClassInfo> classInfos = scanResult.getClassesWithAnnotation(Module.class.getName());
 			for (ClassInfo info : classInfos) {
 				Class<?> cls = Class.forName(info.getName());
@@ -690,7 +686,7 @@ public class NodeAgent extends Thread {
 	}
 
 	private ClassInfo scanModuleClassInfo(String name) throws Exception {
-		try (ScanResult scanResult = new ClassGraph().enableAnnotationInfo().scan()) {
+		try (ScanResult scanResult = new ClassGraph().addClassLoader(ClassLoaderTools.urlClassLoader(true, false, false, false, false)).enableAnnotationInfo().scan()) {
 			List<ClassInfo> classInfos = scanResult.getClassesWithAnnotation(Module.class.getName());
 			for (ClassInfo info : classInfos) {
 				Class<?> clz = Class.forName(info.getName());
@@ -713,7 +709,7 @@ public class NodeAgent extends Thread {
 			FileUtils.writeStringToFile(lastModified, war.lastModified() + "", DefaultCharset.charset_utf_8, false);
 		}
 	}
-   
+
 	private static void modified(File war, File dir) throws IOException {
 		File lastModified = new File(dir, "WEB-INF/lastModified");
 		if ((!lastModified.exists()) || lastModified.isDirectory() || (war.lastModified() != NumberUtils
@@ -725,7 +721,7 @@ public class NodeAgent extends Thread {
 			FileUtils.writeStringToFile(lastModified, war.lastModified() + "", DefaultCharset.charset_utf_8, false);
 		}
 	}
-	
+
 	private static String contextParamProject(File dir) throws Exception {
 		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 		DocumentBuilder builder = factory.newDocumentBuilder();
@@ -737,7 +733,7 @@ public class NodeAgent extends Thread {
 		String str = expr.evaluate(doc, XPathConstants.STRING).toString();
 		return StringUtils.trim(str);
 	}
-	
+
 	protected static String calculateExtraClassPath(Class<?> cls, Path... paths) throws Exception {
 		List<String> jars = new ArrayList<>();
 		jars.addAll(calculateExtraClassPathDefault());
@@ -771,7 +767,7 @@ public class NodeAgent extends Thread {
 		}
 		return StringUtils.join(jars, ";");
 	}
-	
+
 	private static List<String> calculateExtraClassPathDefault() throws Exception {
 		List<String> jars = new ArrayList<>();
 		IOFileFilter filter = new WildcardFileFilter(x_base_core_project.class.getSimpleName() + "*.jar");
@@ -783,18 +779,16 @@ public class NodeAgent extends Thread {
 		/* 如果不单独导入会导致java.lang.NoClassDefFoundError: org/eclipse/jetty/http/MimeTypes */
 		filter = FileFilterUtils.or(filter, new WildcardFileFilter("jetty-all-*.jar"));
 		filter = FileFilterUtils.or(filter, new WildcardFileFilter("quartz-*.jar"));
-		if (!com.x.server.console.Main.slf4jOtherImplOn) {
-			filter = FileFilterUtils.or(filter, new WildcardFileFilter("slf4j-simple-*.jar"));
-			filter = FileFilterUtils.or(filter, new WildcardFileFilter("jul-to-slf4j-*.jar"));
-			filter = FileFilterUtils.or(filter, new WildcardFileFilter("log4j-*.jar"));
-		}
+		filter = FileFilterUtils.or(filter, new WildcardFileFilter("slf4j-simple-*.jar"));
+		filter = FileFilterUtils.or(filter, new WildcardFileFilter("jul-to-slf4j-*.jar"));
+		filter = FileFilterUtils.or(filter, new WildcardFileFilter("log4j-*.jar"));
 		/* jersey从AppClassLoader加载 */
 		for (File o : FileUtils.listFiles(Config.dir_commons_ext(), filter, null)) {
 			jars.add(o.getAbsolutePath());
 		}
 		return jars;
 	}
-	
+
 	public static class CommandObject {
 
 		private String command;

+ 4 - 4
o2server/x_console/src/main/java/com/x/server/console/ResourceFactory.java

@@ -14,6 +14,7 @@ import java.util.concurrent.LinkedBlockingQueue;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.dbcp2.BasicDataSource;
+import org.apache.commons.lang3.BooleanUtils;
 import org.eclipse.jetty.plus.jndi.Resource;
 import org.eclipse.jetty.util.RolloverFileOutputStream;
 
@@ -52,10 +53,10 @@ public class ResourceFactory {
 			containerEntityNames(sr);
 			stroageContainerEntityNames(sr);
 		}
-		if (Config.logLevel().audit().enable()) {
+		if (BooleanUtils.isTrue(Config.logLevel().audit().enable())) {
 			auditLog();
 		}
-		if (Config.externalDataSources().enable()) {
+		if (BooleanUtils.isTrue(Config.externalDataSources().enable())) {
 			external();
 		} else {
 			internal();
@@ -117,7 +118,7 @@ public class ResourceFactory {
 			/* 增加校验 */
 			dataSource.setTestConnectionOnCheckin(true);
 			dataSource.setAcquireIncrement(0);
-			if (ds.getStatEnable()) {
+			if (BooleanUtils.isTrue(ds.getStatEnable())) {
 				dataSource.setFilters(ds.getStatFilter());
 				Properties properties = new Properties();
 				// property name="connectionProperties" value="druid.stat.slowSqlMillis=5000
@@ -253,7 +254,6 @@ public class ResourceFactory {
 	private static void processPlatformExecutors() throws Exception {
 		ExecutorService[] services = new ExecutorService[Config.processPlatform().getExecutorCount()];
 		for (int i = 0; i < Config.processPlatform().getExecutorCount(); i++) {
-			// services[i] = Executors.newSingleThreadExecutor();
 			services[i] = Executors.newFixedThreadPool(1);
 		}
 

+ 4 - 7
o2server/x_console/src/main/java/com/x/server/console/server/JettySeverTools.java

@@ -3,7 +3,6 @@ package com.x.server.console.server;
 import java.io.File;
 import java.nio.file.FileVisitOption;
 import java.nio.file.Files;
-import java.nio.file.LinkOption;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
@@ -29,7 +28,7 @@ import com.x.base.core.project.config.Config;
 public abstract class JettySeverTools {
 
 	protected static void addHttpsConnector(Server server, Integer port) throws Exception {
-		SslContextFactory sslContextFactory = new SslContextFactory();
+		SslContextFactory sslContextFactory = new SslContextFactory.Server();
 		sslContextFactory.setKeyStorePath(Config.sslKeyStore().getAbsolutePath());
 		sslContextFactory.setKeyStorePassword(Config.token().getSslKeyStorePassword());
 		sslContextFactory.setKeyManagerPassword(Config.token().getSslKeyManagerPassword());
@@ -115,11 +114,9 @@ public abstract class JettySeverTools {
 		/* 如果不单独导入会导致java.lang.NoClassDefFoundError: org/eclipse/jetty/http/MimeTypes */
 		filter = FileFilterUtils.or(filter, new WildcardFileFilter("jetty-all-*.jar"));
 		filter = FileFilterUtils.or(filter, new WildcardFileFilter("quartz-*.jar"));
-		if (!com.x.server.console.Main.slf4jOtherImplOn) {
-			filter = FileFilterUtils.or(filter, new WildcardFileFilter("slf4j-simple-*.jar"));
-			filter = FileFilterUtils.or(filter, new WildcardFileFilter("jul-to-slf4j-*.jar"));
-			filter = FileFilterUtils.or(filter, new WildcardFileFilter("log4j-*.jar"));
-		}
+		filter = FileFilterUtils.or(filter, new WildcardFileFilter("slf4j-simple-*.jar"));
+		filter = FileFilterUtils.or(filter, new WildcardFileFilter("jul-to-slf4j-*.jar"));
+		filter = FileFilterUtils.or(filter, new WildcardFileFilter("log4j-*.jar"));
 		/* jersey从AppClassLoader加载 */
 		for (File o : FileUtils.listFiles(Config.dir_commons_ext(), filter, null)) {
 			jars.add(o.getAbsolutePath());

+ 111 - 88
o2server/x_console/src/main/java/com/x/server/console/server/application/ApplicationServerTools.java

@@ -3,8 +3,9 @@ package com.x.server.console.server.application;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.EnumSet;
@@ -22,6 +23,7 @@ import javax.xml.xpath.XPathFactory;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.commons.io.filefilter.WildcardFileFilter;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -69,9 +71,11 @@ import com.x.base.core.project.config.ApplicationServer;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ClassLoaderTools;
 import com.x.base.core.project.tools.DefaultCharset;
 import com.x.base.core.project.tools.JarTools;
 import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.PathTools;
 import com.x.base.core.project.tools.StringTools;
 import com.x.server.console.server.JettySeverTools;
 
@@ -83,8 +87,8 @@ public class ApplicationServerTools extends JettySeverTools {
 
 	private static Logger logger = LoggerFactory.getLogger(ApplicationServerTools.class);
 
-	private static int APPLICATIONSERVER_THREAD_POOL_SIZE_MIN = 50;
-	private static int APPLICATIONSERVER_THREAD_POOL_SIZE_MAX = 500;
+	private static final int APPLICATIONSERVER_THREAD_POOL_SIZE_MIN = 50;
+	private static final int APPLICATIONSERVER_THREAD_POOL_SIZE_MAX = 500;
 
 	private static final List<String> OFFICIAL_MODULE_SORTED_TEMPLATE = ListTools.toList(
 			x_general_assemble_control.class.getName(), x_organization_assemble_authentication.class.getName(),
@@ -111,76 +115,12 @@ public class ApplicationServerTools extends JettySeverTools {
 
 		HandlerList handlers = new HandlerList();
 
-		logger.print("start to deploy official module, size:{}.", officialClassInfos.size());
+		logger.print("start to deploy official module: {}, custom module: {}.", officialClassInfos.size(),
+				customNames.size());
 
-		for (ClassInfo info : officialClassInfos) {
-			Class<?> clz = Class.forName(info.getName());
-			/* 检查store目录是否存在war文件 */
-			File war = new File(Config.dir_store(), info.getSimpleName() + ".war");
-			File dir = new File(Config.dir_servers_applicationServer_work(), info.getSimpleName());
-			if (war.exists()) {
-				modified(war, dir);
-				QuickStartWebApp webApp = new QuickStartWebApp();
-				webApp.setAutoPreconfigure(false);
-				webApp.setDisplayName(clz.getSimpleName());
-				webApp.setContextPath("/" + clz.getSimpleName());
-				webApp.setResourceBase(dir.getAbsolutePath());
-				webApp.setDescriptor(new File(dir, "WEB-INF/web.xml").getAbsolutePath());
-				webApp.setExtraClasspath(calculateExtraClassPath(clz));
-				// webApp.getMimeTypes().addMimeMapping("wcss", "application/json");
-				webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
-				webApp.getInitParams().put("org.eclipse.jetty.jsp.precompiled", "true");
-				webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
-				/* stat */
-				if (applicationServer.getStatEnable()) {
-					FilterHolder holder = new FilterHolder(new WebStatFilter());
-					holder.setInitParameter("exclusions", applicationServer.getStatExclusions());
-					webApp.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
-					webApp.addServlet(StatViewServlet.class, "/druid/*");
-				}
-				/* stat end */
-				handlers.addHandler(webApp);
-			} else if (dir.exists()) {
-				FileUtils.forceDelete(dir);
-			}
-		}
+		deployOfficial(applicationServer, handlers, officialClassInfos);
 
-		logger.print("start to deploy custom module, size:{}.", customNames.size());
-
-		for (String name : customNames) {
-			File war = new File(Config.dir_custom(), name + ".war");
-			File dir = new File(Config.dir_servers_applicationServer_work(), name);
-			if (war.exists()) {
-				modified(war, dir);
-				String className = contextParamProject(dir);
-				URLClassLoader classLoader = new URLClassLoader(
-						new URL[] { new File(dir, "WEB-INF/classes").toURI().toURL() });
-				Class<?> cls = classLoader.loadClass(className);
-				QuickStartWebApp webApp = new QuickStartWebApp();
-				webApp.setAutoPreconfigure(false);
-				webApp.setDisplayName(name);
-				webApp.setContextPath("/" + name);
-				webApp.setResourceBase(dir.getAbsolutePath());
-				webApp.setDescriptor(dir + "/WEB-INF/web.xml");
-				webApp.setExtraClasspath(calculateExtraClassPath(cls));
-				webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
-				webApp.getInitParams().put("org.eclipse.jetty.jsp.precompiled", "true");
-				webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
-				/* stat */
-				if (BooleanUtils.isTrue(applicationServer.getStatEnable())) {
-					FilterHolder statFilterHolder = new FilterHolder(new WebStatFilter());
-					statFilterHolder.setInitParameter("exclusions", applicationServer.getStatExclusions());
-					webApp.addFilter(statFilterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
-					ServletHolder statServletHolder = new ServletHolder(StatViewServlet.class);
-					statServletHolder.setInitParameter("sessionStatEnable", "false");
-					webApp.addServlet(statServletHolder, "/druid/*");
-				}
-				/* stat end */
-				handlers.addHandler(webApp);
-			} else if (dir.exists()) {
-				FileUtils.forceDelete(dir);
-			}
-		}
+		deployCustom(applicationServer, handlers, customNames);
 
 		QueuedThreadPool threadPool = new QueuedThreadPool();
 		threadPool.setMinThreads(APPLICATIONSERVER_THREAD_POOL_SIZE_MIN);
@@ -211,8 +151,90 @@ public class ApplicationServerTools extends JettySeverTools {
 		return server;
 	}
 
+	private static void deployCustom(ApplicationServer applicationServer, HandlerList handlers,
+			List<String> customNames) {
+		customNames.parallelStream().forEach(name -> {
+			try {
+				Path war = Paths.get(Config.dir_custom().toString(), name + PathTools.DOT_WAR);
+				Path dir = Paths.get(Config.dir_servers_applicationServer_work().toString(), name);
+				if (Files.exists(war)) {
+					modified(war, dir);
+					String className = contextParamProject(dir);
+					Class<?> cls = ClassLoaderTools.urlClassLoader(false, false, false, false, false,
+							Paths.get(dir.toString(), PathTools.WEB_INF_CLASSES)).loadClass(className);
+					QuickStartWebApp webApp = new QuickStartWebApp();
+					webApp.setAutoPreconfigure(false);
+					webApp.setDisplayName(name);
+					webApp.setContextPath("/" + name);
+					webApp.setResourceBase(dir.toAbsolutePath().toString());
+					webApp.setDescriptor(dir.resolve(Paths.get(PathTools.WEB_INF_WEB_XML)).toString());
+					webApp.setExtraClasspath(calculateExtraClassPath(cls));
+					webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer",
+							BooleanUtils.toStringTrueFalse(false));
+					webApp.getInitParams().put("org.eclipse.jetty.jsp.precompiled",
+							BooleanUtils.toStringTrueFalse(true));
+					webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed",
+							BooleanUtils.toStringTrueFalse(false));
+					if (BooleanUtils.isTrue(applicationServer.getStatEnable())) {
+						FilterHolder statFilterHolder = new FilterHolder(new WebStatFilter());
+						statFilterHolder.setInitParameter("exclusions", applicationServer.getStatExclusions());
+						webApp.addFilter(statFilterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
+						ServletHolder statServletHolder = new ServletHolder(StatViewServlet.class);
+						statServletHolder.setInitParameter("sessionStatEnable", BooleanUtils.toStringTrueFalse(false));
+						webApp.addServlet(statServletHolder, "/druid/*");
+					}
+					handlers.addHandler(webApp);
+				} else if (Files.exists(dir)) {
+					PathUtils.cleanDirectory(dir);
+				}
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private static void deployOfficial(ApplicationServer applicationServer, HandlerList handlers,
+			List<ClassInfo> officialClassInfos) {
+		officialClassInfos.parallelStream().forEach(info -> {
+			try {
+				Class<?> clz = Class.forName(info.getName());
+				Path war = Paths.get(Config.dir_store().toString(), info.getSimpleName() + PathTools.DOT_WAR);
+				Path dir = Paths.get(Config.dir_servers_applicationServer_work().toString(), info.getSimpleName());
+				if (Files.exists(war)) {
+					modified(war, dir);
+					QuickStartWebApp webApp = new QuickStartWebApp();
+					webApp.setAutoPreconfigure(false);
+					webApp.setDisplayName(clz.getSimpleName());
+					webApp.setContextPath("/" + clz.getSimpleName());
+					webApp.setResourceBase(dir.toAbsolutePath().toString());
+					webApp.setDescriptor(dir.resolve(Paths.get(PathTools.WEB_INF_WEB_XML)).toString());
+					webApp.setExtraClasspath(calculateExtraClassPath(clz));
+					webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer",
+							BooleanUtils.toStringTrueFalse(false));
+					webApp.getInitParams().put("org.eclipse.jetty.jsp.precompiled",
+							BooleanUtils.toStringTrueFalse(true));
+					webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed",
+							BooleanUtils.toStringTrueFalse(false));
+					if (BooleanUtils.isTrue(applicationServer.getStatEnable())) {
+						FilterHolder holder = new FilterHolder(new WebStatFilter());
+						holder.setInitParameter("exclusions", applicationServer.getStatExclusions());
+						webApp.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
+						webApp.addServlet(StatViewServlet.class, "/druid/*");
+					}
+					handlers.addHandler(webApp);
+				} else if (Files.exists(dir)) {
+					PathUtils.cleanDirectory(dir);
+				}
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
 	private static List<ClassInfo> listOfficial() throws Exception {
-		try (ScanResult scanResult = new ClassGraph().enableAnnotationInfo().scan()) {
+		try (ScanResult scanResult = new ClassGraph()
+				.addClassLoader(ClassLoaderTools.urlClassLoader(true, false, true, false, false)).enableAnnotationInfo()
+				.scan()) {
 			List<ClassInfo> list = new ArrayList<>();
 			List<ClassInfo> classInfos = scanResult.getClassesWithAnnotation(Module.class.getName());
 			for (ClassInfo info : classInfos) {
@@ -259,7 +281,7 @@ public class ApplicationServerTools extends JettySeverTools {
 
 	private static List<String> listCustom() throws Exception {
 		List<String> list = new ArrayList<>();
-		for (String str : Config.dir_custom(true).list(new WildcardFileFilter("*.war"))) {
+		for (String str : Config.dir_custom(true).list(new WildcardFileFilter("*" + PathTools.DOT_WAR))) {
 			list.add(FilenameUtils.getBaseName(str));
 		}
 		list = ListTools.includesExcludesWildcard(list, Config.currentNode().getApplication().getIncludes(),
@@ -267,11 +289,11 @@ public class ApplicationServerTools extends JettySeverTools {
 		return list;
 	}
 
-	private static String contextParamProject(File dir) throws Exception {
+	private static String contextParamProject(Path dir) throws Exception {
 		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 		DocumentBuilder builder = factory.newDocumentBuilder();
-		Document doc = builder
-				.parse(new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(dir, "WEB-INF/web.xml"))));
+		Document doc = builder.parse(
+				new ByteArrayInputStream(Files.readAllBytes(Paths.get(dir.toString(), PathTools.WEB_INF_WEB_XML))));
 		XPathFactory xPathfactory = XPathFactory.newInstance();
 		XPath xpath = xPathfactory.newXPath();
 		XPathExpression expr = xpath.compile("web-app/context-param[param-name='project']/param-value");
@@ -282,10 +304,8 @@ public class ApplicationServerTools extends JettySeverTools {
 	private static void cleanWorkDirectory(List<ClassInfo> officialClassInfos, List<String> customNames)
 			throws Exception {
 		List<String> names = new ArrayList<>();
-		for (ClassInfo o : officialClassInfos) {
-			names.add(o.getSimpleName());
-		}
-		names.addAll(customNames);
+		officialClassInfos.stream().map(ClassInfo::getSimpleName).forEach(names::add);
+		// names.addAll(customNames);
 		for (String str : Config.dir_servers_applicationServer_work(true).list()) {
 			if (!names.contains(str)) {
 				FileUtils.forceDelete(new File(Config.dir_servers_applicationServer_work(), str));
@@ -293,15 +313,18 @@ public class ApplicationServerTools extends JettySeverTools {
 		}
 	}
 
-	private static void modified(File war, File dir) throws IOException {
-		File lastModified = new File(dir, "WEB-INF/lastModified");
-		if ((!lastModified.exists()) || lastModified.isDirectory() || (war.lastModified() != NumberUtils
-				.toLong(FileUtils.readFileToString(lastModified, DefaultCharset.charset_utf_8), 0))) {
-			if (dir.exists()) {
-				FileUtils.forceDelete(dir);
+	private static void modified(Path war, Path dir) throws IOException {
+		Path lastModified = Paths.get(dir.toString(), PathTools.WEB_INF_LASTMODIFIED);
+		if ((!Files.exists(lastModified)) || Files.isDirectory(lastModified)
+				|| (Files.getLastModifiedTime(lastModified).toMillis() != NumberUtils
+						.toLong(FileUtils.readFileToString(lastModified.toFile(), DefaultCharset.charset_utf_8), 0))) {
+			logger.print("deploy war:{}.", war.getFileName().toAbsolutePath());
+			if (Files.exists(dir)) {
+				PathUtils.cleanDirectory(dir);
 			}
 			JarTools.unjar(war, "", dir, true);
-			FileUtils.writeStringToFile(lastModified, war.lastModified() + "", DefaultCharset.charset_utf_8, false);
+			FileUtils.writeStringToFile(lastModified.toFile(), Files.getLastModifiedTime(lastModified).toMillis() + "",
+					DefaultCharset.charset_utf_8, false);
 		}
 	}
 }

+ 4 - 1
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/jest/BaseAction.java

@@ -26,6 +26,7 @@ import com.x.base.core.project.config.WebServer;
 import com.x.base.core.project.config.WebServers;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.tools.ClassLoaderTools;
 import com.x.program.center.ThisApplication;
 
 import io.github.classgraph.ClassGraph;
@@ -172,7 +173,9 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null == assembles) {
 			synchronized (BaseAction.class) {
 				if (null == assembles) {
-					try (ScanResult scanResult = new ClassGraph().enableAnnotationInfo().scan()) {
+					try (ScanResult scanResult = new ClassGraph()
+							.addClassLoader(ClassLoaderTools.urlClassLoader(true, false, false, false, false))
+							.enableAnnotationInfo().scan()) {
 						assembles = new CopyOnWriteArrayList<Class<?>>();
 						List<ClassInfo> list = new ArrayList<>();
 						list.addAll(scanResult.getClassesWithAnnotation(Module.class.getName()));

+ 16 - 18
o2server/x_query_service_processing/src/main/webapp/describe/sources/com/x/query/service/processing/factory/QueryFactory.java

@@ -7,35 +7,34 @@ import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.tools.StringTools;
 import com.x.query.core.entity.Query;
 import com.x.query.service.processing.AbstractFactory;
 import com.x.query.service.processing.Business;
-
-import net.sf.ehcache.Ehcache;
-import net.sf.ehcache.Element;
+import com.x.base.core.project.cache.Cache.CacheCategory;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
+import java.util.Optional;
 
 public class QueryFactory extends AbstractFactory {
 
-	private Ehcache cache;
+	private CacheCategory cache;
 
 	public QueryFactory(Business business) throws Exception {
 		super(business);
-		this.cache = ApplicationCache.instance().getCache(Query.class);
+		this.cache = new CacheCategory(Query.class);
 	}
 
 	public List<Query> pick(List<String> flags) throws Exception {
 		List<Query> list = new ArrayList<>();
 		for (String str : flags) {
-			Element element = cache.get(str);
-			if (null != element) {
-				if (null != element.getObjectValue()) {
-					list.add((Query) element.getObjectValue());
-				}
+			CacheKey cacheKey = new CacheKey(str);
+			Optional<?> optional = CacheManager.get(cache, cacheKey);
+			if (optional.isPresent()) {
+				list.add((Query) optional.get());
 			} else {
 				Query o = this.pickObject(str);
-				cache.put(new Element(str, o));
+				CacheManager.put(cache, cacheKey, o);
 				if (null != o) {
 					list.add(o);
 				}
@@ -49,14 +48,13 @@ public class QueryFactory extends AbstractFactory {
 			return null;
 		}
 		Query o = null;
-		Element element = cache.get(flag);
-		if (null != element) {
-			if (null != element.getObjectValue()) {
-				o = (Query) element.getObjectValue();
-			}
+		CacheKey cacheKey = new CacheKey(flag);
+		Optional<?> optional = CacheManager.get(cache, cacheKey);
+		if (optional.isPresent()) {
+			o = (Query) optional.get();
 		} else {
 			o = this.pickObject(flag);
-			cache.put(new Element(flag, o));
+			CacheManager.put(cache, cacheKey, o);
 		}
 		return o;
 	}

+ 8 - 8
o2server/x_query_service_processing/src/main/webapp/describe/sources/com/x/query/service/processing/jaxrs/neural/ActionListCalculateWithWork.java

@@ -20,7 +20,6 @@ import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.dataitem.DataItemConverter;
 import com.x.base.core.entity.dataitem.ItemCategory;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.config.StorageMapping;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
@@ -43,8 +42,9 @@ import com.x.query.service.processing.Business;
 import com.x.query.service.processing.ThisApplication;
 import com.x.query.service.processing.helper.ExtractTextHelper;
 import com.x.query.service.processing.helper.LanguageProcessingHelper;
-
-import net.sf.ehcache.Element;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
+import java.util.Optional;
 
 class ActionListCalculateWithWork extends BaseAction {
 
@@ -63,10 +63,10 @@ class ActionListCalculateWithWork extends BaseAction {
 				throw new ExceptionModelNotReady(model.getName());
 			}
 			NeuralNetwork<MomentumBackpropagation> neuralNetwork = null;
-			String cacheKey = ApplicationCache.concreteCacheKey(this.getClass(), model.getId());
-			Element element = cache.get(cacheKey);
-			if (null != element && (null != element.getObjectValue())) {
-				neuralNetwork = ((NeuralNetwork<MomentumBackpropagation>) element.getObjectValue());
+			CacheKey cacheKey = new CacheKey(this.getClass(), model.getId());
+			Optional<?> optional = CacheManager.get(cache, cacheKey);
+			if (optional.isPresent()) {
+				neuralNetwork = ((NeuralNetwork<MomentumBackpropagation>) optional.get());
 			} else {
 				if (StringUtils.isEmpty(model.getNnet())) {
 					throw new ExceptionModelNotReady(model.getName());
@@ -75,7 +75,7 @@ class ActionListCalculateWithWork extends BaseAction {
 				NeuralNetworkCODEC.array2network(
 						DoubleTools.byteToDoubleArray(ByteTools.decompressBase64String(model.getNnet())),
 						neuralNetwork);
-				cache.put(new Element(cacheKey, neuralNetwork));
+				CacheManager.put(cache, cacheKey, neuralNetwork);
 			}
 			Wo wo = new Wo();
 			Work work = emc.flag(workId, Work.class);

+ 2 - 4
o2server/x_query_service_processing/src/main/webapp/describe/sources/com/x/query/service/processing/jaxrs/neural/BaseAction.java

@@ -1,16 +1,14 @@
 package com.x.query.service.processing.jaxrs.neural;
 
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.query.core.entity.neural.Model;
-
-import net.sf.ehcache.Ehcache;
+import com.x.base.core.project.cache.Cache.CacheCategory;
 
 abstract class BaseAction extends StandardJaxrsAction {
 
-	protected Ehcache cache = ApplicationCache.instance().getCache(Model.class);
+	protected CacheCategory cache = new CacheCategory(Model.class);
 
 	private static Logger logger = LoggerFactory.getLogger(BaseAction.class);
 

+ 0 - 1393
o2server/x_teamwork_assemble_control/src/main/webapp/jest

@@ -1,1393 +0,0 @@
-var Describe = function() {
-	// 20180730
-}
-Describe.splitValue = function(str) {
-	if (str) {
-		if (str.length > 0) {
-			return str.split(',');
-		}
-	}
-	return [];
-}
-Describe.joinValue = function(o, split) {
-	var s = ',';
-	if (split) {
-		s = '' + split;
-	}
-	if (o) {
-		if (toString.apply(o) === '[object Array]') {
-			return o.join(s);
-		}
-	}
-	return o;
-}
-Describe.doPost = function(address, m, data) {
-	$('#url').html(address);
-	if ((m.resultContentType) && m.resultContentType.indexOf('application/json') > -1) {
-		$.ajax({
-			url : address,
-			type : 'POST',
-			headers : {
-				'x-debugger' : true
-			},
-		    contentType : (m.contentType.indexOf('multipart/form-data') > -1) ? false : m.contentType ,
-			processData : (m.contentType.indexOf('application/json') > -1) ? true : false,
-			xhrFields : {
-				'withCredentials' : true
-			},
-			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
-		}).always(function(resultJson) {
-			$('#result').html(JSON.stringify(resultJson, null, 4));
-			Describe.writeOut(m.outs, resultJson);
-		});
-	} else {
-		$.ajax({
-			url : address,
-			type : 'POST',
-			headers : {
-				'x-debugger' : true
-			},
-			contentType : (m.contentType.indexOf('application/json') > -1) ? m.contentType : false,
-			processData : (m.contentType.indexOf('application/json') > -1) ? true : false,
-			xhrFields : {
-				'withCredentials' : true
-			},
-			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
-		});
-	}
-}
-Describe.doPut = function(address, m, data) {
-	$('#url').html(address);
-	if ((m.resultContentType) && m.resultContentType.indexOf('application/json') > -1) {
-		$.ajax({
-			url : address,
-			type : 'PUT',
-			headers : {
-				'x-debugger' : true
-			},
-			contentType : (m.contentType.indexOf('application/json') > -1) ? m.contentType : false,
-			processData : (m.contentType.indexOf('application/json') > -1) ? true : false,
-			xhrFields : {
-				'withCredentials' : true
-			},
-			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
-		}).always(function(resultJson) {
-			$('#result').html(JSON.stringify(resultJson, null, 4));
-			Describe.writeOut(m.outs, resultJson);
-		});
-	} else {
-		$.ajax({
-			url : address,
-			type : 'PUT',
-			headers : {
-				'x-debugger' : true
-			},
-			contentType : (m.contentType.indexOf('application/json') > -1) ? m.contentType : false,
-			processData : (m.contentType.indexOf('application/json') > -1) ? true : false,
-			xhrFields : {
-				'withCredentials' : true
-			},
-			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
-		});
-	}
-}
-Describe.doGet = function(address, m) {
-	$('#url').html(address);
-	if ((m.resultContentType) && m.resultContentType.indexOf('application/json') > -1) {
-		$.ajax({
-			type : 'GET',
-			dataType : 'json',
-			url : address,
-			headers : {
-				'x-debugger' : true
-			},
-			contentType : m.contentType,
-			xhrFields : {
-				'withCredentials' : true
-			},
-			crossDomain : true
-		}).always(function(resultJson) {
-			$('#result').html(JSON.stringify(resultJson, null, 4));
-			Describe.writeOut(m.outs, resultJson);
-		});
-	} else {
-		window.open(address, '_blank');
-	}
-}
-Describe.doDelete = function(address, m) {
-	$('#url').html(address);
-	if ((m.resultContentType) && m.resultContentType.indexOf('application/json') > -1) {
-		$.ajax({
-			type : 'DELETE',
-			dataType : 'json',
-			url : address,
-			headers : {
-				'x-debugger' : true
-			},
-			contentType : m.contentType,
-			xhrFields : {
-				'withCredentials' : true
-			},
-			crossDomain : true
-		}).always(function(resultJson) {
-			$('#result').html(JSON.stringify(resultJson, null, 4));
-			Describe.writeOut(m.outs, resultJson);
-		});
-	} else {
-		$.ajax({
-			type : 'DELETE',
-			dataType : 'json',
-			url : address,
-			headers : {
-				'x-debugger' : true
-			},
-			contentType : m.contentType,
-			xhrFields : {
-				'withCredentials' : true
-			},
-			crossDomain : true
-		});
-	}
-}
-Describe.writeOut = function(outs, json) {
-	if (outs && (outs.length) && json && json.data) {
-		$.each(Object.keys(json.data), function(i, k) {
-			$('#out_' + k + '_out', '#outs').html(json.data[k]);
-		});
-	}
-}
-
-Describe.createSampleMootools = function(m) {
-	debugger;
-	var address = window.location.href;
-	address = address.substring(0,address.indexOf("/jest/"));
-	var address = address +"/"+ m.path;
-	if (m.pathParameters && m.pathParameters.length > 0) {
-		$.each(m.pathParameters, function(pi, p) {
-			address = address.replace('{' + p.name + '}', '替换参数'+pi);
-		});
-	}
-	if (m.queryParameters && m.queryParameters.length > 0) {
-		$.each(m.queryParameters, function(pi, p) {
-			var query = p.name + '=' + '替换参数'+pi;
-			if (address.indexOf("?") > 0) {
-				address += '&' + query;
-			} else {
-				address += '?' + query;
-			}
-		});
-	}
-	
-	var strSample="";
-	if (m.contentType.indexOf('application/json') > -1) {
-		        strSample =  "var data = {};" + "\n";
-			if (m.ins && m.ins.length > 0) {
-				$.each(m.ins, function(ii, i) {
-							switch (i.type) {
-						default:
-							if (i.isBaseType) {
-								if (i.isCollection) {
-									  strSample += '       data["'+i.name+'"] = ["参数1"];' + "\n";
-								} else {
-									  strSample += '       data["'+i.name+'"] = "参数";' + "\n";
-								}
-							} else {
-									if(i.isCollection){
-										if(i.fieldValue){
-										  if(i.fieldType =='enum'){
-											   strSample += '       data["'+i.name+'"] = ["'+ i.fieldValue +'"];'+"\n";	
-										  }else{
-											   strSample += '       data["'+i.name+'"] = ['+ i.fieldValue +'];'+"\n";	
-										  }
-										  
-										}else{
-										  strSample += '       data["'+i.name+'"] = [{"参数1":"value1","参数2":"value2"}];'+"\n";
-										}
-									}else{
-										  if(i.fieldType =='enum'){
-												   strSample += '       data["'+i.name+'"] = "'+ i.fieldValue +'";'+"\n";	
-											  }else{
-												  
-													strSample += '       data["'+i.name+'"] = {"参数1":"value1","参数2":"value2"};'+"\n";
-											  }
-									}
-							}
-						}
-				});
-			} else if (m.useJsonElementParameter) {
-				strSample += 'data = {"参数1":"value1","参数2":"value2"};' +"\n";
-			} else if (m.useStringParameter) {
-				strSample += 'data = "参数";'+"\n";
-			}
-
-			strSample += " \n var mootoolsRequest = new Request({" + "\n";
-		    strSample += "        url:'"+address + "',\n";
-			strSample += "        method:'"+ m.type + "',\n";
-			strSample += "        dataType:'json',\n";
-		    strSample += "        headers : {'Content-Type':'application/json;charset=utf8','x-token':'实际的x-token'}" + ",\n";
-			if((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter)){
-				strSample += "        data:JSON.stringify(data),\n";
-			}else{
-			  	strSample += "        data:data,\n";
-			}
-            strSample += "        onRequest: function(){ },"+ "\n";
-            strSample += "        onSuccess: function(responseText){},"+ "\n";
-            strSample += "        onFailure: function(){}"+ "\n";
-           strSample +="}).send();"+ "\n";
-	} else {
-		/*
-			strSample = "var formData = new FormData();" + "\n";
-			if (m.formParameters && m.formParameters.length > 0) {
-				$.each(m.formParameters, function(pi, p) {
-					if (p.type == "File") {
-							//formData.append(p.name, $('input[type=file]', '#formParameters')[0].files[0]);
-					strSample += 'formData.append("'+p.name+'", $("input[type=file]")[0].files[0]);' +  "\n";
-					} else {
-					strSample += 'formData.append("'+p.name+'", "参数'+pi+'");' +  "\n";
-					}
-				});
-			}
-			
-			strSample += "$.ajax({" + "\n";
-			strSample += "type : '"+ m.type + "',\n";
-			strSample += "url : '"+address + "',\n";
-			strSample += "headers : {'x-debugger' : true}" + ",\n";
-			strSample += "contentType : false,\n";
-			strSample += "processData  : false,\n";
-			strSample += "xhrFields : {'withCredentials' : true}" + ",\n";
-			strSample += "crossDomain : true"+ ",\n";
-			strSample += "data : formData"+"\n";
-			strSample += "});";	
-			*/
-	}
-
-	return  strSample;
-   }
-   
-Describe.createSampleJSO2= function(m) {
-	var address = window.location.href;
-	    address = address.substring(0,address.indexOf("/jest/"));
-	var uri = address.substring(address.lastIndexOf("/")+1,address.length);
-	 address =  m.path;
-	 address = address.substring(address.indexOf("jaxrs/")+6,address.length);
-	var parameter = "";
-	if (m.pathParameters && m.pathParameters.length > 0) {
-		$.each(m.pathParameters, function(pi, p) {
-			address = address.replace('{' + p.name + '}', '替换参数'+pi);
-			if(parameter == ""){
-				parameter = "\"" + p.name + "\"" + ":" + '"替换参数'+pi +'"';
-			}else{
-				parameter = parameter +  ",\"" + p.name + "\"" + ":" + '替换参数'+pi +'"';
-			}
-		});
-	}
-	if (m.queryParameters && m.queryParameters.length > 0) {
-		$.each(m.queryParameters, function(pi, p) {
-			var query = p.name + '=' + '替换参数'+pi;
-			if (address.indexOf("?") > 0) {
-				address += '&' + query;
-			} else {
-				address += '?' + query;
-			}
-		});
-	}
-	
-	var strSample="";
-	if (m.contentType.indexOf('application/json') > -1) {
-		  strSample =  "var data = {};" + "\n";
-			if (m.ins && m.ins.length > 0) {
-				$.each(m.ins, function(ii, i) {
-					switch (i.type) {
-						default:
-							if (i.isBaseType) {
-								if (i.isCollection) {
-									  strSample += '       data["'+i.name+'"] = ["参数1"];' + "\n";
-								} else {
-									  strSample += '       data["'+i.name+'"] = "参数";' + "\n";
-								}
-							} else {
-									if(i.isCollection){
-										if(i.fieldValue){
-										  if(i.fieldType =='enum'){
-											   strSample += '       data["'+i.name+'"] = ["'+ i.fieldValue +'"];'+"\n";	
-										  }else{
-											   strSample += '       data["'+i.name+'"] = ['+ i.fieldValue +'];'+"\n";	
-										  }
-										  
-										}else{
-										  strSample += '       data["'+i.name+'"] = [{"参数1":"value1","参数2":"value2"}];'+"\n";
-										}
-									}else{
-										if(i.fieldType =='enum'){
-										  strSample += '       data["'+i.name+'"] = "'+ i.fieldValue + '";' + "\n";
-										}else{
-										  strSample += '       data["'+i.name+'"] = {"参数1":"value1","参数2":"value2"};'+"\n";
-										}
-									}
-							}
-						}
-				});
-			} else if (m.useJsonElementParameter) {
-				strSample += 'data = {"参数1":"value1","参数2":"value2"};' +"\n";
-			} else if (m.useStringParameter) {
-				strSample += 'data = "参数";'+"\n";
-			}
-			 var functionName = "do";
-			 strSample += "\n var root = \"" + uri + "\";" + "\n";
-			 strSample += " var options = { " + "\n";
-			 strSample += "                 " + functionName + ":{ //服务命名1,自定义"+ "\n";
-			 strSample += "                           \"uri\": \"/" + m.path + "\","+ "\n";;
-             strSample += "                           \"method\": \""+m.type+"\""+ "\n";
-			 strSample += "                      }"+ "\n";
-			 strSample += "     }" + "\n";
-			 strSample += "var action = new this.Action( root, options);" + "\n\n";
-			 strSample += "action.invoke({" + "\n";
-			 strSample += "        \"name\": \"" + functionName+ "\", //自定义的服务名" + "\n"; 
-			 strSample += "        \"parameter\": {" + parameter+ "},  //uri参数 " + "\n"; 
-             strSample += "        \"data\": data, //请求的正文, JsonObject " +  "\n"; 
-             strSample += "        \"success\": function(json){ //服务调用成功时的回调方法,json 是服务返回的数据" +  "\n"; 
-             strSample += "        //这里进行具体的处理"+ "\n"; 
-             strSample += "        }.bind(this),"+ "\n"; 
-             strSample += "        \"failure\" : function(xhr){ //服务调用失败时的回调方法,xhr 为 XMLHttpRequest 对象" +  "\n";
-             strSample += "        //这里进行具体的处理"+ "\n"; 
-             strSample += "     },"+ "\n"; 
-             strSample += "        \"async\" : true, //同步还是异步,默认为true" + "\n"; 
-             strSample += "        \"withCredentials\" : true, //是否允许跨域请求,默认为true" + "\n"; 
-             strSample += "        \"urlEncode\" : true //uri参数是否需要通过encodeURIComponent函数编码,默认为true" + "\n";
-             strSample += "});"			
-	} else {
-		
-	}
-	return  strSample;
-  }   
-   
-   
-   
-Describe.createSampleO2= function(m) {
-	var address = window.location.href;
-	    address = address.substring(0,address.indexOf("/jest/"));
-	var uri = address.substring(address.lastIndexOf("/")+1,address.length);
-	 address =  m.path;
-	 address = address.substring(address.indexOf("jaxrs/")+6,address.length);
-	if (m.pathParameters && m.pathParameters.length > 0) {
-		$.each(m.pathParameters, function(pi, p) {
-			address = address.replace('{' + p.name + '}', '替换参数'+pi);
-		});
-	}
-	if (m.queryParameters && m.queryParameters.length > 0) {
-		$.each(m.queryParameters, function(pi, p) {
-			var query = p.name + '=' + '替换参数'+pi;
-			if (address.indexOf("?") > 0) {
-				address += '&' + query;
-			} else {
-				address += '?' + query;
-			}
-		});
-	}
-	
-	var strSample="";
-	if (m.contentType.indexOf('application/json') > -1) {
-		  strSample =  "var data = {};" + "\n";
-			if (m.ins && m.ins.length > 0) {
-				$.each(m.ins, function(ii, i) {
-						switch (i.type) {
-						default:
-							if (i.isBaseType) {
-								if (i.isCollection) {
-									  strSample += '       data["'+i.name+'"] = ["参数1"];' + "\n";
-								} else {
-									  strSample += '       data["'+i.name+'"] = "参数";' + "\n";
-								}
-							} else {
-									if(i.isCollection){
-										if(i.fieldValue){
-										  if(i.fieldType =='enum'){
-											   strSample += '       data["'+i.name+'"] = ["'+ i.fieldValue +'"];'+"\n";	
-										  }else{
-											   strSample += '       data["'+i.name+'"] = ['+ i.fieldValue +'];'+"\n";	
-										  }
-										  
-										}else{
-										  strSample += '       data["'+i.name+'"] = [{"参数1":"value1","参数2":"value2"}];'+"\n";
-										}
-									}else{
-										if(i.fieldType =='enum'){
-											 
-											strSample += '       data["'+i.name+'"] = "'+i.fieldValue+'"\n';
-										}else{
-											strSample += '       data["'+i.name+'"] = {"参数1":"value1","参数2":"value2"};'+"\n";
-										}
-									
-									}
-							}
-						}
-				});
-			} else if (m.useJsonElementParameter) {
-				strSample += 'data = {"参数1":"value1","参数2":"value2"};' +"\n";
-			} else if (m.useStringParameter) {
-				strSample += 'data = "参数";'+"\n";
-			}
-			
-			
-			if(m.type=="POST"){
-			   strSample += " \n var string = JSON.stringify(data);" + "\n";
-               strSample += " var applications = this.Action.applications;"+ "\n";
-               strSample += " var serviceRoot = \"" + uri + "\";"+ "\n";
-               strSample += " var path = \"" + address + "\";"+ "\n"; ;
-               strSample += " var resp = applications.postQuery( serviceRoot, path , string);"+ "\n";
-			}
-			if(m.type=="GET"){
-               strSample += " \n var applications = this.Action.applications;"+ "\n";
-               strSample += " var serviceRoot = \"" + uri + "\";"+ "\n";
-                strSample += " var path = \"" + address + "\";"+ "\n"; ;
-               strSample += " var resp = applications.getQuery( serviceRoot, path );"+ "\n";
-			}
-			if(m.type=="PUT"){
-			   strSample += " \n var string = JSON.stringify(data)"+ "\n";
-               strSample += " var applications = this.Action.applications"+ "\n";
-               strSample += " var serviceRoot = \"" + uri + "\";"+ "\n";
-               strSample += " var path = \"" + address+ "\";"+ "\n"; ;
-               strSample += " var resp = applications.putQuery( serviceRoot, path , string);"+ "\n";
-			}
-			if(m.type=="DELETE"){
-			   strSample += " \n var applications = this.Action.applications;"+ "\n";
-               strSample += " var serviceRoot = \" "+ uri + "\";"+ "\n";
-                 strSample += " var path = \"" + address + "\";"+ "\n"; ;
-               strSample += " var resp = applications.deleteQuery( serviceRoot, path);"+ "\n";
-			}
-			
-               strSample += " var json = JSON.parse( resp.toString() );"+ "\n";
-			
-	} else {
-		
-	}
-	return  strSample;
-  }
-Describe.createSample= function(m) {
-	var address = window.location.href;
-	address = address.substring(0,address.indexOf("/jest/"));
-	var address = address +"/"+ m.path;
-	if (m.pathParameters && m.pathParameters.length > 0) {
-		$.each(m.pathParameters, function(pi, p) {
-			address = address.replace('{' + p.name + '}', '替换参数'+pi);
-		});
-	}
-	if (m.queryParameters && m.queryParameters.length > 0) {
-		$.each(m.queryParameters, function(pi, p) {
-			var query = p.name + '=' + '替换参数'+pi;
-			if (address.indexOf("?") > 0) {
-				address += '&' + query;
-			} else {
-				address += '?' + query;
-			}
-		});
-	}
-	
-	var strSample="";
-	if (m.contentType.indexOf('application/json') > -1) {
-			if (m.ins && m.ins.length > 0) {
-				strSample =  "var data = {};" + "\n";
-				$.each(m.ins, function(ii, i) {
-						switch (i.type) {
-						default:
-							if (i.isBaseType) {
-								if (i.isCollection) {
-									  strSample += '       data["'+i.name+'"] = ["参数1"];' + "\n";
-								} else {
-									  strSample += '       data["'+i.name+'"] = "参数";' + "\n";
-								}
-							} else {
-									if(i.isCollection){
-										if(i.fieldValue){
-										  if(i.fieldType =='enum'){
-											   strSample += '       data["'+i.name+'"] = ["'+ i.fieldValue +'"];'+"\n";	
-										  }else{
-											   strSample += '       data["'+i.name+'"] = ['+ i.fieldValue +'];'+"\n";	
-										  }
-										  
-										}else{
-										  strSample += '       data["'+i.name+'"] = [{"参数1":"value1","参数2":"value2"}];'+"\n";
-										}
-									}else{
-										if(i.fieldType =='enum'){
-											 
-											strSample += '       data["'+i.name+'"] = "'+i.fieldValue+'"\n';
-										}else{
-											strSample += '       data["'+i.name+'"] = {"参数1":"value1","参数2":"value2"};'+"\n";
-										}
-										
-										
-									}
-							}
-						}
-				});
-			} else if (m.useJsonElementParameter) {
-				strSample += '    data = {"参数1":"value1","参数2":"value2"};' +"\n";
-			} else if (m.useStringParameter) {
-				strSample += '    data = "参数";'+"\n";
-			}
-			
-			strSample += "\n$.ajax({" + "\n";
-			strSample += "        type : '"+ m.type + "',\n";
-			strSample += "        dataType : 'json'" + ",\n";
-			strSample += "        url : '"+address + "',\n";
-			strSample += "        headers : {'x-debugger' : true}" + ",\n";
-			strSample += "        contentType : '"+m.contentType+ "',\n";
-			strSample += "        xhrFields : {'withCredentials' : true}" + ",\n";
-			strSample += "        crossDomain : true"+ ",\n";
-			
-		   if((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter)){
-			 strSample += "       data : JSON.stringify(data),\n";
-			}else{
-			  strSample += "      data : data"+"\n";
-			}
-			
-			strSample += "}).always(function(resultJson) {"+"\n";
-			strSample += "        alert(JSON.stringify(resultJson, null, 4))" +"\n";
-			strSample += "});";
-			
-	} else {
-			strSample = "var formData = new FormData();" + "\n";
-			if (m.formParameters && m.formParameters.length > 0) {
-				$.each(m.formParameters, function(pi, p) {
-					if (p.type == "File") {
-							//formData.append(p.name, $('input[type=file]', '#formParameters')[0].files[0]);
-					strSample += 'formData.append("'+p.name+'", $("input[type=file]")[0].files[0]);' +  "\n";
-					} else {
-					strSample += 'formData.append("'+p.name+'", "参数'+pi+'");' +  "\n";
-					}
-				});
-			}
-			strSample += "$.ajax({" + "\n";
-			strSample += "        type : '"+ m.type + "',\n";
-			strSample += "        url : '"+address + "',\n";
-			strSample += "        headers : {'x-debugger' : true}" + ",\n";
-			//strSample += "        contentType : false,\n";
-			strSample += "        contentType : '"+m.contentType+ "',\n";
-			strSample += "        processData  : false,\n";
-			strSample += "        xhrFields : {'withCredentials' : true}" + ",\n";
-			strSample += "        crossDomain : true"+ ",\n";
-			strSample += "        data : formData"+"\n";
-			strSample += "});";	
-	}
-
-	return  strSample;
-   }
-Describe.createSampleCommon= function(m,className) {
-	 debugger;
-	var address = window.location.href;
-		address = address.substring(0,address.indexOf("/jest/"));
-	var root = address.substring(address.lastIndexOf("/")+1,address.length);
-
-	var parameter = "";
-	if (m.pathParameters && m.pathParameters.length > 0) {
-			$.each(m.pathParameters, function(pi, p) {
-				if(parameter == ""){
-					parameter =  p.name ;
-				}else{
-					parameter = parameter +  "," + p.name;
-				}
-			});
-		}
-	var query = "";
-		if (m.queryParameters && m.queryParameters.length > 0) {
-			$.each(m.queryParameters, function(pi, p) {
-				if (query == "") {
-					 query = "&" + p.name + '=' + '替换参数'+pi;
-				} else {
-					 query = query + "&"+ p.name + '=' + '替换参数'+pi;
-				}
-			});
-		}
-	var strSample="";
-	var body = "";
-	if (m.contentType.indexOf('application/json') > -1) {
-				if (m.ins && m.ins.length > 0) {
-					 body =  "var data = {};" + "\n";
-					$.each(m.ins, function(ii, i) {
-						switch (i.type) {
-						default:
-							if (i.isBaseType) {
-								if (i.isCollection) {
-									  body += '       data["'+i.name+'"] = ["参数1"];' + "\n";
-								} else {
-									  body += '       data["'+i.name+'"] = "参数";' + "\n";
-								}
-							} else {
-									if(i.isCollection){
-										if(i.fieldValue){
-										  if(i.fieldType =='enum'){
-											   body += '       data["'+i.name+'"] = ["'+ i.fieldValue +'"];'+"\n";	
-											   body +=(i.fieldSample ? "  "+'<span style="color:red">//注解:'+i.fieldSample +'</span>\n':"");
-										  }else{
-											   body += '       data["'+i.name+'"] = ['+ i.fieldValue +'];'+"\n";	
-											   body +=(i.fieldSample ? "  "+'<span style="color:red">//注解:'+i.fieldSample +'</span>\n':"");
-										  }
-										  
-										}else{
-										  body += '       data["'+i.name+'"] = [{"参数1":"value1","参数2":"value2"}];'+"\n";
-										}
-									}else{
-										 if(i.fieldType =='enum'){
-											 body += '       data["'+i.name+'"] = "'+ i.fieldValue +'";'+"\n";	
-											 body +=(i.fieldSample ? "  "+'<span style="color:red">//注解:'+i.fieldSample +'</span>\n':"");
-								
-										 }else{
-										   body += '       data["'+i.name+'"] = {"参数1":"value1","参数2":"value2"};'+"\n";
-										 }
-									}
-							}
-						}
-					});
-				} else if (m.useJsonElementParameter) {
-					body += '       data = {"参数1":"value1","参数2":"value2"};' +"\n";
-				} else if (m.useStringParameter) {
-					body += '       data = "参数";'+"\n";
-				}
-	 if(m.type != "GET" ){
-		 if( body != ""){
-	        strSample += body;	
-		 }	   
-	 }			
-	 strSample += "var action = this.Actions.load(\"" + root + "\");\n";
-	 strSample += "       action."+ className + "."+m.name+ "(//平台封装好的方法\n";
-	 if(parameter!=""){
-	   strSample += "      " + parameter  +",//uri的参数\n";
-	 }
-	 if(m.type != "GET" ){
-		 if( body != ""){
-	        strSample += "      data,//body请求参数\n";	
-		 }	   
-	 }
-	 strSample += "      function( json ){ //服务调用成功的回调函数, json为服务传回的数据\n";
-	 strSample += "         data = json.data; //为变量data赋值\n";
-	 strSample += "      }.bind(this),\n";
-	 strSample +=  "     function( json ){ //服务调用失败的回调函数, json为服务传回的数据\n";
-	 strSample +=  "        data = json.data; //为变量data赋值\n";
-	 strSample +=  "     }.bind(this),\n";
-	 strSample += "      false //同步执行 \n";
-	 strSample += "    );\n";
-				
-	}else{
-			var formData = "var formData = new FormData();" + "\n";
-			if (m.formParameters && m.formParameters.length > 0) {
-				$.each(m.formParameters, function(pi, p) {
-					if (p.type == "File") {
-					formData += '      formData.append("'+p.name+'", $("input[type=file]")[0].files[0]);' +  "\n";
-					} else {
-					formData += '      formData.append("'+p.name+'", "参数值'+pi+'");' +  "\n";
-					}
-				});
-			}
-		 strSample += formData;
-		 strSample += "var action = this.Actions.load(\"" + root + "\");\n";
-		 //strSample += "action."+m.name+ "(//平台封装好的方法\n";
-		 strSample += "       action."+ className + "."+m.name+ "(//平台封装好的方法\n";
-		 strSample += "      "+parameter  +",//uri的参数\n";
-		 strSample +=  "      formData"+",//from参数\n";
-		 strSample +=  "function( json ){ //服务调用成功的回调函数, json为服务传回的数据\n";
-		 strSample +=  "      data = json.data; //为变量data赋值\n";
-		 strSample +=  "}.bind(this),\n";
-		 strSample +=  "function( json ){ //服务调用失败的回调函数, json为服务传回的数据\n";
-		 strSample +=  "      data = json.data; //为变量data赋值\n";
-		 strSample +=  "}.bind(this),\n";
-		 strSample +=  "false //同步执行 \n";
-		 strSample += ");\n"
-		} 
-   return  strSample ;		
-   }
-   
-Describe.prototype = {
-	"load" : function() {
-		var str = '<ul>';
-		$.getJSON('../describe/describe.json?rd=' + Math.random(), function(json) {
-			Describe.json = json;
-			$.each(json.jaxrs, function(ji, j) {
-				str += '<li xtype="menu" ' + 'style="margin-top: 30px;font-size:14px;font-weight:bold;"title="' +'" >' + j.name + ' <span style="font-style:italic">(' + j.description+ ')</span>';
-				$.each(j.methods, function(mi, m) {
-					str += '<ul><li xtype="li"  style="margin-top: 10px;margin-left:-24px;font-size:12px; font-weight:normal;line-height:18px" ><a  title="' + m.path + '"id ="' + j.name + '_' + m.name + '" href="#"><b>' + m.name+'</b><br/><span style="color: #666666;">-'+ m.description + '</span>' + '</a></li></ul>';
-				});
-				str += '</li>'
-			});
-			str += '</ul>';
-			$("#menu").html(str);
-			$.each(json.jaxrs, function(ji, j) {
-				$.each(j.methods, function(mi, m) {
-					$('#' + j.name + '_' + m.name).click(
-							function() {
-								$('#result').html('');
-								var sample = "";
-								var txt = '<fieldset id="method"><legend>Method</legend>';
-								txt += '<table>';
-								txt += '<tr><td style="width:100px;">name:</td><td><a href="../describe/sources/' + m.className.replace(/\./g, '/') + '.java">' + m.name + '</a></td></tr>';
-								txt += '<tr><td>path:</td><td>' + m.path + '</td></tr>';
-								txt += '<tr><td>type:</td><td>' + m.type + '</td></tr>';
-								txt += '<tr><td>description:</td><td>' + m.description + '</td></tr>';
-								txt += '</table>';
-								txt += '<button id="' + m.name + "_" + m.type + '">' + m.type + '</button>';
-								txt += '<div id="url">&nbsp;</div>';
-								txt += '</fieldset>';
-								if (m.pathParameters && m.pathParameters.length > 0) {
-									txt += '<fieldset id="pathParameters"><legend>Path Parameter</legend>';
-									txt += '<table >';
-									$.each(m.pathParameters, function(pi, p) {
-										if (m.name == 'listNext' || m.name == 'listPrev') {
-											switch (p.name) {
-											case 'flag':
-											case 'id':
-												txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid" value="(0)"/></td><td>' + p.name
-														+ ':' + p.description + '</td></tr>';
-												break;
-											case 'count':
-												txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid" value="20"/></td><td>' + p.name + ':'
-														+ p.description + '</td></tr>';
-												break;
-											default:
-												txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':'
-														+ p.description + '</td></tr>';
-												break
-											}
-										} else {
-											txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':'
-													+ p.description + '</td></tr>';
-										}
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.formParameters && m.formParameters.length > 0) {
-									txt += '<fieldset id="formParameters"><legend>Form Parameter</legend>';
-									txt += '<table >';
-									$.each(m.formParameters, function(pi, p) {
-										if (p.type == "File") {
-											txt += '<tr><td><input type="file" name="' + p.name + '" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>'
-													+ p.name + ':' + p.description + '</td></tr>';
-										} else {
-											txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':'
-													+ p.description + '</td></tr>';
-										}
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.queryParameters && m.queryParameters.length > 0) {
-									txt += '<fieldset id="queryParameters"><legend>Query Parameter</legend>';
-									txt += '<table >';
-									$.each(m.queryParameters, function(pi, p) {
-										txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':' + p.description
-												+ '</td></tr>';
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-							  if (m.ins && m.ins.length > 0) {
-									txt += '<fieldset id="ins"><legend>In</legend>';
-									txt += '<table>';
-									$.each(m.ins, function(ii, i) {
-										if (i.isCollection) {
-											
-											txt += '<tr><td><textarea id="' + i.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + i.name + ':' + i.description +(i.fieldValue ? "  "+'。数据格式:<span style="color:red">'+i.fieldValue +'</span>':"") + (i.fieldSample ? "  "+'<span style="color:red">'+i.fieldSample +'</span>':"") 
-											+'</td></tr>';
-										} else {
-											txt += '<tr><td><input type="text" id="' + i.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + i.name + ':'
-											
-													+ i.description+ (i.fieldValue ? "  "+'。数据格式:<span style="color:red">'+i.fieldValue +'</span>':"") + (i.fieldSample ? "  "+'<span style="color:red">'+i.fieldSample +'</span>':"") 
-													+'</td></tr>';
-						
-										}
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								
-								
-								if (m.useJsonElementParameter) {
-									txt += '<fieldset><legend>JsonElement</legend>';
-									txt += '<table><tr><td>';
-									txt += '<textarea id="jsonElement" style="height:300px; width:600px; padding:1px; border:1px #000000 solid"/>';
-									txt += '</td><td>json</td></tr>';
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.useStringParameter) {
-									txt += '<fieldset><legend>String</legend>';
-									txt += '<table><tr><td>';
-									txt += '<textarea id="string" style="height:300px; width:600px; padding:1px; border:1px #000000 solid"/>';
-									txt += '</td><td>string</td></tr>';
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.outs && m.outs.length > 0) {
-									txt += '<fieldset id="outs"><legend>Out</legend>';
-									txt += '<table>';
-									$.each(m.outs, function(oi, o) {
-										txt += '<tr><td style="width: 160px;">' + o.name + '</td><td style="width: 90px;">' + o.type + '</td><td style="width: 90px;">' + (o.isCollection ? 'multi' : 'single') + '</td><td style="width: 90px;">' + o.description + '</td><td id="out_'
-												+ o.name + '_out">&nbsp;</td></tr>';
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								$('#content').html(txt);
-								
-								$('#' + m.name + '_' + m.type, '#method').click(function() {
-									var address = '../' + m.path;
-									if (m.pathParameters && m.pathParameters.length > 0) {
-										$.each(m.pathParameters, function(pi, p) {
-											address = address.replace('{' + p.name + '}', encodeURIComponent($('#' + p.name, '#pathParameters').val()));
-										});
-									}
-									if (m.queryParameters && m.queryParameters.length > 0) {
-										$.each(m.queryParameters, function(pi, p) {
-											var query = p.name + '=' + encodeURIComponent($('#' + p.name, '#queryParameters').val());
-											if (address.indexOf("?") > 0) {
-												address += '&' + query;
-											} else {
-												address += '?' + query;
-											}
-										});
-									}
-									if (m.contentType.indexOf('application/json') > -1) {
-										switch (m.type) {
-										case 'POST':
-											var data = {};
-											if (m.ins && m.ins.length > 0) {
-												$.each(m.ins, function(ii, i) {
-													switch (i.type) {
-													default:
-														if (i.isBaseType) {
-															if (i.isCollection) {
-																data[i.name] = Describe.splitValue($('#' + i.name, '#ins').val());
-															} else {
-																data[i.name] = $('#' + i.name, '#ins').val();
-															}
-														} else {
-															if($('#' + i.name, '#ins').val() == ""){
-																/*
-																if(i.isCollection){
-																	data[i.name] = [{}];
-																}else{
-																	data[i.name] = {};
-																}*/
-															}else{
-																if(i.fieldType){
-																	if(i.fieldType == "enum"){
-																	   data[i.name] = $('#' + i.name, '#ins').val();
-																	}else{
-																		data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-																	}
-																}else{
-																    if (i.isCollection) {
-																       data[i.name] = Describe.splitValue($('#' + i.name, '#ins').val());
-															        } else {
-																       data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-															        }
-																}
-															}
-														}
-													}
-												});
-											} else if (m.useJsonElementParameter) {
-												data = $.parseJSON($('#jsonElement').val());
-											} else if (m.useStringParameter) {
-												data = $('#string').val();
-											}
-											Describe.doPost(address, m, data);
-											break;
-										case 'PUT':
-											var data = {};
-											if (m.ins && m.ins.length > 0) {
-												$.each(m.ins, function(ii, i) {
-													switch (i.type) {
-													default:
-														if (i.isBaseType) {
-															if (i.isCollection) {
-																data[i.name] = Describe.splitValue($('#' + i.name, '#ins').val());
-															} else {
-																data[i.name] = $('#' + i.name, '#ins').val();
-															}
-														} else {
-															if($('#' + i.name, '#ins').val() == ""){
-																/*
-																if(i.isCollection){
-																	data[i.name] = [{}];
-																}else{
-																	data[i.name] = {};
-																}*/
-															}else{
-															   if(i.fieldType){
-																	if(i.fieldType == "enum"){
-																	   data[i.name] = $('#' + i.name, '#ins').val();
-																	}else{
-																		data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-																	}
-																}else{
-																   if (i.isCollection) {
-																      data[i.name] = Describe.splitValue($('#' + i.name, '#ins').val());
-															       } else {
-																         if (i.isCollection) {
-																			   data[i.name] = Describe.splitValue($('#' + i.name, '#ins').val());
-																		} else {
-																			   data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-																		}
-															       }
-																}
-															}
-														
-														}
-													}
-												});
-											} else if (m.useJsonElementParameter) {
-												data = $.parseJSON($('#jsonElement').val());
-											} else if (m.useStringParameter) {
-												data = $('#string').val();
-											}
-											Describe.doPut(address, m, data);
-											break;
-										case 'GET':
-											Describe.doGet(address, m);
-											break;
-										case 'DELETE':
-											Describe.doDelete(address, m);
-											break;
-										default:
-											break;
-										}
-										
-									} else {
-										switch (m.type) {
-										case 'POST':
-											var formData = new FormData();
-											if (m.formParameters && m.formParameters.length > 0) {
-												$.each(m.formParameters, function(pi, p) {
-													if (p.type == "File") {
-														formData.append(p.name, $('input[type=file]', '#formParameters')[0].files[0]);
-													} else {
-														formData.append(p.name, $('#' + p.name, '#formParameters').val());
-													}
-												});
-											}
-											Describe.doPost(address, m, formData);
-											break;
-										case 'PUT':
-											var formData = new FormData();
-											if (m.formParameters && m.formParameters.length > 0) {
-												$.each(m.formParameters, function(pi, p) {
-													if (p.type == "File") {
-														formData.append(p.name, $('input[type=file]', '#formParameters')[0].files[0]);
-													} else {
-														formData.append(p.name, $('#' + p.name, '#formParameters').val());
-													}
-												});
-											}
-											Describe.doPut(address, m, formData);
-											break;
-										case 'GET':
-											Describe.doGet(address, m);
-											break;
-										case 'DELETE':
-											Describe.doDelete(address, m);
-											break;
-										default:
-											break;
-										}
-									}
-								})
-								
-								debugger;
-								$('#Sample').html("<div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;color: #1E7ACE;\">\n平台推荐脚本样例</span>\n\n"+ Describe.createSampleCommon(m,j.name)+ "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\n后台脚本样例</span>\n\n" + Describe.createSampleO2(m) + "</div><div  style=\"line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\njquery样例</span>\n\n<span style=\"\">"+ Describe.createSample(m)+"</span></div>");
-							});
-				});
-			});
-		 
-		  $("[xtype='menu']").click(
-				  function(event) {
-					    if(event.stopPropagation){
-						    event.stopPropagation();
-						  }else{
-						     event.cancelBubble = true;
-						  }
-						$(this).children().each(function(i){
-							debugger;
-							if(this.tagName != "SPAN"){
-							$(this).toggle();
-							}
-						});
-					    //$(this).children().toggle();
-					});
-		  $("[xtype='li']").click( function(event) {
-			    if(event.stopPropagation){
-				    event.stopPropagation();
-				  }else{
-				     event.cancelBubble = true;
-				  }
-			})
-			$("[xtype='menu']").each(function(i){ 
-			if(i!=0){
-			  // $(this).children().toggle();
-			  $(this).children().each(function(i){
-					
-							if(this.tagName != "SPAN"){
-							$(this).toggle();
-							}
-						});
-			  }
-			}
-			);
-		});
-	},
-  "search":function(strKey) {
-	var str = '<ul>';
-	var strTemp = "";
-	    $.each(Describe.json.jaxrs, function(ji, j) {
-			    var flag = false;
-				strTemp = '<li xtype="menu" ' + 'style="margin-top: 30px;font-size:14px;font-weight:bold;"title="' +'" >' + j.name + ' <span style="font-style:italic">(' + j.description+ ')</span>';
-				$.each(j.methods, function(mi, m) {
-					if((m.name.toUpperCase().indexOf(strKey.toUpperCase())>-1) || (m.description.toUpperCase().indexOf(strKey.toUpperCase())>-1) || (m.path.toUpperCase().indexOf(strKey.toUpperCase())>-1)){
-					flag = true;
-					
-					var tempKey =  strKey;
-					var tempReplace = "<span style='color: #f31313'>"+ strKey + "</span>";
-					 debugger;
-					var strDescripthion = m.description.replace(tempKey, tempReplace);
-					var strName = m.name.replace(tempKey, tempReplace);
-					var strPath = m.path;
-					var startPost = m.name.toUpperCase().indexOf(strKey.toUpperCase());
-					if(startPost>-1){
-						tempReplace = m.name.substr(startPost,tempKey.length);
-						tempKey = tempReplace;
-						tempReplace = "<span style='color: #f31313'>"+ tempReplace + "</span>";
-						strName = m.name.replace(tempKey, tempReplace);
-					}
-					tempKey =  strKey;
-					startPost = m.description.toUpperCase().indexOf(strKey.toUpperCase());
-					if(startPost>-1){
-						tempReplace = m.description.substr(startPost,tempKey.length);
-						tempKey =  tempReplace;
-						tempReplace = "<span style='color: #f31313'>"+ tempReplace + "</span>";
-						strDescripthion = m.description.replace(tempKey, tempReplace);
-					}
-					
-					
-					strTemp += '<ul><li xtype="li"  style="margin-top: 10px;margin-left:-24px;font-size:12px; font-weight:normal;line-height:18px" ><a title = "' + strPath+ '"  id ="' + j.name + '_' + m.name + '" href="#"><b>' + strName+'</b><br/><span style="color: #666666;">-'+strDescripthion + '</span>' + '</a></li></ul>';
-					}
-				});
-				strTemp += '</li>';
-				
-				if(flag == true){
-				   str += strTemp;
-				}
-			});
-			str += '</ul>';
-			$("#menu").html(str);
-			this.display(Describe.json);
-  },
-   "display":function(json) {
-			$.each(json.jaxrs, function(ji, j) {
-				$.each(j.methods, function(mi, m) {
-					$('#' + j.name + '_' + m.name).click(
-							function() {
-								$('#result').html('');
-								var sample = "";
-								var txt = '<fieldset id="method"><legend>Method</legend>';
-								txt += '<table>';
-								txt += '<tr><td style="width:100px;">name:</td><td><a href="../describe/sources/' + m.className.replace(/\./g, '/') + '.java">' + m.name + '</a></td></tr>';
-								txt += '<tr><td>path:</td><td>' + m.path + '</td></tr>';
-								txt += '<tr><td>type:</td><td>' + m.type + '</td></tr>';
-								txt += '<tr><td>description:</td><td>' + m.description + '</td></tr>';
-								txt += '</table>';
-								txt += '<button id="' + m.name + "_" + m.type + '">' + m.type + '</button>';
-								txt += '<div id="url">&nbsp;</div>';
-								txt += '</fieldset>';
-								if (m.pathParameters && m.pathParameters.length > 0) {
-									txt += '<fieldset id="pathParameters"><legend>Path Parameter</legend>';
-									txt += '<table >';
-									$.each(m.pathParameters, function(pi, p) {
-										if (m.name == 'listNext' || m.name == 'listPrev') {
-											switch (p.name) {
-											case 'flag':
-											case 'id':
-												txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid" value="(0)"/></td><td>' + p.name
-														+ ':' + p.description + '</td></tr>';
-												break;
-											case 'count':
-												txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid" value="20"/></td><td>' + p.name + ':'
-														+ p.description + '</td></tr>';
-												break;
-											default:
-												txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':'
-														+ p.description + '</td></tr>';
-												break
-											}
-										} else {
-											txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':'
-													+ p.description + '</td></tr>';
-										}
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.formParameters && m.formParameters.length > 0) {
-									txt += '<fieldset id="formParameters"><legend>Form Parameter</legend>';
-									txt += '<table >';
-									$.each(m.formParameters, function(pi, p) {
-										if (p.type == "File") {
-											txt += '<tr><td><input type="file" name="' + p.name + '" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>'
-													+ p.name + ':' + p.description + '</td></tr>';
-										} else {
-											txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':'
-													+ p.description + '</td></tr>';
-										}
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.queryParameters && m.queryParameters.length > 0) {
-									txt += '<fieldset id="queryParameters"><legend>Query Parameter</legend>';
-									txt += '<table >';
-									$.each(m.queryParameters, function(pi, p) {
-										txt += '<tr><td><input type="text" id="' + p.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + p.name + ':' + p.description
-												+ '</td></tr>';
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-							  if (m.ins && m.ins.length > 0) {
-									txt += '<fieldset id="ins"><legend>In</legend>';
-									txt += '<table>';
-									$.each(m.ins, function(ii, i) {
-										if (i.isCollection) {
-											
-											txt += '<tr><td><textarea id="' + i.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + i.name + ':' + i.description +(i.fieldValue ? "  "+'。数据格式:<span style="color:red">'+i.fieldValue +'</span>':"") + (i.fieldSample ? "  "+'<span style="color:red">'+i.fieldSample +'</span>':"") 
-											'</td></tr>';
-										} else {
-											txt += '<tr><td><input type="text" id="' + i.name + '" style="width:600px; padding:1px; border:1px #000000 solid"/></td><td>' + i.name + ':'
-													+ i.description
-											'</td></tr>';
-										}
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								
-								
-								if (m.useJsonElementParameter) {
-									txt += '<fieldset><legend>JsonElement</legend>';
-									txt += '<table><tr><td>';
-									txt += '<textarea id="jsonElement" style="height:300px; width:600px; padding:1px; border:1px #000000 solid"/>';
-									txt += '</td><td>json</td></tr>';
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.useStringParameter) {
-									txt += '<fieldset><legend>String</legend>';
-									txt += '<table><tr><td>';
-									txt += '<textarea id="string" style="height:300px; width:600px; padding:1px; border:1px #000000 solid"/>';
-									txt += '</td><td>string</td></tr>';
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								if (m.outs && m.outs.length > 0) {
-									txt += '<fieldset id="outs"><legend>Out</legend>';
-									txt += '<table>';
-									$.each(m.outs, function(oi, o) {
-										txt += '<tr><td style="width: 160px;">' + o.name + '</td><td style="width: 90px;">' + o.type + '</td><td style="width: 90px;">' + (o.isCollection ? 'multi' : 'single') + '</td><td style="width: 90px;">' + o.description + '</td><td id="out_'
-												+ o.name + '_out">&nbsp;</td></tr>';
-									});
-									txt += '</table>';
-									txt += '</fieldset>';
-								}
-								
-								$('#content').html(txt);
-								
-								$('#' + m.name + '_' + m.type, '#method').click(function() {
-									var address = '../' + m.path;
-									if (m.pathParameters && m.pathParameters.length > 0) {
-										$.each(m.pathParameters, function(pi, p) {
-											address = address.replace('{' + p.name + '}', encodeURIComponent($('#' + p.name, '#pathParameters').val()));
-										});
-									}
-									if (m.queryParameters && m.queryParameters.length > 0) {
-										$.each(m.queryParameters, function(pi, p) {
-											var query = p.name + '=' + encodeURIComponent($('#' + p.name, '#queryParameters').val());
-											if (address.indexOf("?") > 0) {
-												address += '&' + query;
-											} else {
-												address += '?' + query;
-											}
-										});
-									}
-									if (m.contentType.indexOf('application/json') > -1) {
-										switch (m.type) {
-										case 'POST':
-											var data = {};
-											if (m.ins && m.ins.length > 0) {
-												$.each(m.ins, function(ii, i) {
-													switch (i.type) {
-													default:
-														if (i.isBaseType) {
-															if (i.isCollection) {
-																data[i.name] = Describe.splitValue($('#' + i.name, '#ins').val());
-															} else {
-																data[i.name] = $('#' + i.name, '#ins').val();
-															}
-														} else {
-															if($('#' + i.name, '#ins').val() == ""){
-																/*if(i.isCollection){
-																	data[i.name] = [{}];
-																}else{
-																	data[i.name] = {};
-																}*/
-															}else{
-																if(i.fieldType){
-																	if(i.fieldType == "enum"){
-																	   data[i.name] = $('#' + i.name, '#ins').val();
-																	}else{
-																		data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-																	}
-																}else{
-																   data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-																}
-															}
-														}
-													}
-												});
-											} else if (m.useJsonElementParameter) {
-												data = $.parseJSON($('#jsonElement').val());
-											} else if (m.useStringParameter) {
-												data = $('#string').val();
-											}
-											Describe.doPost(address, m, data);
-											break;
-										case 'PUT':
-											var data = {};
-											if (m.ins && m.ins.length > 0) {
-												$.each(m.ins, function(ii, i) {
-													switch (i.type) {
-													default:
-														if (i.isBaseType) {
-															if (i.isCollection) {
-																data[i.name] = Describe.splitValue($('#' + i.name, '#ins').val());
-															} else {
-																data[i.name] = $('#' + i.name, '#ins').val();
-															}
-														} else {
-															if($('#' + i.name, '#ins').val() == ""){
-																/*if(i.isCollection){
-																	data[i.name] = [{}];
-																}else{
-																	data[i.name] = {};
-																}*/
-															}else{
-																if(i.fieldType){
-																	if(i.fieldType == "enum"){
-																	   data[i.name] = $('#' + i.name, '#ins').val();
-																	}else{
-																		data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-																	}
-																}else{
-																   data[i.name] = $.parseJSON($('#' + i.name, '#ins').val());
-																}
-															}
-														
-														}
-													}
-												});
-											} else if (m.useJsonElementParameter) {
-												data = $.parseJSON($('#jsonElement').val());
-											} else if (m.useStringParameter) {
-												data = $('#string').val();
-											}
-											Describe.doPut(address, m, data);
-											break;
-										case 'GET':
-											Describe.doGet(address, m);
-											break;
-										case 'DELETE':
-											Describe.doDelete(address, m);
-											break;
-										default:
-											break;
-										}
-										
-									} else {
-										switch (m.type) {
-										case 'POST':
-											var formData = new FormData();
-											if (m.formParameters && m.formParameters.length > 0) {
-												$.each(m.formParameters, function(pi, p) {
-													if (p.type == "File") {
-														formData.append(p.name, $('input[type=file]', '#formParameters')[0].files[0]);
-													} else {
-														formData.append(p.name, $('#' + p.name, '#formParameters').val());
-													}
-												});
-											}
-											Describe.doPost(address, m, formData);
-											break;
-										case 'PUT':
-											var formData = new FormData();
-											if (m.formParameters && m.formParameters.length > 0) {
-												$.each(m.formParameters, function(pi, p) {
-													if (p.type == "File") {
-														formData.append(p.name, $('input[type=file]', '#formParameters')[0].files[0]);
-													} else {
-														formData.append(p.name, $('#' + p.name, '#formParameters').val());
-													}
-												});
-											}
-											Describe.doPut(address, m, formData);
-											break;
-										case 'GET':
-											Describe.doGet(address, m);
-											break;
-										case 'DELETE':
-											Describe.doDelete(address, m);
-											break;
-										default:
-											break;
-										}
-									}
-								})
-								
-								debugger;
-								$('#Sample').html("<div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;color: #1E7ACE;\">\n平台推荐脚本样例</span>\n\n"+ Describe.createSampleCommon(m,j.name)+ "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\n后台脚本样例</span>\n\n" + Describe.createSampleO2(m) + "</div><div  style=\"line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\njquery样例</span>\n\n<span style=\"\">"+ Describe.createSample(m)+"</span></div>");
-							});
-				});
-			});
-		 
-		  $("[xtype='menu']").click(
-				  function(event) {
-					    if(event.stopPropagation){
-						    event.stopPropagation();
-						  }else{
-						     event.cancelBubble = true;
-						  }
-						$(this).children().each(function(i){
-							debugger;
-							if(this.tagName != "SPAN"){
-							$(this).toggle();
-							}
-						});
-					});
-		  $("[xtype='li']").click( function(event) {
-			    if(event.stopPropagation){
-				    event.stopPropagation();
-				  }else{
-				     event.cancelBubble = true;
-				  }
-			})
-	}
-}