KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jdon > model > handler > HandlerObjectFactory


1 /*
2  * Copyright 2003-2006 the original author or authors.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  *
15  */

16 package com.jdon.model.handler;
17
18 import java.util.Collections JavaDoc;
19 import java.util.HashMap JavaDoc;
20 import java.util.LinkedList JavaDoc;
21 import java.util.Map JavaDoc;
22 import java.util.concurrent.ConcurrentHashMap JavaDoc;
23
24 import com.jdon.model.ModelHandler;
25 import com.jdon.model.config.PoolParameter;
26 import com.jdon.model.factory.ModelHandlerClassBuilder;
27 import com.jdon.util.Debug;
28
29 /**
30  * @author <a HREF="mailto:banqiao@jdon.com">banq </a>
31  *
32  */

33 public class HandlerObjectFactory {
34     public final static String JavaDoc module = HandlerObjectFactory.class.getName();
35
36     private final static int HANDLER_INSTANCE_COUNT = 10;
37
38     private int poolSize;
39
40     private ModelHandlerClassBuilder modelHandlerClassBuilder;
41
42     //空闲ModelHandleræ± 
43
//private Map handlerFreePool = Collections.synchronizedMap(new HashMap());
44
private Map JavaDoc handlerFreePool = new ConcurrentHashMap JavaDoc();
45
46     //在使用的ModelHandleræ± 
47
//private Map handlerUsedPool = Collections.synchronizedMap(new HashMap());
48
private Map JavaDoc handlerUsedPool = new ConcurrentHashMap JavaDoc();
49
50     public HandlerObjectFactory(ModelHandlerClassBuilder modelXmlConfig, PoolParameter poolParameter) {
51         this.modelHandlerClassBuilder = modelXmlConfig;
52         this.poolSize = poolParameter.getHandlerPoolSize();
53     }
54
55     /**
56      * 获得一个空闲的ModelHandler 如果空闲池没有,就é‡?新生æˆ?指定个数的ModelHandler实例。 获得æˆ?功,则记入在用池。
57      * 当客户端调用完毕,调用returnHandlerObject返回该ModelHandler实例备é‡?用。
58      *
59      * @param formName
60      * @return
61      * @throws java.lang.Exception
62      */

63     public ModelHandler borrowHandlerObject(String JavaDoc formName) {
64
65         ModelHandler modelHandler = null;
66         try {
67             String JavaDoc poolKey = (modelHandlerClassBuilder.getModelMapping(formName)).getHandler();
68
69             LinkedList JavaDoc listFree = (LinkedList JavaDoc) handlerFreePool.get(poolKey);
70             if ((listFree == null) || (listFree.isEmpty())) { //如果空了,生产
71
listFree = makeHandlerObjects(formName);
72                 handlerFreePool.put(poolKey, listFree);
73             }
74             modelHandler = (ModelHandler) listFree.removeFirst();
75
76             //加入已ç»?用的池
77
LinkedList JavaDoc listUsed = (LinkedList JavaDoc) handlerUsedPool.get(poolKey);
78             if (listUsed == null) {
79                 listUsed = new LinkedList JavaDoc();
80                 handlerUsedPool.put(poolKey, listUsed);
81             }
82             listUsed.add(modelHandler);
83
84             Debug.logVerbose("[JdonFramework]--> borrow Modelhandler instance " + poolKey + listFree.size() + " for " + formName, module);
85         } catch (Exception JavaDoc e) {
86             Debug.logError("[JdonFramework]borrowHandlerObject error:" + e, module);
87         }
88
89         return modelHandler;
90     }
91
92     /**
93      * 生æˆ?指定个数的实例
94      *
95      * @param formName
96      * @return
97      * @throws java.lang.Exception
98      */

99     private synchronized LinkedList JavaDoc makeHandlerObjects(String JavaDoc formName) throws Exception JavaDoc {
100         Debug.logVerbose("[JdonFramework]--> create Modelhandler instance " + poolSize, module);
101         int count = 0;
102         ModelHandler modelHandler = null;
103         LinkedList JavaDoc list = new LinkedList JavaDoc();
104         while (count < poolSize) {
105             modelHandler = makeHandlerObject(formName);
106             list.add(modelHandler);
107             count++;
108         }
109         return list;
110     }
111
112     /**
113      * 返还使用过的ModelHandler 1.从使用池中删除该实例 2.将该实例加入空闲池
114      *
115      * @param modelHandler
116      * @throws java.lang.Exception
117      */

118     public void returnHandlerObject(ModelHandler modelHandler) {
119         try {
120             String JavaDoc poolKey = modelHandler.getClass().getName();
121             LinkedList JavaDoc listUsed = (LinkedList JavaDoc) handlerUsedPool.get(poolKey);
122             if (listUsed == null) {
123                 Debug.logError("[JdonFramework]ERROR:not find the used pool: class = " + poolKey, module);
124                 return;
125             }
126             listUsed.remove(modelHandler);
127             LinkedList JavaDoc listFree = (LinkedList JavaDoc) handlerFreePool.get(poolKey);
128             if (listFree == null) {
129                 Debug.logError("[JdonFramework]ERROR:not find the free pool: class = " + poolKey, module);
130                 return;
131             }
132             listFree.add(modelHandler);
133             Debug.logVerbose("[JdonFramework]--> return Modelhandler instance successfully" + poolKey + listFree.size(), module);
134         } catch (Exception JavaDoc e) {
135             Debug.logError("[JdonFramework]returnHandlerObject error:" + e, module);
136         }
137     }
138
139     private synchronized ModelHandler makeHandlerObject(String JavaDoc formName) throws Exception JavaDoc {
140         ModelHandler object = null;
141         Class JavaDoc handlerClass = null;
142         try {
143             handlerClass = modelHandlerClassBuilder.getHandlerClasses(formName);
144             if (handlerClass == null) {
145                 throw new Exception JavaDoc(" not found the handler in config xml formName=" + formName);
146             }
147             object = (ModelHandler) handlerClass.newInstance();
148         } catch (Exception JavaDoc e) {
149             Debug.logError("[JdonFramework]--> call Handler: " + handlerClass + " error:" + e, module);
150             throw new Exception JavaDoc(e);
151         }
152         return object;
153     }
154
155 }
156
Popular Tags