View Javadoc

1   package com.eyeq.pivot4j.pentaho.ui;
2   
3   import java.io.IOException;
4   import java.util.Map;
5   import java.util.ResourceBundle;
6   
7   import javax.faces.application.FacesMessage;
8   import javax.faces.application.NavigationHandler;
9   import javax.faces.bean.ManagedBean;
10  import javax.faces.bean.ManagedProperty;
11  import javax.faces.bean.SessionScoped;
12  import javax.faces.context.ExternalContext;
13  import javax.faces.context.FacesContext;
14  import javax.servlet.http.HttpServletRequest;
15  
16  import org.apache.commons.configuration.ConfigurationException;
17  import org.pentaho.platform.api.engine.PentahoAccessControlException;
18  import org.pentaho.platform.api.repository2.unified.RepositoryFile;
19  import org.slf4j.Logger;
20  import org.slf4j.LoggerFactory;
21  
22  import com.eyeq.pivot4j.analytics.datasource.DataSourceManager;
23  import com.eyeq.pivot4j.analytics.repository.DataSourceNotFoundException;
24  import com.eyeq.pivot4j.analytics.repository.ReportContent;
25  import com.eyeq.pivot4j.analytics.repository.ReportFile;
26  import com.eyeq.pivot4j.analytics.state.ViewState;
27  import com.eyeq.pivot4j.analytics.state.ViewStateHolder;
28  import com.eyeq.pivot4j.pentaho.repository.PentahoReportFile;
29  import com.eyeq.pivot4j.pentaho.repository.PentahoReportRepository;
30  
31  @ManagedBean(name = "pentahoFileHandler")
32  @SessionScoped
33  public class PentahoFileHandler {
34  
35  	@ManagedProperty(value = "#{viewStateHolder}")
36  	private ViewStateHolder viewStateHolder;
37  
38  	@ManagedProperty(value = "#{dataSourceManager}")
39  	private DataSourceManager dataSourceManager;
40  
41  	@ManagedProperty(value = "#{reportRepository}")
42  	private PentahoReportRepository reportRepository;
43  
44  	public void load() throws IOException, ClassNotFoundException,
45  			ConfigurationException, DataSourceNotFoundException {
46  		FacesContext context = FacesContext.getCurrentInstance();
47  		ExternalContext externalContext = context.getExternalContext();
48  
49  		Map<String, String> parameters = externalContext
50  				.getRequestParameterMap();
51  
52  		String viewId = parameters.get("ts");
53  		String editable = parameters.get("editable");
54  
55  		HttpServletRequest request = (HttpServletRequest) context
56  				.getExternalContext().getRequest();
57  
58  		RepositoryFile file = (RepositoryFile) request.getAttribute("file");
59  
60  		ViewState state;
61  
62  		if (file == null) {
63  			state = viewStateHolder.getState(viewId);
64  		} else {
65  			state = load(viewId, file);
66  
67  			if (state != null) {
68  				state.setReadOnly("false".equalsIgnoreCase(editable));
69  				viewStateHolder.registerState(state);
70  			}
71  		}
72  
73  		if (state != null) {
74  			NavigationHandler navigationHandler = context.getApplication()
75  					.getNavigationHandler();
76  			navigationHandler.handleNavigation(context, null,
77  					"view?faces-redirect=true&ts=" + state.getId());
78  		}
79  	}
80  
81  	/**
82  	 * @param viewId
83  	 * @param file
84  	 * @return
85  	 * @throws IOException
86  	 * @throws ClassNotFoundException
87  	 * @throws ConfigurationException
88  	 * @throws DataSourceNotFoundException
89  	 */
90  	public ViewState load(String viewId, RepositoryFile file)
91  			throws IOException, ClassNotFoundException, ConfigurationException,
92  			DataSourceNotFoundException {
93  		Logger logger = LoggerFactory.getLogger(getClass());
94  		if (logger.isInfoEnabled()) {
95  			logger.info("Saving report content to repository :");
96  			logger.info("	- viewId : " + viewId);
97  			logger.info("	- path : " + file.getPath());
98  			logger.info("	- fileName : " + file.getName());
99  		}
100 
101 		ReportFile report = reportRepository.getFile(file.getPath());
102 		ReportContent content = reportRepository.getReportContent(report);
103 
104 		ViewState state;
105 
106 		if (viewId == null) {
107 			state = viewStateHolder.createNewState();
108 			state.setName(file.getTitle());
109 		} else {
110 			state = new ViewState(viewId, file.getTitle());
111 		}
112 
113 		content.read(state, dataSourceManager);
114 
115 		return state;
116 	}
117 
118 	/**
119 	 * @throws PentahoAccessControlException
120 	 * @throws IOException
121 	 * @throws ConfigurationException
122 	 */
123 	public void save() throws PentahoAccessControlException, IOException,
124 			ConfigurationException {
125 		FacesContext context = FacesContext.getCurrentInstance();
126 
127 		Map<String, String> parameters = context.getExternalContext()
128 				.getRequestParameterMap();
129 		String viewId = parameters.get("viewId");
130 
131 		String extension = "." + PentahoReportFile.DEFAULT_EXTENSION;
132 
133 		String fileName = parameters.get("fileName");
134 		if (!fileName.endsWith(extension)) {
135 			fileName += extension;
136 		}
137 
138 		String path = parameters.get("path");
139 
140 		if (path.endsWith(fileName)) {
141 			path = path.substring(0, path.length() - fileName.length() - 1);
142 		}
143 
144 		if (!path.endsWith(RepositoryFile.SEPARATOR)) {
145 			path += RepositoryFile.SEPARATOR;
146 		}
147 
148 		boolean overwrite = Boolean.parseBoolean(parameters.get("overwrite"));
149 
150 		save(viewId, path, fileName, overwrite);
151 	}
152 
153 	/**
154 	 * @param viewId
155 	 * @param path
156 	 * @param fileName
157 	 * @param overwrite
158 	 * @throws PentahoAccessControlException
159 	 * @throws IOException
160 	 * @throws ConfigurationException
161 	 */
162 	public void save(String viewId, String path, String fileName,
163 			boolean overwrite) throws PentahoAccessControlException,
164 			IOException, ConfigurationException {
165 		Logger logger = LoggerFactory.getLogger(getClass());
166 		if (logger.isInfoEnabled()) {
167 			logger.info("Saving report content to repository :");
168 			logger.info("	- viewId : " + viewId);
169 			logger.info("	- path : " + path);
170 			logger.info("	- fileName : " + fileName);
171 			logger.info("	- overwrite : " + overwrite);
172 		}
173 
174 		ViewState state = viewStateHolder.getState(viewId);
175 
176 		ReportContent content = new ReportContent(state);
177 
178 		String filePath = path + fileName;
179 
180 		ReportFile file = reportRepository.getFile(filePath);
181 
182 		if (file == null) {
183 			ReportFile parent = reportRepository.getFile(path);
184 			file = reportRepository.createFile(parent, fileName, content,
185 					overwrite);
186 		} else {
187 			reportRepository.setReportContent(file, content);
188 		}
189 
190 		FacesContext context = FacesContext.getCurrentInstance();
191 		ResourceBundle bundle = context.getApplication().getResourceBundle(
192 				context, "msg");
193 
194 		String title = bundle.getString("message.save.report.title");
195 		String message = bundle.getString("message.saveAs.report.message")
196 				+ file.getPath();
197 
198 		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
199 				title, message));
200 	}
201 
202 	/**
203 	 * @return the viewStateHolder
204 	 */
205 	public ViewStateHolder getViewStateHolder() {
206 		return viewStateHolder;
207 	}
208 
209 	/**
210 	 * @param viewStateHolder
211 	 *            the viewStateHolder to set
212 	 */
213 	public void setViewStateHolder(ViewStateHolder viewStateHolder) {
214 		this.viewStateHolder = viewStateHolder;
215 	}
216 
217 	/**
218 	 * @return the dataSourceManager
219 	 */
220 	public DataSourceManager getDataSourceManager() {
221 		return dataSourceManager;
222 	}
223 
224 	/**
225 	 * @param dataSourceManager
226 	 *            the dataSourceManager to set
227 	 */
228 	public void setDataSourceManager(DataSourceManager dataSourceManager) {
229 		this.dataSourceManager = dataSourceManager;
230 	}
231 
232 	/**
233 	 * @return the reportRepository
234 	 */
235 	public PentahoReportRepository getReportRepository() {
236 		return reportRepository;
237 	}
238 
239 	/**
240 	 * @param reportRepository
241 	 *            the reportRepository to set
242 	 */
243 	public void setReportRepository(PentahoReportRepository reportRepository) {
244 		this.reportRepository = reportRepository;
245 	}
246 }