From 346bbf8474fbd14f953898207339792a0868492b Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Mon, 24 Nov 2014 10:32:14 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/tinygroup/tinypc/impl/AbstractJobCenter.java | 12 +++++++----- .../tinypc/impl/ForemanSelectOneWorker.java | 8 ++++---- .../org/tinygroup/tinypc/impl/JobCenterLocal.java | 2 +- .../org/tinygroup/tinypc/impl/JobCenterRemote.java | 4 ++-- .../java/org/tinygroup/tinypc/impl/WorkDefault.java | 6 +++--- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java index cd9a62aff..f4ba0bf61 100644 --- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java +++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java @@ -39,7 +39,7 @@ import java.util.List; */ public class AbstractJobCenter implements JobCenter { private static Logger logger = LoggerFactory.getLogger(AbstractJobCenter.class); - private RmiServer rmiServer; + private RmiServer rmiServer;//RMI服务器 private WorkQueue workQueue; public WorkQueue getWorkQueue() { @@ -64,11 +64,13 @@ public class AbstractJobCenter implements JobCenter { } private void registerParallelObject(String objectType, ParallelObject parallelObject) throws RemoteException { + //parallelObject实例(Worker/Foreman)注册到rmiServer的RMI服务器 rmiServer.registerLocalObject(parallelObject, objectType + "|" + parallelObject.getType(), parallelObject.getId()); } private void unregisterParallelObject(String objectType, ParallelObject parallelObject) throws RemoteException { + //卸载rmiServer上的RMI服务器上的parallelObject实例(Worker/Foreman) rmiServer.unregisterObject(objectType + "|" + parallelObject.getType(), parallelObject.getId()); } @@ -138,13 +140,13 @@ public class AbstractJobCenter implements JobCenter { public Warehouse doWork(Work work) throws IOException { String foremanType = work.getForemanType(); List foremanList = null; - foremanList = getForemans(work, foremanType); + foremanList = getForemans(work, foremanType);//根据工头类型从RMI服务器中获取工头列表(本地/远程) // 如果存在空闲的工头 - Foreman foreman = getForeman(foremanType, foremanList); + Foreman foreman = getForeman(foremanType, foremanList);//随机选择一个空闲工头 //获取所有能执行该任务的工人 - List workers = this.getWorkerList(work); + List workers = this.getWorkerList(work);//获取所有能执行该任务的工人(工人类型与工作类型关联) //存放接受该work的工人列表 - List acceptWorkers = getAcceptWorkers(work, workers); + List acceptWorkers = getAcceptWorkers(work, workers);//判断工人是否愿意接受该工作 if (acceptWorkers.size() > 0) { Warehouse outputWarehouse = foreman.work(work, cloneWorkers(acceptWorkers)); // 检查是否有子任务 diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java index 123fe163c..8bf26a33e 100644 --- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java +++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java @@ -44,10 +44,10 @@ public class ForemanSelectOneWorker extends AbstractForeman { public Warehouse work(Work work, List workerList) throws RemoteException { - Worker worker = workerList.get(Util.randomIndex(workerList.size())); + Worker worker = workerList.get(Util.randomIndex(workerList.size()));//随机选取一个工人 List workersActived = new ArrayList(); - workersActived.add(worker); - workerList.remove(worker); + workersActived.add(worker);//将该工人添加到活跃工人列表 + workerList.remove(worker);//从空闲工人列表中去除该工人 return dealWork(work, worker, workerList, workersActived); } @@ -57,7 +57,7 @@ public class ForemanSelectOneWorker extends AbstractForeman { throws RemoteException { try { logger.logMessage(LogLevel.DEBUG,"worker:{0}开始执行",worker.getId()); - Warehouse w = worker.work(work); + Warehouse w = worker.work(work);//工人工作 logger.logMessage(LogLevel.DEBUG,"worker:{0}执行完成",worker.getId()); return w; } catch (Exception e) { diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java index 89d2ec919..4c3d0b345 100644 --- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java +++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java @@ -41,7 +41,7 @@ public class JobCenterLocal extends AbstractJobCenter { RmiServer rmiServer = new RmiServerImpl(port); WorkQueue workQueue = new WorkQueueImpl(); setWorkQueue(workQueue); - rmiServer.registerLocalObject(workQueue, "WorkQueue"); + rmiServer.registerLocalObject(workQueue, "WorkQueue");//RMI上注册本地工作队列 setRmiServer(rmiServer); } diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java index 9da8f30ed..c1c685c6a 100644 --- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java +++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java @@ -26,7 +26,7 @@ import org.tinygroup.tinypc.WorkQueue; public class JobCenterRemote extends AbstractJobCenter { public JobCenterRemote(String hostName, int port,String remoteHostName,int remotePort) throws IOException { - setRmiServer(new RmiServerImpl(hostName, port,remoteHostName,remotePort)); - setWorkQueue((WorkQueue) getRmiServer().getObject("WorkQueue")); + setRmiServer(new RmiServerImpl(hostName, port,remoteHostName,remotePort));//创建本地RMI服务并连接远程RMI服务器 + setWorkQueue((WorkQueue) getRmiServer().getObject("WorkQueue"));//获取远程RMI服务器上注册的工作队列 } } diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java index c6a1305f5..cda1732aa 100644 --- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java +++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java @@ -32,9 +32,9 @@ public class WorkDefault implements Work { private static final long serialVersionUID = -7558871247472425574L; private String id; private String type; - private Warehouse inputWarehouse; + private Warehouse inputWarehouse;//仓库 private boolean needSerialize = false; - private Work nextStepWork = null; + private Work nextStepWork = null;//下一工作 private WorkStatus workStatus = WorkStatus.WAITING; private String foremanType; @@ -127,6 +127,6 @@ public class WorkDefault implements Work { public String getForemanType() { if (foremanType != null) return foremanType; - return getType(); + return getType();//默认工头类型与工作类型关联 } } -- Gitee From 76392c69d0c39f7197fef7260298ad4429c53046 Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Mon, 24 Nov 2014 10:35:10 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E6=B5=8B=E8=AF=95IP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tinypc/serialwork/TestSerialWork.java | 19 ++++++++++++++----- .../java/org/tinygroup/tinypc/sum/Test.java | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java index bb734f4c8..1a1facf22 100644 --- a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java +++ b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java @@ -31,18 +31,27 @@ import java.io.IOException; */ public class TestSerialWork { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { - JobCenter jobCenter = new JobCenterLocal(); + JobCenter jobCenter = new JobCenterLocal();//本地RMI for (int i = 0; i < 5; i++) { - jobCenter.registerWorker(new WorkerHello()); + jobCenter.registerWorker(new WorkerHello());//RMI注册Worker + } + for(int i = 0; i < 3; i++) { + jobCenter.registerWorker(new WorkerBye());//RMI注册Worker } Foreman helloForeman = new ForemanSelectOneWorker("hello"); - jobCenter.registerForeman(helloForeman); + jobCenter.registerForeman(helloForeman);//RMI注册Foreman Warehouse inputWarehouse = new WarehouseDefault(); inputWarehouse.put("name", "world"); - Work work = new WorkDefault("hello", inputWarehouse); + Work work = new WorkDefault("hello", inputWarehouse);//工作序列 work.setNextWork(new WorkDefault("hello")).setNextWork(new WorkDefault("hello")); - Warehouse warehouse = jobCenter.doWork(work); + Warehouse warehouse = null; + try { + warehouse = jobCenter.doWork(work); + } catch (Exception e) { + jobCenter.stop(); + return; + } System.out.println(warehouse.get("name")); jobCenter.stop(); } diff --git a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java index 31910a6e8..98ce745c1 100644 --- a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java +++ b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java @@ -35,8 +35,8 @@ import java.io.IOException; * Created by luoguo on 14-1-8. */ public class Test { - static String SIP = "192.168.84.23"; - static String CIP = "192.168.84.23"; + static String SIP = "192.168.84.76"; + static String CIP = "192.168.84.76"; static int SP = 8888; static int CP = 7777; public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { -- Gitee From cb7b79adbf0d41ee929ee89bc27d27c1fc06c081 Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Fri, 26 Dec 2014 23:54:58 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tinygroup/rmi/test/NewRmiRunClient.java | 22 ++++++++++--------- .../tinygroup/rmi/test/NewRmiRunServer.java | 4 ++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java index b00d104c4..59a1fdfa0 100644 --- a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java +++ b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java @@ -32,7 +32,7 @@ public class NewRmiRunClient { private static String SERVERIP = "127.0.0.1"; private static String LOCALIP = "127.0.0.1"; - public static void main(String[] args) { + public static void main(String[] args) throws RemoteException { RmiServer remoteServer = null; try { @@ -42,15 +42,17 @@ public class NewRmiRunClient { // TODO Auto-generated catch block e1.printStackTrace(); } - try { - remoteServer.registerLocalObject(new HelloImpl(), "hello1"); - - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - NewRmiRunClient c = new NewRmiRunClient(remoteServer); - c.run(); + Hello hello = remoteServer.getObject("hello"); + System.out.println(hello.sayHello("ljf")); +// try { +// remoteServer.registerLocalObject(new HelloImpl(), "hello1"); +// +// } catch (RemoteException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// NewRmiRunClient c = new NewRmiRunClient(remoteServer); +// c.run(); } diff --git a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java index 89a17b55b..36354de6f 100644 --- a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java +++ b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java @@ -46,8 +46,8 @@ public class NewRmiRunServer { } catch (RemoteException e) { e.printStackTrace(); } - NewRmiRunServer r = new NewRmiRunServer(); - r.runThread(localServer); +// NewRmiRunServer r = new NewRmiRunServer(); +// r.runThread(localServer); } -- Gitee From 3e43d672272864a3e74e15e027a4fb6edf485892 Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Fri, 26 Dec 2014 23:56:17 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/resources/test2.ini | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/framework/org.tinygroup.ini/src/test/resources/test2.ini b/framework/org.tinygroup.ini/src/test/resources/test2.ini index a9cc06bbd..3431061a9 100644 --- a/framework/org.tinygroup.ini/src/test/resources/test2.ini +++ b/framework/org.tinygroup.ini/src/test/resources/test2.ini @@ -1,8 +1,8 @@ -[Section1] -name=b -age=11 -grade=3 -type=a -[Section2] -left=1 -right=1 +[Section1] +name=b +age=11 +grade=3 +type=a +[Section2] +left=1 +right=1 -- Gitee From 62d665beecfd971b7508cd8819e0ff5cc51be9d1 Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Fri, 6 Feb 2015 02:31:12 +0800 Subject: [PATCH 05/12] =?UTF-8?q?MVC=E6=B7=BB=E5=8A=A0=E8=BF=94=E5=9B=9EJS?= =?UTF-8?q?ON=E4=B8=8EXML=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weblayer/mvc/HandlerExecutionChain.java | 38 ++++++++++++++++++- .../weblayer/mvc/MappingMethodModel.java | 29 ++++++++++++-- .../weblayer/mvc/annotation/Json.java | 35 +++++++++++++++++ .../weblayer/mvc/annotation/Xml.java | 35 +++++++++++++++++ .../AnnotationHandlerMapping.java | 10 +++++ .../mvc/impl/MappingModelExecuteImpl.java | 6 +++ 6 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json.java create mode 100644 web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Xml.java diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java index e3042b52d..c94071aa2 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java @@ -15,11 +15,14 @@ */ package org.tinygroup.weblayer.mvc; +import java.io.IOException; +import java.io.PrintWriter; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collection; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import org.tinygroup.beancontainer.BeanContainerFactory; @@ -31,7 +34,13 @@ import org.tinygroup.context2object.impl.ClassNameObjectGenerator; import org.tinygroup.loader.LoaderManager; import org.tinygroup.springutil.SpringBeanContainer; import org.tinygroup.weblayer.WebContext; +import org.tinygroup.weblayer.mvc.MappingMethodModel; +import org.tinygroup.weblayer.mvc.annotation.Json; import org.tinygroup.weblayer.mvc.annotation.View; +import org.tinygroup.weblayer.mvc.annotation.Xml; +import org.tinygroup.convert.objectjson.fastjson.ObjectToJson; +import org.tinygroup.convert.objectxml.xstream.ObjectToXml; +import com.alibaba.fastjson.serializer.SerializerFeature; /** * @@ -43,6 +52,11 @@ import org.tinygroup.weblayer.mvc.annotation.View; *
*/ public class HandlerExecutionChain { + + private final static String SPLIT = ","; + + ObjectToXml objectToXml = new ObjectToXml(); + ObjectToJson objectToJson = new ObjectToJson(SerializerFeature.DisableCircularReferenceDetect); private MappingClassModel model; @@ -81,7 +95,7 @@ public class HandlerExecutionChain { this.context = context; } - public void execute() throws ClassNotFoundException { + public void execute() throws ClassNotFoundException, ServletException, IOException { Method method = methodModel.getMapMethod(); Class[] paramTypes = method.getParameterTypes(); Object[] args = new Object[paramTypes.length]; @@ -139,6 +153,8 @@ public class HandlerExecutionChain { throw new RuntimeException(e); } View view = methodModel.getView(); + Json json = methodModel.getJson(); + Xml xml = methodModel.getXml(); if (view != null) { String pathInfo = view.value(); HttpServletRequest request = context.getRequest(); @@ -148,6 +164,26 @@ public class HandlerExecutionChain { } catch (Exception e) { throw new RuntimeException(e); } + } else if (json != null) { + PrintWriter writer = context.getResponse().getWriter(); + String[] resultKeys = json.value().split(HandlerExecutionChain.SPLIT); + + for(String resultKey : resultKeys) { + Object result = context.get(resultKey); + if(result != null) { + writer.write(objectToJson.convert(result)); + } + } + } else if (xml != null) { + PrintWriter writer = context.getResponse().getWriter(); + String[] resultKeys = xml.value().split(HandlerExecutionChain.SPLIT); + + for(String resultKey : resultKeys) { + Object result = context.get(resultKey); + if(result != null) { + writer.write(objectToXml.convert(result)); + } + } } } diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java index a6b505cce..2ff4d892c 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java @@ -21,6 +21,8 @@ import java.util.Set; import org.tinygroup.weblayer.mvc.annotation.RequestMapping; import org.tinygroup.weblayer.mvc.annotation.ResultKey; import org.tinygroup.weblayer.mvc.annotation.View; +import org.tinygroup.weblayer.mvc.annotation.Json; +import org.tinygroup.weblayer.mvc.annotation.Xml; public class MappingMethodModel { @@ -33,6 +35,11 @@ public class MappingMethodModel { private View view; private ResultKey resultKey; + + private Json json; + + private Xml xml; + public ResultKey getResultKey() { return resultKey; @@ -87,9 +94,25 @@ public class MappingMethodModel { public void setView(View view) { this.view = view; } - - - + + public Json getJson() { + return json; + } + + + public void setJson(Json json) { + this.json = json; + } + + + public Xml getXml() { + return xml; + } + + + public void setXml(Xml xml) { + this.xml = xml; + } } diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json.java new file mode 100644 index 000000000..094a509a8 --- /dev/null +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 1997-2013, www.tinygroup.org (luo_guo@icloud.com). + * + * Licensed under the GPL, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.gnu.org/licenses/gpl.html + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.tinygroup.weblayer.mvc.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * 功能说明: 返回JSON + + * 开发人员: ljf
+ * 开发时间: 2015-2-5
+ *
+ */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Json { + String value() default ""; +} diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Xml.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Xml.java new file mode 100644 index 000000000..9d933b1a7 --- /dev/null +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Xml.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 1997-2013, www.tinygroup.org (luo_guo@icloud.com). + * + * Licensed under the GPL, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.gnu.org/licenses/gpl.html + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.tinygroup.weblayer.mvc.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * 功能说明: 返回XML + + * 开发人员: ljf
+ * 开发时间: 2015-2-5
+ *
+ */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Xml { + String value() default ""; +} diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java index 83b7d81b3..595596ee9 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java @@ -28,9 +28,11 @@ import org.tinygroup.logger.LoggerFactory; import org.tinygroup.weblayer.mvc.HandlerExecutionChain; import org.tinygroup.weblayer.mvc.MappingClassModel; import org.tinygroup.weblayer.mvc.MappingMethodModel; +import org.tinygroup.weblayer.mvc.annotation.Json; import org.tinygroup.weblayer.mvc.annotation.RequestMapping; import org.tinygroup.weblayer.mvc.annotation.ResultKey; import org.tinygroup.weblayer.mvc.annotation.View; +import org.tinygroup.weblayer.mvc.annotation.Xml; import org.tinygroup.weblayer.util.TinyPathMatcher; /** @@ -126,6 +128,14 @@ public class AnnotationHandlerMapping extends AbstractHandlerMapping { if(resultKey!=null){ methodModel.setResultKey(resultKey); } + Json json = AnnotationUtils.findAnnotation(method, Json.class); + if(json!=null){ + methodModel.setJson(json); + } + Xml xml = AnnotationUtils.findAnnotation(method, Xml.class); + if(xml!=null){ + methodModel.setXml(xml); + } } return StringUtil.toStringArray(urls); diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/impl/MappingModelExecuteImpl.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/impl/MappingModelExecuteImpl.java index b05c7f383..b9f35fb9e 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/impl/MappingModelExecuteImpl.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/impl/MappingModelExecuteImpl.java @@ -15,6 +15,8 @@ */ package org.tinygroup.weblayer.mvc.impl; +import java.io.IOException; +import javax.servlet.ServletException; import org.tinygroup.weblayer.WebContext; import org.tinygroup.weblayer.mvc.HandlerExecutionChain; import org.tinygroup.weblayer.mvc.MappingModelExecute; @@ -36,6 +38,10 @@ public class MappingModelExecuteImpl implements MappingModelExecute { chain.execute(); } catch (ClassNotFoundException e) { throw new RuntimeException(e); + } catch (ServletException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); } } -- Gitee From 5a9500076d23040843d37f043f7949bafd809043 Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Thu, 12 Mar 2015 20:12:48 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2JSON=EF=BC=8CJSON=E4=B8=B2=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weblayer/mvc/MappingMethodModel.java | 29 ++++----------- .../annotation/{Xml.java => Json2Object.java} | 14 ++++---- .../weblayer/mvc/annotation/ResultJson.java | 35 +++++++++++++++++++ .../annotation/{Json.java => ResultXml.java} | 14 ++++---- .../AnnotationHandlerMapping.java | 22 +++++++----- 5 files changed, 67 insertions(+), 47 deletions(-) rename web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/{Xml.java => Json2Object.java} (83%) create mode 100644 web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/ResultJson.java rename web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/{Json.java => ResultXml.java} (82%) diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java index 2ff4d892c..bd55e57f7 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java @@ -18,11 +18,12 @@ package org.tinygroup.weblayer.mvc; import java.lang.reflect.Method; import java.util.Set; +import org.tinygroup.weblayer.mvc.annotation.Json2Object; import org.tinygroup.weblayer.mvc.annotation.RequestMapping; +import org.tinygroup.weblayer.mvc.annotation.ResultJson; import org.tinygroup.weblayer.mvc.annotation.ResultKey; +import org.tinygroup.weblayer.mvc.annotation.ResultXml; import org.tinygroup.weblayer.mvc.annotation.View; -import org.tinygroup.weblayer.mvc.annotation.Json; -import org.tinygroup.weblayer.mvc.annotation.Xml; public class MappingMethodModel { @@ -36,9 +37,11 @@ public class MappingMethodModel { private ResultKey resultKey; - private Json json; + private ResultJson resultJson; - private Xml xml; + private ResultXml resultXml; + + private Json2Object json2Object; public ResultKey getResultKey() { @@ -96,23 +99,5 @@ public class MappingMethodModel { } - public Json getJson() { - return json; - } - - - public void setJson(Json json) { - this.json = json; - } - - - public Xml getXml() { - return xml; - } - - - public void setXml(Xml xml) { - this.xml = xml; - } } diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Xml.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json2Object.java similarity index 83% rename from web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Xml.java rename to web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json2Object.java index 9d933b1a7..9a6bf6923 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Xml.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json2Object.java @@ -21,15 +21,13 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * - * 功能说明: 返回XML - - * 开发人员: ljf
- * 开发时间: 2015-2-5
- *
+ * 功能说明: JSON字符串转换对象
+ * @author ljf + * @date 2015-2-15 下午5:56:26 + * @version V1.0 */ + @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface Xml { - String value() default ""; +public @interface Json2Object { } diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/ResultJson.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/ResultJson.java new file mode 100644 index 000000000..63b312edb --- /dev/null +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/ResultJson.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 1997-2013, www.tinygroup.org (luo_guo@icloud.com). + * + * Licensed under the GPL, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.gnu.org/licenses/gpl.html + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.tinygroup.weblayer.mvc.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 功能说明: 返回JSON串
+ * @author ljf + * @date 2015-2-7 下午4:12:15 + * @version V1.0 + */ + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ResultJson { + String[] value() default {}; +} diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/ResultXml.java similarity index 82% rename from web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json.java rename to web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/ResultXml.java index 094a509a8..7f3263d0c 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/Json.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/annotation/ResultXml.java @@ -21,15 +21,13 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * - * 功能说明: 返回JSON - - * 开发人员: ljf
- * 开发时间: 2015-2-5
- *
+ * 功能说明: 返回XML
+ * @author ljf + * @date 2015-2-7 下午4:20:54 + * @version V1.0 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface Json { - String value() default ""; +public @interface ResultXml { + String[] value() default {}; } diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java index 595596ee9..fe24d54f4 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java @@ -28,11 +28,12 @@ import org.tinygroup.logger.LoggerFactory; import org.tinygroup.weblayer.mvc.HandlerExecutionChain; import org.tinygroup.weblayer.mvc.MappingClassModel; import org.tinygroup.weblayer.mvc.MappingMethodModel; -import org.tinygroup.weblayer.mvc.annotation.Json; +import org.tinygroup.weblayer.mvc.annotation.Json2Object; import org.tinygroup.weblayer.mvc.annotation.RequestMapping; +import org.tinygroup.weblayer.mvc.annotation.ResultJson; import org.tinygroup.weblayer.mvc.annotation.ResultKey; +import org.tinygroup.weblayer.mvc.annotation.ResultXml; import org.tinygroup.weblayer.mvc.annotation.View; -import org.tinygroup.weblayer.mvc.annotation.Xml; import org.tinygroup.weblayer.util.TinyPathMatcher; /** @@ -128,15 +129,18 @@ public class AnnotationHandlerMapping extends AbstractHandlerMapping { if(resultKey!=null){ methodModel.setResultKey(resultKey); } - Json json = AnnotationUtils.findAnnotation(method, Json.class); - if(json!=null){ - methodModel.setJson(json); + ResultJson resultJson = AnnotationUtils.findAnnotation(method, ResultJson.class); + if(resultJson!=null){ + methodModel.setResultJson(resultJson); } - Xml xml = AnnotationUtils.findAnnotation(method, Xml.class); - if(xml!=null){ - methodModel.setXml(xml); + ResultXml resultXml = AnnotationUtils.findAnnotation(method, ResultXml.class); + if(resultXml!=null){ + methodModel.setResultXml(resultXml); + } + Json2Object json2Object = AnnotationUtils.findAnnotation(method, Json2Object.class); + if(json2Object!=null){ + methodModel.setJson2Object(json2Object); } - } return StringUtil.toStringArray(urls); -- Gitee From 07d686c218dcd28492ec12d1e5a635b77c7a716a Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Thu, 12 Mar 2015 20:26:33 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E6=89=A9=E5=B1=95TinyMVC=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E8=B1=A1=E8=BD=AC=E6=8D=A2JSON?= =?UTF-8?q?=E4=B8=B2=EF=BC=8CJSON=E4=B8=B2=E8=BD=AC=E6=8D=A2=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weblayer/mvc/MappingMethodModel.java | 29 +++++++++++++++ .../AnnotationHandlerMapping.java | 1 + .../org/tinygroup/weblayer/util/AsmUtil.java | 37 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/util/AsmUtil.java diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java index bd55e57f7..5da2cc6f2 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/MappingMethodModel.java @@ -99,5 +99,34 @@ public class MappingMethodModel { } + public ResultJson getResultJson() { + return resultJson; + } + + + public void setResultJson(ResultJson resultJson) { + this.resultJson = resultJson; + } + + + public ResultXml getResultXml() { + return resultXml; + } + + + public void setResultXml(ResultXml resultXml) { + this.resultXml = resultXml; + } + + + public Json2Object getJson2Object() { + return json2Object; + } + + + public void setJson2Object(Json2Object json2Object) { + this.json2Object = json2Object; + } + } diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java index fe24d54f4..da5c1e251 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/handlermapping/AnnotationHandlerMapping.java @@ -137,6 +137,7 @@ public class AnnotationHandlerMapping extends AbstractHandlerMapping { if(resultXml!=null){ methodModel.setResultXml(resultXml); } + Json2Object json2Object = AnnotationUtils.findAnnotation(method, Json2Object.class); if(json2Object!=null){ methodModel.setJson2Object(json2Object); diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/util/AsmUtil.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/util/AsmUtil.java new file mode 100644 index 000000000..eba590df9 --- /dev/null +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/util/AsmUtil.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 1997-2013, www.tinygroup.org (luo_guo@icloud.com). + * + * Licensed under the GPL, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.gnu.org/licenses/gpl.html + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.tinygroup.weblayer.util; + +import java.lang.reflect.Method; + +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; + + +/** + * 功能说明: ASM获取方法参数名称 + * @author ljf + * @date 2015-2-25 下午5:23:10 + * @version V1.0 + */ +public class AsmUtil { + + private static ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + + public static String[] getParameterNames(Method method) { + return parameterNameDiscoverer.getParameterNames(method); + } +} -- Gitee From 396acf402855ee8b5d82f044ead9ab8f32c2b1c3 Mon Sep 17 00:00:00 2001 From: liangjf85 Date: Thu, 12 Mar 2015 21:44:42 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E6=89=A9=E5=B1=95TInyMVC,=E6=94=AF?= =?UTF-8?q?=E6=8C=81JSON=E8=BD=AC=E6=8D=A2=E5=AF=B9=E8=B1=A1=EF=BC=8C?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E8=BD=AC=E6=8D=A2JSON=E4=B8=B2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weblayer/mvc/HandlerExecutionChain.java | 172 ++++++++++++------ 1 file changed, 114 insertions(+), 58 deletions(-) diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java index c94071aa2..5381a99b3 100644 --- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java +++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java @@ -35,11 +35,15 @@ import org.tinygroup.loader.LoaderManager; import org.tinygroup.springutil.SpringBeanContainer; import org.tinygroup.weblayer.WebContext; import org.tinygroup.weblayer.mvc.MappingMethodModel; -import org.tinygroup.weblayer.mvc.annotation.Json; +import org.tinygroup.weblayer.mvc.annotation.Json2Object; +import org.tinygroup.weblayer.mvc.annotation.ResultJson; +import org.tinygroup.weblayer.mvc.annotation.ResultXml; import org.tinygroup.weblayer.mvc.annotation.View; -import org.tinygroup.weblayer.mvc.annotation.Xml; +import org.tinygroup.weblayer.util.AsmUtil; import org.tinygroup.convert.objectjson.fastjson.ObjectToJson; import org.tinygroup.convert.objectxml.xstream.ObjectToXml; + +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; /** @@ -53,8 +57,6 @@ import com.alibaba.fastjson.serializer.SerializerFeature; */ public class HandlerExecutionChain { - private final static String SPLIT = ","; - ObjectToXml objectToXml = new ObjectToXml(); ObjectToJson objectToJson = new ObjectToJson(SerializerFeature.DisableCircularReferenceDetect); @@ -97,47 +99,63 @@ public class HandlerExecutionChain { public void execute() throws ClassNotFoundException, ServletException, IOException { Method method = methodModel.getMapMethod(); - Class[] paramTypes = method.getParameterTypes(); + Class[] paramTypes = method.getParameterTypes(); Object[] args = new Object[paramTypes.length]; - String[] parameterNames = BeanUtil.getMethodParameterName( - method.getDeclaringClass(), method); - for (int i = 0; i < paramTypes.length; i++) { - args[i] = context.get(parameterNames[i]); - Class type = paramTypes[i]; - if (args[i] == null) { - if (type.equals(WebContext.class)) { - args[i] = context; - } else { - ClassNameObjectGenerator generator = BeanContainerFactory - .getBeanContainer(this.getClass().getClassLoader()) - .getBean( - GeneratorFileProcessor.CLASSNAME_OBJECT_GENERATOR_BEAN); - //TODO:此处应该还要考虑数据的情况 - if (Collection.class.isAssignableFrom(type)) { - ParameterizedType pt = (ParameterizedType) (method - .getGenericParameterTypes()[i]); - Type[] actualTypeArguments = pt - .getActualTypeArguments(); - ClassLoader loader = LoaderManager - .getLoader(getClassName(actualTypeArguments[0] - .toString())); - args[i] = generator - .getObjectCollection(null, type.getName(), - getClassName(actualTypeArguments[0] - .toString()), loader, context); + String[] parameterNames = AsmUtil.getParameterNames(method);//替换字节码库,支持泛型 + + Json2Object json2Object = methodModel.getJson2Object(); + if (json2Object != null) { + for (int i = 0; i < paramTypes.length; i++) { + String text = context.getRequest().getParameter(parameterNames[i]); + if(text != null && text.trim().length() > 0) { + Object object = JSON.parseObject(text, paramTypes[i]); + args[i] = object; + context.put(parameterNames[i], object); + } + } + } else {//form表单提交 + for (int i = 0; i < paramTypes.length; i++) { + args[i] = context.get(parameterNames[i]); + Class type = paramTypes[i]; + if (args[i] == null) { + if (type.equals(WebContext.class)) { + args[i] = context; + }else if(isSimpleType(type)) {//基本类型参数 + throw new RuntimeException("基本数据参数值不允许为空"); + }else if(isWapperType(type)) {//包装类型参数 + args[i] = null; } else { - ClassLoader loader = LoaderManager.getLoader(type - .getName()); - args[i] = generator.getObject(null, null, - type.getName(), loader, context); + ClassNameObjectGenerator generator = BeanContainerFactory + .getBeanContainer(this.getClass().getClassLoader()) + .getBean( + GeneratorFileProcessor.CLASSNAME_OBJECT_GENERATOR_BEAN); + //TODO:此处应该还要考虑数据的情况 + if (Collection.class.isAssignableFrom(type)) { + ParameterizedType pt = (ParameterizedType) (method + .getGenericParameterTypes()[i]); + Type[] actualTypeArguments = pt + .getActualTypeArguments(); + ClassLoader loader = LoaderManager + .getLoader(getClassName(actualTypeArguments[0] + .toString())); + args[i] = generator + .getObjectCollection(null, type.getName(), + getClassName(actualTypeArguments[0] + .toString()), loader, context); + } else { + ClassLoader loader = LoaderManager.getLoader(type + .getName()); + args[i] = generator.getObject(null, null, + type.getName(), loader, context); + } } + } else { + args[i] = ValueUtil + .getValue(args[i].toString(), type.getName()); } - } else { - args[i] = ValueUtil - .getValue(args[i].toString(), type.getName()); + context.put(parameterNames[i], args[i]); + } - context.put(parameterNames[i], args[i]); - } try { Object object = getInstance(model.getMapClass()); @@ -153,8 +171,8 @@ public class HandlerExecutionChain { throw new RuntimeException(e); } View view = methodModel.getView(); - Json json = methodModel.getJson(); - Xml xml = methodModel.getXml(); + ResultJson resultJson = methodModel.getResultJson(); + ResultXml resultXml = methodModel.getResultXml(); if (view != null) { String pathInfo = view.value(); HttpServletRequest request = context.getRequest(); @@ -164,25 +182,41 @@ public class HandlerExecutionChain { } catch (Exception e) { throw new RuntimeException(e); } - } else if (json != null) { - PrintWriter writer = context.getResponse().getWriter(); - String[] resultKeys = json.value().split(HandlerExecutionChain.SPLIT); - - for(String resultKey : resultKeys) { - Object result = context.get(resultKey); - if(result != null) { - writer.write(objectToJson.convert(result)); + } else if (resultJson != null) { + PrintWriter writer = null; + String[] resultKeys = resultJson.value(); + context.getResponse().setContentType("text/html; charset=utf-8"); + try { + writer = context.getResponse().getWriter(); + for(String resultKey : resultKeys) { + Object result = context.get(resultKey); + if(result != null) { + writer.write(objectToJson.convert(result)); + } } + writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + writer.close(); } - } else if (xml != null) { - PrintWriter writer = context.getResponse().getWriter(); - String[] resultKeys = xml.value().split(HandlerExecutionChain.SPLIT); - - for(String resultKey : resultKeys) { - Object result = context.get(resultKey); - if(result != null) { - writer.write(objectToXml.convert(result)); + } else if (resultXml != null) { + PrintWriter writer = null; + String[] resultKeys = resultXml.value(); + context.getResponse().setContentType("application/xml; charset=utf-8"); + try { + writer = context.getResponse().getWriter(); + for(String resultKey : resultKeys) { + Object result = context.get(resultKey); + if(result != null) { + writer.write(objectToXml.convert(result)); + } } + writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + writer.close(); } } } @@ -213,5 +247,27 @@ public class HandlerExecutionChain { } } } + + private boolean isSimpleType(Class clazz) { + if (clazz.equals(int.class) || clazz.equals(char.class) + || clazz.equals(byte.class) || clazz.equals(boolean.class) + || clazz.equals(short.class) || clazz.equals(long.class) + || clazz.equals(double.class) || clazz.equals(float.class)) { + return true; + } + return false; + } + + private boolean isWapperType(Class clazz) { + if (clazz.equals(Integer.class) || clazz.equals(Character.class) + || clazz.equals(Byte.class) || clazz.equals(Boolean.class) + || clazz.equals(Short.class) || clazz.equals(Long.class) + || clazz.equals(Double.class) || clazz.equals(Float.class) + || clazz.equals(String.class) + ) { + return true; + } + return false; + } } -- Gitee From e9c556b85318d29ca921ae367eb7f9b5dcaa3e42 Mon Sep 17 00:00:00 2001 From: ljf85 Date: Sun, 26 Apr 2015 21:46:29 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A7=BB=E9=99=A4log?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=BA=BF=E7=A8=8B=E6=9C=AC=E5=9C=B0=E5=8F=98?= =?UTF-8?q?=E9=87=8F=EF=BC=8C=E9=81=BF=E5=85=8D=E5=81=9C=E6=AD=A2Tomcat?= =?UTF-8?q?=E9=80=A0=E6=88=90=E7=9A=84=E5=91=8A=E8=AD=A6=E3=80=82=20?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E5=BA=94=E7=94=A8=E5=81=9C=E6=AD=A2=E6=97=B6?= =?UTF-8?q?=E4=B8=BB=E5=8A=A8=E8=B0=83=E7=94=A8=E8=AF=A5=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/tinygroup/logger/Logger.java | 6 ++++++ .../java/org/tinygroup/logger/LoggerFactory.java | 13 +++++++++++++ .../java/org/tinygroup/logger/impl/LoggerImpl.java | 4 ++++ 3 files changed, 23 insertions(+) diff --git a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java index 845a58cca..c857b2939 100644 --- a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java +++ b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java @@ -218,5 +218,11 @@ public interface Logger { * 设置限制记录数 */ public void setMaxBufferRecords(int bufferRecords); + + /** + * 删除ThreadLocal本地变量
+ * 避免停止Tomcat内存泄露检测警告
+ */ + public void removeThreadLocal(); } \ No newline at end of file diff --git a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java index 8982c792e..5e5b79ffb 100644 --- a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java +++ b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java @@ -16,7 +16,9 @@ package org.tinygroup.logger; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; import org.slf4j.ILoggerFactory; import org.tinygroup.logger.impl.LoggerImpl; @@ -79,4 +81,15 @@ public final class LoggerFactory { public synchronized static void setThreadLogLevel(LogLevel logLevel){ threadLogLevel.set(logLevel); } + + /** + * 移除线程本地变量,避免停止Tomcat线程告警 + */ + public static void removeThreadLocals() { + Iterator> it = loggers.entrySet().iterator(); + while (it.hasNext()) { + Logger logger = it.next().getValue(); + logger.removeThreadLocal(); + } + } } diff --git a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java index 84490e07f..047d109fa 100644 --- a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java +++ b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java @@ -479,5 +479,9 @@ public class LoggerImpl implements Logger { public void setMaxBufferRecords(int maxBufferRecords) { this.maxBufferRecords = maxBufferRecords; } + + public void removeThreadLocal() { + threadLocal.remove(); + } } -- Gitee From 4cabc5833167079a6ee15d90d886605f6aaa5e25 Mon Sep 17 00:00:00 2001 From: ljf85 Date: Sun, 26 Apr 2015 22:19:02 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=BF=85=E9=A1=BB=E5=81=9C=E6=AD=A2jcs?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=9B=B8=E5=85=B3=E5=90=8E=E5=8F=B0=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=20=E9=81=BF=E5=85=8D=E9=80=A0=E6=88=90Tomcat=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E6=97=B6=E5=87=BA=E7=8E=B0=E6=97=A0=E6=B3=95=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E7=BC=93=E5=AD=98=E5=90=8E=20=E5=8F=B0=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dict/applicationprocessor/DictLoadProcessor.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java b/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java index 9139b6014..004da8f90 100644 --- a/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java +++ b/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java @@ -20,6 +20,7 @@ import org.tinygroup.application.ApplicationProcessor; import org.tinygroup.cache.CacheInitConfig; import org.tinygroup.config.impl.AbstractConfiguration; import org.tinygroup.dict.DictManager; +import org.tinygroup.logger.LogLevel; /** * @@ -71,7 +72,10 @@ public class DictLoadProcessor extends AbstractConfiguration implements Applicat } public void stop() { - + logger.logMessage(LogLevel.INFO, "开始卸载字典缓存"); + //Shutdown the Cache + manager.getCache().destroy(); + logger.logMessage(LogLevel.INFO, "卸载字典缓存完成"); } public void setApplication(Application application) { -- Gitee From 19cd304d5f26dd25fdddfdf70160999563625d01 Mon Sep 17 00:00:00 2001 From: ljf85 Date: Sun, 26 Apr 2015 22:33:18 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=85=B3=E9=97=ADehcac?= =?UTF-8?q?he=E7=BC=93=E5=AD=98=E5=90=8E=E5=8F=B0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=20=E9=81=BF=E5=85=8D=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E5=AE=8C=E6=88=90=E5=85=B3=E9=97=ADehcache=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E6=89=80=E6=9C=89=20=E7=9B=B8=E5=85=B3=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/tinygroup/cache/ehcache/EhCache.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java b/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java index 0238d31d8..744446efa 100644 --- a/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java +++ b/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java @@ -136,7 +136,8 @@ public class EhCache implements Cache { } public void destroy() { - cache.dispose(); + //Shutdown the singleton CacheManager + manager.shutdown(); } } -- Gitee From 137d8038b03ec9386a5136ed39d5bfe54d6da012 Mon Sep 17 00:00:00 2001 From: ljf85 Date: Mon, 27 Apr 2015 09:14:00 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B8=85=E9=99=A4jcs?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=90=8E=E5=8F=B0=E7=BA=BF=E7=A8=8B=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=20=E5=90=A6=E5=88=99=E5=9C=A8=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=97=B6=EF=BC=8C=E5=AD=98=E5=9C=A8=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/tinygroup/cache/jcs/JcsCache.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java b/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java index c7ad8e722..f03cd425a 100644 --- a/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java +++ b/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java @@ -144,8 +144,8 @@ public class JcsCache implements Cache { } public void destroy() { - jcs.dispose(); CompositeCache.elementEventQ.destroy(); + jcs.dispose(); } } -- Gitee