KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > openedit > BaseWebServer


1 /*
2  * Created on Jan 5, 2005
3  */

4 package com.openedit;
5
6 import java.io.File JavaDoc;
7 import java.io.FileInputStream JavaDoc;
8 import java.io.IOException JavaDoc;
9 import java.io.InputStream JavaDoc;
10 import java.net.URL JavaDoc;
11 import java.util.Enumeration JavaDoc;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.springframework.beans.factory.config.BeanDefinition;
16 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
17 import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
18 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
19 import org.springframework.beans.factory.xml.XmlBeanFactory;
20 import org.springframework.core.io.InputStreamResource;
21
22 import com.openedit.modules.scheduler.SchedulerModule;
23 import com.openedit.page.manage.PageManager;
24 import com.openedit.servlet.OpenEditEngine;
25 import com.openedit.users.UserManager;
26 import com.openedit.util.FileUtils;
27
28 /**
29  * <p>
30  * This class contains the core parts of an OpenEdit website. You should not use
31  * this object if you only need one part of it. This class is responsible for
32  * loading the Spring beans as defined in the openedit.xml and any applicable
33  * plugin.xml or pluginoverrides.xml files for extending functionality from
34  * the core of OpenEdit.
35  * </p>
36  * <p>
37  * This implementation uses a simple Spring BeanFactory to manage the beans.
38  * </p>
39  * @see com.openedit.WebServer
40  * @author cburkey
41  *
42  */

