2 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
6 // Permission is hereby granted, free of charge, to any person obtaining
7 // a copy of this software and associated documentation files (the
8 // "Software"), to deal in the Software without restriction, including
9 // without limitation the rights to use, copy, modify, merge, publish,
10 // distribute, sublicense, and/or sell copies of the Software, and to
11 // permit persons to whom the Software is furnished to do so, subject to
12 // the following conditions:
14 // The above copyright notice and this permission notice shall be
15 // included in all copies or substantial portions of the Software.
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #define USE_APPSERVER_THREAD
30 using System.Configuration;
31 using System.Web.Configuration;
32 using System.Threading;
33 using System.Web.Hosting;
36 using javax.servlet.http;
39 namespace System.Web.J2EE
41 public class BaseHttpServlet : HttpServlet
43 //private AppDomain _servletDomain;
44 static LocalDataStoreSlot _servletRequestSlot = Thread.GetNamedDataSlot(J2EEConsts.SERVLET_REQUEST);
45 static LocalDataStoreSlot _servletResponseSlot = Thread.GetNamedDataSlot(J2EEConsts.SERVLET_RESPONSE);
46 static LocalDataStoreSlot _servletSlot = Thread.GetNamedDataSlot(J2EEConsts.CURRENT_SERVLET);
49 public BaseHttpServlet()
53 override public void init(ServletConfig config)
60 protected virtual void InitServlet(ServletConfig config)
64 AppDomain servletDomain = createServletDomain(config);
65 vmw.@internal.EnvironmentUtils.setAppDomain(servletDomain);
67 //GH Infromation Initizalization
68 int nowInt = DateTime.Now.ToString().GetHashCode();
69 servletDomain.SetData(".domainId", nowInt.ToString("x"));
70 nowInt += "/".GetHashCode ();
71 servletDomain.SetData(".appId", nowInt.ToString("x"));
72 servletDomain.SetData(".appName", nowInt.ToString("x"));
74 servletDomain.SetData(J2EEConsts.CLASS_LOADER, vmw.common.TypeUtils.ToClass(this).getClassLoader());
75 servletDomain.SetData(J2EEConsts.SERVLET_CONFIG, config);
76 servletDomain.SetData(J2EEConsts.RESOURCE_LOADER, new vmw.@internal.j2ee.ServletResourceLoader(config.getServletContext()));
78 config.getServletContext().setAttribute(J2EEConsts.APP_DOMAIN, servletDomain);
82 vmw.@internal.EnvironmentUtils.cleanTLS();
83 vmw.@internal.EnvironmentUtils.clearAppDomain();
87 override protected void service (HttpServletRequest req, HttpServletResponse resp)
89 #if !USE_APPSERVER_THREAD
90 // temporary workaround
91 PersonalServiceThread pt = new PersonalServiceThread (new PersonalServiceThread.ServiceDelegate (service2), req, resp);
95 protected void service2(HttpServletRequest req, HttpServletResponse resp)
100 // Very important - to update Virtual Path!!!
101 AppDomain servletDomain = (AppDomain)this.getServletContext().getAttribute(J2EEConsts.APP_DOMAIN);
102 servletDomain.SetData(IAppDomainConfig.APP_VIRT_DIR, req.getContextPath());
103 servletDomain.SetData(".hostingVirtualPath", req.getContextPath());
105 // Put to the TLS current AppDomain of the servlet, so anyone can use it.
106 vmw.@internal.EnvironmentUtils.setAppDomain(servletDomain);
108 //put request to the TLS
109 Thread.SetData(_servletRequestSlot, req);
110 //put response to the TLS
111 Thread.SetData(_servletResponseSlot, resp);
112 //put the servlet object to the TLS
113 Thread.SetData(_servletSlot, this);
117 resp.setHeader("X-Powered-By", "ASP.NET");
118 resp.setHeader("X-AspNet-Version", "1.1.4322");
120 //PageMapper.LoadFileList();
122 resp.setContentType("text/html");
123 HttpWorkerRequest gwr = new ServletWorkerRequest(this, req, resp);
124 HttpRuntime.ProcessRequest(gwr);
128 HttpContext.Current = null;
129 Thread.SetData(_servletRequestSlot, null);
130 Thread.SetData(_servletResponseSlot, null);
131 Thread.SetData(_servletSlot, null);
132 vmw.@internal.EnvironmentUtils.clearAppDomain();
134 //vmw.Utils.cleanTLS(); //clean up all TLS entries for current Thread.
135 //java.lang.Thread.currentThread().setContextClassLoader(null);
139 override public void destroy()
143 AppDomain servletDomain = (AppDomain)this.getServletContext().getAttribute(J2EEConsts.APP_DOMAIN);
144 vmw.@internal.EnvironmentUtils.setAppDomain(servletDomain);
146 Console.WriteLine("Destroy of GhHttpServlet");
150 vmw.@internal.EnvironmentUtils.cleanAllBeforeServletDestroy(this);
151 this.getServletContext().removeAttribute(J2EEConsts.APP_DOMAIN);
152 java.lang.Thread.currentThread().setContextClassLoader(null);
157 Console.WriteLine("ERROR in Servlet Destroy {0},{1}",e.GetType(), e.Message);
158 Console.WriteLine(e.StackTrace);
163 vmw.@internal.EnvironmentUtils.clearAppDomain();
167 private AppDomain createServletDomain(ServletConfig config)
169 string rootPath = J2EEUtils.GetApplicationRealPath(config);
170 AppDomainSetup domainSetup = new AppDomainSetup();
171 string name = config.getServletName();//.getServletContextName();
173 name = "GH Application";
174 domainSetup.ApplicationName = name;
175 domainSetup.ConfigurationFile = rootPath + "/Web.config";
177 AppDomain servletDomain = AppDomain.CreateDomain(name, null, domainSetup);
183 //servletDomain.SetData(IAppDomainConfig.APP_PHYS_DIR, J2EEUtils.GetApplicationPhysicalPath(config));
184 //servletDomain.SetData(IAppDomainConfig.WEB_APP_DIR, rootPath);
186 servletDomain.SetData(IAppDomainConfig.APP_PHYS_DIR, J2EEUtils.GetApplicationPhysicalPath(config));
187 servletDomain.SetData(IAppDomainConfig.WEB_APP_DIR, rootPath);
189 // The BaseDir is the full path to the physical dir of the app
190 // and allows the application to modify files in the case of
192 string webApp_baseDir = config.getServletContext().getRealPath("");
193 if (webApp_baseDir == null || webApp_baseDir == "")
194 webApp_baseDir = rootPath;
195 servletDomain.SetData(IAppDomainConfig.APP_BASE_DIR , webApp_baseDir);
197 Console.WriteLine("Initialization of webapp " + webApp_baseDir);
199 // Mordechai : setting the web app deserializer object.
200 servletDomain.SetData(J2EEConsts.DESERIALIZER_CONST , this.GetDeserializer());
201 servletDomain.SetData(vmw.@internal.EnvironmentUtils.GH_DRIVER_UTILS_CONST, this.getDriverUtils());
202 //servletDomain.SetData(".hostingVirtualPath", "/");
203 //servletDomain.SetData(".hostingInstallDir", "/");
204 return servletDomain;
207 virtual protected vmw.@internal.io.IObjectsDeserializer GetDeserializer()
209 if (m_deseializer == null)
210 m_deseializer = new GHWebDeseserializer();
211 return m_deseializer;
214 protected vmw.@internal.io.IObjectsDeserializer m_deseializer = null;
215 /// Mordechai: This class comes to solve a problem in class deserialize
216 /// within web application. The problem is that the classloader that created
217 /// some user web class (for example aspx page) is not the class loader
218 /// that de-serialize it - thus we end with ClassDefNotFoundException.
219 /// To prevent this situation we delegate the serialization back the the
220 /// web app (which has the correct class loader...)
223 virtual protected vmw.@internal.IDriverUtils getDriverUtils()
225 //by default no driver utils, the specific servlet will override this method
230 public class GHWebDeseserializer : vmw.@internal.io.IObjectsDeserializer
233 Object vmw.@internal.io.IObjectsDeserializer.Deserialize(java.io.ObjectInputStream stream)
235 object obj = stream.readObject();
239 #if !USE_APPSERVER_THREAD
240 public class PersonalServiceThread
242 public delegate void ServiceDelegate (HttpServletRequest req, HttpServletResponse resp);
243 HttpServletRequest _req = null;
244 HttpServletResponse _resp = null;
245 Thread _worker = null;
246 ServiceDelegate _service = null;
248 public PersonalServiceThread (ServiceDelegate service, HttpServletRequest req, HttpServletResponse resp)
254 _worker = new Thread (new ThreadStart (Run));
257 public void RunWait ()
265 _service(_req, _resp);
272 namespace System.Web.GH
274 public class BaseHttpServlet : System.Web.J2EE.BaseHttpServlet