DetailsActivity: Check for authentication here too.
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / server / database / ListViewDBAccess.java
1 /*
2  * Copyright (C) 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.database;
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import org.apache.commons.lang3.StringUtils;
26 import org.glom.web.server.SqlUtils;
27 import org.glom.web.server.libglom.Document;
28 import org.glom.web.shared.DataItem;
29 import org.glom.web.shared.TypedDataItem;
30 import org.glom.web.shared.libglom.Field;
31 import org.glom.web.shared.libglom.layout.LayoutGroup;
32 import org.glom.web.shared.libglom.layout.LayoutItemField;
33 import org.glom.web.shared.libglom.layout.SortClause;
34 import org.jooq.Condition;
35
36 import com.mchange.v2.c3p0.ComboPooledDataSource;
37
38 /**
39  *
40  */
41 public class ListViewDBAccess extends ListDBAccess {
42
43         public ListViewDBAccess(final Document document, final String documentID, final ComboPooledDataSource cpds,
44                         final String tableName, final LayoutGroup libglomLayoutGroup) {
45                 super(document, documentID, cpds, tableName);
46
47                 // Convert the LayoutGroup object into a List suitable for SQL queries.
48                 final List<LayoutGroup> tempLayoutGroupVec = new ArrayList<LayoutGroup>();
49                 tempLayoutGroupVec.add(libglomLayoutGroup);
50                 fieldsToGet = getFieldsToShowForSQLQuery(tempLayoutGroupVec);
51
52                 // Add a LayoutItem_Field for the primary key to the end of the LayoutFieldVector if it doesn't already contain
53                 // a primary key.
54                 if (getPrimaryKeyIndex() < 0) {
55                         fieldsToGet.add(getPrimaryKeyLayoutItemField(tableName));
56                 }
57         }
58
59         /**
60          * 
61          * @param quickFind
62          * @param start
63          * @param length
64          * @param sortColumnIndex
65          *            The index of the column to sort by, or -1 for none.
66          * @param isAscending
67          * @return
68          */
69         public ArrayList<DataItem[]> getData(final String quickFind, final int start, final int length,
70                         final int sortColumnIndex, final boolean isAscending) {
71
72                 return getListData(quickFind, start, length, sortColumnIndex, isAscending);
73         }
74
75         /*
76          * (non-Javadoc)
77          * 
78          * @see org.glom.web.server.ListDBAccess#getExpectedResultSize()
79          */
80         public int getExpectedResultSize() {
81
82                 if (fieldsToGet == null || fieldsToGet.size() <= 0) {
83                         return -1;
84                 }
85
86                 return getResultSizeOfSQLQuery();
87         }
88
89         /*
90          * (non-Javadoc)
91          * 
92          * @see org.glom.web.server.ListDBAccess#getSQLQuery(LayoutFieldVector, SortClause)
93          */
94         @Override
95         protected String getSelectQuery(final String quickFind, final SortClause sortClause) {
96                 // Later versions of libglom actually return an empty SqlExpr when quickFindValue is empty,
97                 // but let's be sure:
98                 Condition whereClause = null;
99                 if (!StringUtils.isEmpty(quickFind)) {
100                         final TypedDataItem quickFindValue = new TypedDataItem();
101                         quickFindValue.setText(quickFind);
102                         whereClause = SqlUtils.getFindWhereClauseQuick(document, tableName, quickFindValue);
103                 }
104
105                 return SqlUtils.buildSqlSelectWithWhereClause(tableName, fieldsToGet, whereClause, sortClause);
106         }
107
108         /*
109          * (non-Javadoc)
110          * 
111          * @see org.glom.web.server.ListDBAccess#getCountQuery(LayoutFieldVector)
112          */
113         @Override
114         protected String getCountQuery() {
115                 return SqlUtils.buildSqlCountSelectWithWhereClause(tableName, fieldsToGet);
116         }
117
118         /**
119          * Gets the primary key index of this list layout.
120          * 
121          * @return index of primary key or -1 if a primary key was not found
122          */
123         private int getPrimaryKeyIndex() {
124                 for (int i = 0; i < fieldsToGet.size(); i++) {
125                         final LayoutItemField layoutItemField = fieldsToGet.get(i);
126                         final Field field = layoutItemField.getFullFieldDetails();
127                         if (tableName.equals(layoutItemField.getTableUsed(tableName)) && field != null && field.getPrimaryKey()) {
128                                 return i;
129                         }
130                 }
131                 return -1;
132         }
133 }