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
83
84
85
86
87
88
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
120
121
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
155
156
157
158
159
160
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
204
205 public ViewStateHolder getViewStateHolder() {
206 return viewStateHolder;
207 }
208
209
210
211
212
213 public void setViewStateHolder(ViewStateHolder viewStateHolder) {
214 this.viewStateHolder = viewStateHolder;
215 }
216
217
218
219
220 public DataSourceManager getDataSourceManager() {
221 return dataSourceManager;
222 }
223
224
225
226
227
228 public void setDataSourceManager(DataSourceManager dataSourceManager) {
229 this.dataSourceManager = dataSourceManager;
230 }
231
232
233
234
235 public PentahoReportRepository getReportRepository() {
236 return reportRepository;
237 }
238
239
240
241
242
243 public void setReportRepository(PentahoReportRepository reportRepository) {
244 this.reportRepository = reportRepository;
245 }
246 }