View Javadoc

1   package org.marketchangers.pico;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   import java.util.Properties;
6   
7   import javax.naming.InitialContext;
8   import javax.naming.NamingException;
9   import javax.servlet.ServletContext;
10  
11  import net.sf.hibernate.HibernateException;
12  import net.sf.hibernate.MappingException;
13  import net.sf.hibernate.cfg.Configuration;
14  import net.sf.hibernate.cfg.Environment;
15  import net.sf.hibernate.dialect.HSQLDialect;
16  
17  import org.apache.lucene.analysis.standard.StandardAnalyzer;
18  import org.apache.lucene.store.RAMDirectory;
19  import org.marketchangers.ServiceLocator;
20  import org.marketchangers.defaults.SimpleEnvironment;
21  import org.marketchangers.liferay.LiferayUserManager;
22  import org.marketchangers.prayer.PrayerCategory;
23  import org.marketchangers.prayer.PrayerComment;
24  import org.marketchangers.prayer.PrayerRequest;
25  import org.marketchangers.prayer.PrayerRequestSearcher;
26  import org.marketchangers.prayer.UserContract;
27  import org.marketchangers.prayer.hibernate.HibernatePrayerRequestManager;
28  import org.marketchangers.prayer.lucene.DefaultIndexProvider;
29  import org.marketchangers.prayer.lucene.LucenePrayerRequestSearcher;
30  import org.nanocontainer.concurrent.ThreadLocalComponentAdapter;
31  import org.nanocontainer.ejb.EJBClientComponentAdapter;
32  import org.nanocontainer.hibernate.LifecycleSessionProvider;
33  import org.nanocontainer.hibernate.SessionFactoryComponentAdapter;
34  import org.nanocontainer.hibernate.SessionProvider;
35  import org.nanocontainer.integrationkit.ContainerComposer;
36  import org.picocontainer.MutablePicoContainer;
37  import org.picocontainer.PicoContainer;
38  import org.picocontainer.defaults.ConstructorInjectionComponentAdapter;
39  
40  import com.liferay.portal.ejb.RoleManagerHome;
41  import com.liferay.portal.ejb.RoleManagerHomeUtil;
42  import com.liferay.portal.ejb.UserRemoteManagerHome;
43  import com.liferay.portal.ejb.UserRemoteManagerHomeUtil;
44  
45  /***
46   * @author <a href="mailto:mtodd@wc-group.com">Matthew Todd</a>
47   */
48  public class PicoContainerComposer implements ContainerComposer {
49  	private InitialContext jndiContext;
50  
51  	public PicoContainerComposer() throws HibernateException, NamingException {
52  		jndiContext = new InitialContext();
53  	}
54  
55  	// -------------------------------------------------- ContainerComposer API
56  	public void composeContainer(MutablePicoContainer pico, Object scope) {
57  		if (scope instanceof ServletContext) {
58              // Service Locator
59              ServletContext context = (ServletContext) scope;
60              context.setAttribute(ServiceLocator.KEY, new PicoServiceLocator(pico));
61  
62              // Environment
63              pico.registerComponentImplementation(SimpleEnvironment.class);
64  
65              // Liferay
66  			pico.registerComponentImplementation(LiferayUserManager.class);
67  			pico.registerComponent(new EJBClientComponentAdapter(UserRemoteManagerHomeUtil.NAME, UserRemoteManagerHome.class, jndiContext));
68  			pico.registerComponent(new EJBClientComponentAdapter(RoleManagerHomeUtil.NAME, RoleManagerHome.class, jndiContext));
69  
70              // Hibernate
71              pico.registerComponentImplementation(HibernatePrayerRequestManager.class);
72  			pico.registerComponent(new ThreadLocalComponentAdapter(new ConstructorInjectionComponentAdapter(LifecycleSessionProvider.class, LifecycleSessionProvider.class)));
73  			pico.registerComponent(new SessionFactoryComponentAdapter());
74  			pico.registerComponentInstance(getHibernateConfiguration(Thread.currentThread().getContextClassLoader().getResourceAsStream("marketchangers-hibernate.properties")));
75  
76              // Lucene
77  			pico.registerComponentImplementation(LucenePrayerRequestSearcher.class);
78  			pico.registerComponentImplementation(DefaultIndexProvider.class);
79  			// TODO figure out the proper analyzer to use
80  			pico.registerComponentImplementation(StandardAnalyzer.class);
81  			pico.registerComponentImplementation(RAMDirectory.class);
82  			indexPrayerRequests(pico);
83  		}
84  	}
85  
86  	// -------------------------------------------------- Other Private Methods
87  	private Configuration getHibernateConfiguration(InputStream values) {
88  		Properties p = new Properties();
89  		p.setProperty(Environment.DATASOURCE, "java:marketChangersDS");
90  		p.setProperty(Environment.DIALECT, HSQLDialect.class.getName());
91  		p.setProperty(Environment.HBM2DDL_AUTO, "update");
92          
93          if (values != null) {
94              try {
95                  p.load(values);
96              } catch (IOException ioe) {
97                  throw new RuntimeException(ioe);
98              }
99          }
100 
101         Configuration config = new Configuration();
102 		config.setProperties(p);
103 
104 		try {
105 			config.addClass(PrayerRequest.class);
106 			config.addClass(PrayerComment.class);
107 			config.addClass(PrayerCategory.class);
108 			config.addClass(UserContract.class);
109 		} catch (MappingException me) {
110 			throw new RuntimeException(me);
111 		}
112 
113 		return config;
114 	}
115 
116 	private void indexPrayerRequests(PicoContainer pico) {
117         PrayerRequestSearcher searcher =
118             (PrayerRequestSearcher) pico.getComponentInstanceOfType(
119                 PrayerRequestSearcher.class);
120 
121         SessionProvider sessionProvider =
122             (SessionProvider) pico.getComponentInstanceOfType(
123                 SessionProvider.class);
124 
125         try {
126             searcher.index(sessionProvider.getSession().find("from PrayerRequest"));
127             sessionProvider.close();
128         } catch (HibernateException he) {
129             throw new RuntimeException(he);
130         }
131 	}
132 }