DetailsActivity: Check for authentication here too.
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / server / OnlineGlomServiceImpl.java
1 /*
2  * Copyright (C) 2010, 2011 Openismus GmbH
3  *
4  * This file is part of GWT-Glom.
5  *
6  * GWT-Glom is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation, either version 3 of the License, or (at your
9  * option) any later version.
10  *
11  * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
14  * for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with GWT-Glom.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package org.glom.web.server;
21
22 import java.sql.Connection;
23 import java.sql.SQLException;
24 import java.util.ArrayList;
25
26 import javax.servlet.ServletException;
27
28 import org.apache.commons.lang3.StringUtils;
29 import org.glom.web.client.OnlineGlomService;
30 import org.glom.web.server.libglom.Document;
31 import org.glom.web.shared.DataItem;
32 import org.glom.web.shared.DetailsLayoutAndData;
33 import org.glom.web.shared.DocumentInfo;
34 import org.glom.web.shared.Documents;
35 import org.glom.web.shared.NavigationRecord;
36 import org.glom.web.shared.Reports;
37 import org.glom.web.shared.TypedDataItem;
38 import org.glom.web.shared.libglom.Report;
39 import org.glom.web.shared.libglom.layout.LayoutGroup;
40 import org.glom.web.shared.libglom.layout.LayoutItemPortal;
41
42 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
43
44 /**
45  * This is the servlet class for setting up the server side of Online Glom. The client side can call the public methods
46  * in this class via OnlineGlom
47  * 
48  * For instance, it loads all the available documents and provide a list - see getDocuments(). It then provides
49  * information from each document. For instance, see getListViewLayout().
50  * 
51  * TODO: Watch for changes to the .glom files, to reload new versions and to load newly-added files. TODO: Watch for
52  * changes to the properties (configuration)?
53  */
54 @SuppressWarnings("serial")
55 public class OnlineGlomServiceImpl extends RemoteServiceServlet implements OnlineGlomService {
56
57         ConfiguredDocumentSet configuredDocumentSet = new ConfiguredDocumentSet();
58
59         /*
60          * (non-Javadoc)
61          * 
62          * @see org.glom.web.client.OnlineGlomService#checkAuthentication(java.lang.String, java.lang.String,
63          * java.lang.String)
64          */
65         @Override
66         public boolean checkAuthentication(final String documentID, final String username, final String password) {
67                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
68                 if (configuredDoc == null) {
69                         Log.error(documentID, "The document could not be found for this ID: " + documentID);
70                         return false;
71                 }
72
73                 try {
74                         return configuredDoc.setUsernameAndPassword(username, password);
75                 } catch (final SQLException e) {
76                         Log.error(documentID, "Unknown SQL Error checking the database authentication.", e);
77                         return false;
78                 }
79         }
80
81         /*
82          * This is called when the servlet is stopped or restarted.
83          * 
84          * @see javax.servlet.GenericServlet#destroy()
85          */
86         @Override
87         public void destroy() {
88                 configuredDocumentSet.forgetDocuments();
89         }
90
91         /*
92          * (non-Javadoc)
93          * 
94          * @see org.glom.web.client.OnlineGlomService#getConfigurationErrorMessage()
95          */
96         @Override
97         public String getConfigurationErrorMessage() {
98                 Exception configurationException = configuredDocumentSet.getConfigurationException();
99                 if (configurationException == null) {
100                         return "No configuration errors to report.";
101                 } else if (configurationException.getMessage() == null) {
102                         return configurationException.toString();
103                 } else {
104                         return configurationException.getMessage();
105                 }
106         }
107
108         /*
109          * (non-Javadoc)
110          * 
111          * @see org.glom.web.client.OnlineGlomService#getDetailsData(java.lang.String, java.lang.String, java.lang.String)
112          */
113         @Override
114         public DataItem[] getDetailsData(final String documentID, final String tableName,
115                         final TypedDataItem primaryKeyValue) {
116                 // An empty tableName is OK, because that means the default table.
117
118                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
119                 if (configuredDoc == null) {
120                         return new DataItem[0];
121                 }
122
123                 // FIXME check for authentication
124
125                 return configuredDoc.getDetailsData(tableName, primaryKeyValue);
126         }
127
128         /*
129          * (non-Javadoc)
130          * 
131          * @see org.glom.web.client.OnlineGlomService#getDetailsLayoutAndData(java.lang.String, java.lang.String,
132          * java.lang.String)
133          */
134         @Override
135         public DetailsLayoutAndData getDetailsLayoutAndData(final String documentID, final String tableName,
136                         final TypedDataItem primaryKeyValue, final String localeID) {
137                 // An empty tableName is OK, because that means the default table.
138
139                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
140                 if (configuredDoc == null) {
141                         return null;
142                 }
143
144                 // FIXME check for authentication
145
146                 final DetailsLayoutAndData initalDetailsView = new DetailsLayoutAndData();
147                 initalDetailsView
148                                 .setLayout(configuredDoc.getDetailsLayoutGroup(tableName, StringUtils.defaultString(localeID)));
149                 initalDetailsView.setData(configuredDoc.getDetailsData(tableName, primaryKeyValue));
150
151                 return initalDetailsView;
152         }
153
154         /*
155          * (non-Javadoc)
156          * 
157          * @see org.glom.web.client.OnlineGlomService#getDocumentInfo(java.lang.String)
158          */
159         @Override
160         public DocumentInfo getDocumentInfo(final String documentID, final String localeID) {
161
162                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
163
164                 // Avoid dereferencing a null object:
165                 if (configuredDoc == null) {
166                         return new DocumentInfo();
167                 }
168
169                 // FIXME check for authentication
170
171                 return configuredDoc.getDocumentInfo(StringUtils.defaultString(localeID));
172
173         }
174
175         /*
176          * (non-Javadoc)
177          * 
178          * @see org.glom.web.client.OnlineGlomService#getDocuments()
179          */
180         @Override
181         public Documents getDocuments() {
182                 return configuredDocumentSet.getDocuments();
183         }
184
185         /*
186          * (non-Javadoc)
187          * 
188          * @see org.glom.web.client.OnlineGlomService#getListViewData(java.lang.String, java.lang.String, int, int, int,
189          * boolean)
190          */
191         @Override
192         public ArrayList<DataItem[]> getListViewData(final String documentID, final String tableName,
193                         final String quickFind, final int start, final int length, final int sortColumnIndex,
194                         final boolean isAscending) {
195                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
196                 if (configuredDoc == null) {
197                         return new ArrayList<DataItem[]>();
198                 }
199
200                 if (!configuredDoc.isAuthenticated()) {
201                         return new ArrayList<DataItem[]>();
202                 }
203                 return configuredDoc.getListViewData(tableName, quickFind, start, length, true, sortColumnIndex, isAscending);
204         }
205
206         /*
207          * (non-Javadoc)
208          * 
209          * @see org.glom.web.client.OnlineGlomService#getListViewLayout(java.lang.String, java.lang.String)
210          */
211         @Override
212         public LayoutGroup getListViewLayout(final String documentID, final String tableName, final String localeID) {
213                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
214                 if (configuredDoc == null) {
215                         return new LayoutGroup();
216                 }
217
218                 // FIXME check for authentication
219
220                 return configuredDoc.getListViewLayoutGroup(tableName, StringUtils.defaultString(localeID));
221         }
222
223         /*
224          * (non-Javadoc)
225          * 
226          * @see org.glom.web.client.OnlineGlomService#getRelatedListData(java.lang.String, java.lang.String, int, int, int,
227          * boolean)
228          */
229         @Override
230         public ArrayList<DataItem[]> getRelatedListData(final String documentID, final String tableName,
231                         final LayoutItemPortal portal, final TypedDataItem foreignKeyValue, final int start, final int length,
232                         final int sortColumnIndex, final boolean ascending) {
233                 // An empty tableName is OK, because that means the default table.
234
235                 if (portal == null) {
236                         Log.error("getRelatedListData(): portal is null.");
237                         return null;
238                 }
239
240                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
241                 if (configuredDoc == null) {
242                         return new ArrayList<DataItem[]>();
243                 }
244
245                 // FIXME check for authentication
246
247                 return configuredDoc.getRelatedListData(tableName, portal, foreignKeyValue, start, length, sortColumnIndex,
248                                 ascending);
249         }
250
251         @Override
252         public int getRelatedListRowCount(final String documentID, final String tableName, final LayoutItemPortal portal,
253                         final TypedDataItem foreignKeyValue) {
254                 // An empty tableName is OK, because that means the default table.
255
256                 if (portal == null) {
257                         Log.error("getRelatedListRowCount(): portal is null");
258                         return 0;
259                 }
260
261                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
262                 if (configuredDoc == null) {
263                         return 0;
264                 }
265
266                 // FIXME check for authentication
267
268                 return configuredDoc.getRelatedListRowCount(tableName, portal, foreignKeyValue);
269         }
270
271         // TODO: Specify the foundset (via a where clause) and maybe a default sort order.
272         /*
273          * (non-Javadoc)
274          * 
275          * @see org.glom.web.client.OnlineGlomService#getReportLayout(java.lang.String, java.lang.String, java.lang.String,
276          * java.lang.String)
277          */
278         @Override
279         public String getReportHTML(final String documentID, final String tableName, final String reportName,
280                         final String quickFind, final String localeID) {
281                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
282                 if (configuredDoc == null) {
283                         return "";
284                 }
285
286                 final Document glomDocument = configuredDoc.getDocument();
287                 if (glomDocument == null) {
288                         final String errorMessage = "getReportHTML(): getDocument() failed.";
289                         Log.fatal(errorMessage);
290                         // TODO: throw new Exception(errorMessage);
291                         return "";
292                 }
293
294                 // FIXME check for authentication
295
296                 final Report report = glomDocument.getReport(tableName, reportName);
297                 if (report == null) {
298                         Log.info(documentID, tableName, "The report layout is not defined for this table:" + reportName);
299                         return "";
300                 }
301
302                 Connection connection;
303                 try {
304                         connection = configuredDoc.getCpds().getConnection();
305                 } catch (final SQLException e2) {
306                         // TODO Auto-generated catch block
307                         e2.printStackTrace();
308                         return "Connection Failed";
309                 }
310
311                 // TODO: Use quickFind
312                 final ReportGenerator generator = new ReportGenerator(StringUtils.defaultString(localeID));
313                 return generator.generateReport(glomDocument, tableName, report, connection, quickFind);
314         }
315
316         /*
317          * (non-Javadoc)
318          * 
319          * @see org.glom.web.client.OnlineGlomService#getReportsList(java.lang.String, java.lang.String, java.lang.String)
320          */
321         @Override
322         public Reports getReportsList(final String documentID, final String tableName, final String localeID) {
323                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
324                 return configuredDoc.getReports(tableName, localeID);
325         }
326
327         // TODO: It would be more efficient to get the extra related (or related related) column value along with the other
328         // values,
329         // instead of doing a separate SQL query to get it now for a specific row.
330         /*
331          * (non-Javadoc)
332          * 
333          * @see org.glom.web.client.OnlineGlomService#getSuitableRecordToViewDetails(java.lang.String, java.lang.String,
334          * java.lang.String, java.lang.String)
335          */
336         @Override
337         public NavigationRecord getSuitableRecordToViewDetails(final String documentID, final String tableName,
338                         final LayoutItemPortal portal, final TypedDataItem primaryKeyValue) {
339                 // An empty tableName is OK, because that means the default table.
340
341                 if (portal == null) {
342                         Log.error("getSuitableRecordToViewDetails(): portal is null");
343                         return null;
344                 }
345
346                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
347                 if (configuredDoc == null) {
348                         return null;
349                 }
350
351                 // FIXME check for authentication
352
353                 return configuredDoc.getSuitableRecordToViewDetails(tableName, portal, primaryKeyValue);
354         }
355
356         /*
357          * This is called when the servlet is started or restarted.
358          * 
359          * (non-Javadoc)
360          * 
361          * @see javax.servlet.GenericServlet#init()
362          */
363         @Override
364         public void init() throws ServletException {
365                 configuredDocumentSet.readConfiguration();
366         }
367
368         /*
369          * (non-Javadoc)
370          * 
371          * @see org.glom.web.client.OnlineGlomService#isAuthenticated(java.lang.String)
372          */
373         @Override
374         public boolean isAuthenticated(final String documentID) {
375                 final ConfiguredDocument configuredDoc = configuredDocumentSet.getDocument(documentID);
376                 if (configuredDoc == null) {
377                         return false;
378                 }
379
380                 return configuredDoc.isAuthenticated();
381         }
382
383 }