View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  
16  package org.kuali.student.common.test.spring;
17  
18  import java.io.BufferedReader;
19  import java.io.File;
20  import java.io.FileReader;
21  import java.util.List;
22  import java.util.Map;
23  
24  import javax.persistence.EntityManager;
25  import javax.persistence.PersistenceContext;
26  import javax.persistence.PersistenceException;
27  
28  import org.apache.commons.lang.StringUtils;
29  import org.apache.commons.logging.Log;
30  import org.apache.commons.logging.LogFactory;
31  import org.springframework.context.ApplicationContext;
32  import org.springframework.context.ApplicationContextAware;
33  import org.springframework.context.support.FileSystemXmlApplicationContext;
34  import org.springframework.core.io.ClassPathResource;
35  import org.springframework.transaction.annotation.Transactional;
36  
37  @Transactional
38  public class LoadDataBean implements ApplicationContextAware{
39  	private static final Log LOG = LogFactory.getLog(LoadDataBean.class);
40  
41  
42  
43  	@PersistenceContext
44  	EntityManager em;
45  	private boolean loaded = false;
46  	private String daoAnnotations;
47  
48  	private ApplicationContext applicationContext;
49  
50  	public void loadData(){
51  		if (daoAnnotations == null || loaded || daoAnnotations.trim().isEmpty()) {
52  			return;
53  		}
54  
55  		// Load all the beans
56  		String[] classes = daoAnnotations.split(",");
57  		for (String line : classes) {
58  			try {
59  				String[] split = line.split("\\|");
60  
61  				// Invoke the data loader for this dao
62                  invokeDataLoader(split[0]);
63  
64                  // Load data bean file for this dao
65                  if (split.length > 1&& !split[1].isEmpty()) {
66  				    String testDataFile = split[1];
67  
68  					ApplicationContext ac = new FileSystemXmlApplicationContext(
69  							testDataFile);
70  					for (Object bean : (List<?>) ac.getBean("persistList")) {
71  						if(!em.contains(bean)){
72  							em.persist(bean);
73  						}
74  					}
75  				}
76                  // Load sql file for this dao
77                  if (split.length > 2&& !split[2].isEmpty()) {
78  
79  					String testDataFile = split[2];
80  				    File sqlFile;
81  				    if(testDataFile.startsWith("classpath:")){
82  				 	   sqlFile = new ClassPathResource(testDataFile.substring("classpath:".length())).getFile();
83  				    }else{
84  				    	sqlFile = new File(testDataFile);
85  				    }
86  					BufferedReader in
87  					   = new BufferedReader(new FileReader(sqlFile));
88  					try {
89      					String ln = "";
90      					int lnNr = 0;
91  
92      					try {
93                              while((ln=in.readLine())!=null){
94                                  lnNr++;
95                              	if(!ln.startsWith("/")&&!ln.startsWith("--")&&StringUtils.isNotBlank(ln)){
96                              		ln=ln.replaceFirst("[;/]\\s*$","");
97                              		em.createNativeQuery(ln).executeUpdate();
98                              	}
99                              }
100                         } catch (PersistenceException e) {
101                             LOG.error("Failed statement at line " + lnNr + ": " + ln);
102                             throw e;
103                         }
104 					} finally {
105 					    in.close();
106 					}
107 				}
108 
109 			} catch (Exception e) {
110 				throw new RuntimeException(e);
111 			}
112 		}
113 
114 		loaded = true;
115 
116 	}
117 
118 	protected void invokeDataLoader(String dao){
119 	    try {
120             //Check if there is a loader class for this dao
121 	        Class<?> daoType = Class.forName(dao).getInterfaces()[0];
122 
123 	        Class<?> clazz = Class.forName(daoType.getName() + "Loader");
124             DaoLoader daoLoader = (DaoLoader)clazz.newInstance();
125 
126             //Get spring bean for the dao
127             Map<?,?> daoBeans = applicationContext.getBeansOfType(daoType);
128 
129             //Invoke the loader for this doa bean (there shouldn't be more than one)
130             if (daoBeans.size() == 1){
131                 daoLoader.setDao(daoBeans.values().iterator().next());
132                 daoLoader.run();
133             }
134 
135 	    } catch (ClassNotFoundException cnfe) {
136 	    	LOG.info(cnfe);
137 	    } catch (Exception e) {
138             LOG.error(e);
139         }
140 	}
141 
142 	/**
143 	 * @return the daoAnnotations
144 	 */
145 	public String getDaoAnnotations() {
146 		return daoAnnotations;
147 	}
148 
149 	/**
150 	 * @param daoAnnotations
151 	 *            the daoAnnotations to set
152 	 */
153 	public void setDaoAnnotations(String daoAnnotations) {
154 		this.daoAnnotations = daoAnnotations;
155 	}
156 
157 	public void setApplicationContext(ApplicationContext applicationContext){
158 	    this.applicationContext = applicationContext;
159 	}
160 }