1 package de.hsofttec.core5.datasource;
2
3 import java.util.Iterator;
4 import java.util.regex.Pattern;
5
6 import org.apache.commons.lang.StringUtils;
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.apache.tapestry.beaneditor.PropertyModel;
10 import org.apache.tapestry.grid.GridDataSource;
11 import org.apache.tapestry.ioc.internal.util.TapestryException;
12
13 import org.hibernate.QueryException;
14
15 import de.hsofttec.core5.dao.GenericDAO;
16
17
18
19
20
21
22
23 public class HibernateDataSource implements GridDataSource
24 {
25 private static Log _logger = LogFactory.getLog(HibernateDataSource.class);
26 private GenericDAO _genericDAO;
27 private String _hqlString;
28 private String _hqlCountString;
29 private int _rowCount = -1;
30 private Iterator _pageRowList;
31
32 public HibernateDataSource(GenericDAO genericDAO, String hqlString)
33 {
34 this(genericDAO, hqlString, null);
35 }
36
37 public HibernateDataSource(GenericDAO genericDAO, String hqlString, String hqlSpecialCountString)
38 {
39 _genericDAO = genericDAO;
40 _hqlString = hqlString;
41 _hqlCountString = hqlSpecialCountString;
42 }
43
44
45
46
47 public int getAvailableRows()
48 {
49 if (_rowCount < 0)
50 _rowCount = getMaximumResultObjects();
51
52 return _rowCount;
53 }
54
55
56
57
58
59
60
61
62
63
64
65
66 public void prepare(int startIndex, int endIndex, PropertyModel sortModel, boolean ascending)
67 {
68 if (_logger.isInfoEnabled())
69 _logger.info(String.format("processing prepare(%d, %d) for '%s'",
70 startIndex, endIndex, _genericDAO.getPersistentClass().getName()));
71
72 _pageRowList = _genericDAO.findByQuery(_hqlString, startIndex, endIndex + 1).iterator();
73 }
74
75
76
77
78 public Object getRowValue(int index)
79 {
80 Object entityObject = null;
81
82 if (_pageRowList.hasNext())
83 entityObject = _pageRowList.next();
84
85 return entityObject;
86 }
87
88
89
90
91
92
93 public Class getRowType()
94 {
95 return _genericDAO.getPersistentClass();
96 }
97
98
99
100
101 private int getMaximumResultObjects()
102 {
103 String tempQuery1;
104 String queryString = _hqlString;
105
106 try
107 {
108 if (_logger.isInfoEnabled())
109 _logger.info(String.format("processing getMaximumResultObjects() for '%s'",
110 _genericDAO.getPersistentClass().getName()));
111
112 if (_hqlCountString != null)
113 tempQuery1 = _hqlCountString;
114 else
115 tempQuery1 = convertQueryString(queryString);
116
117 Long result = (Long) _genericDAO.countByQuery(tempQuery1);
118 if (result == null)
119 return 0;
120
121 return result.intValue();
122 }
123 catch (QueryException e)
124 {
125 throw new TapestryException("entity not \"mapped\" in hibernate.cfg.xml ?", this, e);
126 }
127 }
128
129
130
131
132 private String convertQueryString(String originalQueryString)
133 {
134 String tempQueryString = StringUtils.substring(originalQueryString,
135 StringUtils.indexOf(StringUtils.
136 upperCase(originalQueryString), "FROM"));
137 String convertedQueryString = "SELECT COUNT(*) ";
138
139
140 Pattern p = Pattern.compile("[\\s]+");
141 String[] result = p.split(tempQueryString);
142
143 for (String queryWord : result)
144 {
145
146
147
148
149 queryWord.equalsIgnoreCase("JOIN") ||
150 queryWord.equalsIgnoreCase("FETCH"))
151 if (queryWord.equalsIgnoreCase("FETCH"))
152 continue;
153
154 if (queryWord.equalsIgnoreCase("ORDER"))
155 break;
156
157 convertedQueryString += queryWord + " ";
158 }
159
160 if (_logger.isInfoEnabled())
161 _logger.info("source: " + originalQueryString + System.getProperty("line.separator") +
162 "dest: " + convertedQueryString);
163
164 return convertedQueryString;
165 }
166 }
Tapestry5HibernateGridDatasource1 (last edited 2010-06-12 09:39:14 by LorenzoSimionato)