43 public class BaseWebServer implements WebServer
44 {
45     private static final Log log = LogFactory.getLog(WebServer.class);
46     protected DefaultListableBeanFactory fieldBeanFactory;
47     protected File JavaDoc fieldRootDirectory;
48     
49     public ConfigurableListableBeanFactory getBeanFactory()
50     {
51         if ( fieldBeanFactory == null )
52         {
53             synchronized( this ) //the reason for this is when spring is configured it may cause the scheduler to call getBeanFactory() in another thread
54
{ //We put the synchronized at this level to speed up the loading of web pages
55
if ( fieldBeanFactory == null )
56                 {
57                     InputStreamResource resource = new InputStreamResource(getClass().getClassLoader().getResourceAsStream("openedit.xml"), "openedit.xml");
58                     XmlBeanFactory xmlbeans = new XmlBeanFactory( resource );
59                     xmlbeans.setAllowBeanDefinitionOverriding(true);
60                     xmlbeans.destroySingletons();
61                     xmlbeans.registerSingleton("WebServer",this);
62                     fieldBeanFactory = xmlbeans;
63                 }
64             }
65         }
66         return fieldBeanFactory;
67     }
68     public synchronized void initialize()
69     {
70         if ( getRootDirectory() == null)
71         {
72             String JavaDoc path = System.getProperty("oe.root.path");
73             setRootDirectory(new File JavaDoc(path));
74         }
75         if ( getRootDirectory() == null)
76         {
77             throw new IllegalStateException JavaDoc("Root directory is not defined");
78         }
79         //TODO: Look for duplicate openedit jars and try to delete them
80

81         try
82         {
83             Enumeration JavaDoc pluginDefs = getClass().getClassLoader().getResources( "plugin.xml" ); //This locks jar files on Windows
84
while( pluginDefs.hasMoreElements() )
85             {
86                 URL JavaDoc url = (URL JavaDoc) pluginDefs.nextElement();
87                 loadPluginDefs( url.openStream() );
88             }
89         } catch ( IOException JavaDoc ex)
90         {
91             throw new OpenEditRuntimeException(ex);
92         }
93
94         
95 // JarReader reader = new JarReader() //This is for Windows since it locks files. Did not seem to fix the problem
96
// {
97
// //Call back
98
// public void processFile( File inFile)
99
// {
100
// loadPluginDefs( inFile );
101
// }
102
// };
103
// reader.processInClasspath("plugin.xml");
104
// File lib = new File( getRootDirectory(),"WEB-INF/lib");
105
// reader.processInLibDir(lib,"plugin.xml");
106

107         overridePlugIns();
108         
109         Thread JavaDoc sh = new Thread JavaDoc( new Runnable JavaDoc() //This is in case the JVM is shut down
110
{
111             public void run()
112             {
113                 try
114                 {
115                     getOpenEditEngine().shutdown();
116                 }
117                 catch (Throwable JavaDoc ex)
118                 {
119                     ex.printStackTrace();
120                 }
121             }
122         });
123         Runtime.getRuntime().addShutdownHook(sh);
124
125     }
126     protected void loadPluginDefs(File JavaDoc inFile)
127     {
128         try
129         {
130             loadPluginDefs(new FileInputStream JavaDoc( inFile));
131         }
132         catch( IOException JavaDoc ex)
133         {
134             throw new OpenEditRuntimeException( ex);
135         }
136     }
137     
138     protected void loadPluginDefs( InputStream JavaDoc inputStream )
139     {
140         try
141         {
142             XmlBeanFactory factory = new XmlBeanFactory( new InputStreamResource( inputStream ), getBeanFactory() );
143             String JavaDoc[] names = factory.getBeanDefinitionNames();
144             for (int i = 0; i < names.length; i++)
145             {
146                 BeanDefinition def = factory.getBeanDefinition(names[i]);
147                 fieldBeanFactory.registerBeanDefinition(names[i],def);
148             }
149         }
150         finally
151         {
152             FileUtils.safeClose(inputStream);
153         }
154     }
155     public void overridePlugIns()
156     {
157         try
158         {
159             File JavaDoc overrideFile = new File JavaDoc( getRootDirectory(), "WEB-INF/pluginoverrides.xml" );
160             if ( overrideFile.exists() )
161             {
162                 loadPluginDefs( overrideFile );
163             }
164
165             //I am not sure what this does.
166
PropertyPlaceholderConfigurer configurator = new PropertyPlaceholderConfigurer();
167             configurator.postProcessBeanFactory( getBeanFactory() );
168
169             // instantiate a scheduler bean, if one exists
170
final String JavaDoc SCHEDULER_BEAN = "Scheduler";
171             if (getBeanFactory().containsBean(SCHEDULER_BEAN))
172             {
173                 SchedulerModule bean = (SchedulerModule)getModuleManager().getModule(SCHEDULER_BEAN);
174                 if ( bean != null)
175                 {
176                     bean.setClassLoader(Thread.currentThread().getContextClassLoader());
177                 }
178                 log.info("Loaded scheduler");
179             }
180         } catch ( Exception JavaDoc ex )
181         {
182             throw new OpenEditRuntimeException(ex);
183         }
184         
185     }
186     
187     /**
188      * @see com.openedit.WebServer#getPageManager()
189      */

190     public PageManager getPageManager()
191     {
192         return (PageManager)getBeanFactory().getBean( "pageManager" );
193     }
194
195     /**
196      * @see com.openedit.WebServer#getUserManager()
197      */

198     public UserManager getUserManager()
199     {
200         return (UserManager)getBeanFactory().getBean( "userManager" );
201     }
202
203     
204     /**
205      * @see com.openedit.WebServer#getModuleManager()
206      */

207     public ModuleManager getModuleManager()
208     {
209         return (ModuleManager) getBeanFactory().getBean( "moduleManager" );
210     }
211
212     /**
213      * @see com.openedit.WebServer#getOpenEditEngine()
214      */

215     public OpenEditEngine getOpenEditEngine()
216     {
217         return (OpenEditEngine)getBeanFactory().getBean("OpenEditEngine");
218     }
219
220     /**
221      * @see com.openedit.WebServer#getRootDirectory()
222      */

223     public File JavaDoc getRootDirectory()
224     {
225         return fieldRootDirectory;
226     }
227     public void setRootDirectory(File JavaDoc inRoot)
228     {
229         System.setProperty( "oe.root.path", inRoot.getAbsolutePath() );
230         fieldRootDirectory = inRoot;
231     }
232 }
233
Popular Tags