]> git.mxchange.org Git - pizzaservice-war.git/blob
4b358b421dafe10bf48ac5ede8298bc06a01a561
[pizzaservice-war.git] /
1 /*
2  * Copyright (C) 2015 Roland Haeder
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 package org.mxchange.pizzaapplication.database.frontend.category;
18
19 import java.io.IOException;
20 import java.lang.reflect.InvocationTargetException;
21 import java.sql.ResultSet;
22 import java.sql.SQLException;
23 import java.text.MessageFormat;
24 import java.util.Iterator;
25 import java.util.Map;
26 import org.mxchange.jcore.criteria.searchable.SearchCriteria;
27 import org.mxchange.jcore.criteria.searchable.SearchableCriteria;
28 import org.mxchange.jcore.database.frontend.BaseDatabaseFrontend;
29 import org.mxchange.jcore.database.result.DatabaseResult;
30 import org.mxchange.jcore.database.result.Result;
31 import org.mxchange.jcore.database.storage.Storeable;
32 import org.mxchange.jcore.exceptions.BadTokenException;
33 import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException;
34 import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException;
35 import org.mxchange.pizzaapplication.category.Category;
36 import org.mxchange.pizzaapplication.category.product.ProductCategory;
37 import org.mxchange.pizzaapplication.database.category.PizzaCategoryDatabaseConstants;
38 import org.mxchange.pizzaapplication.product.Product;
39
40 /**
41  * Stores and retrieves Contact instances
42  *
43  * @author Roland Haeder
44  */
45 public class PizzaCategoryDatabaseFrontend extends BaseDatabaseFrontend implements CategoryFrontend {
46         /**
47          * Default constrcutor
48          * @throws org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException If the configured backend is not supported
49          * @throws java.sql.SQLException If any SQL error occurs
50          */
51         public PizzaCategoryDatabaseFrontend () throws UnsupportedDatabaseBackendException, SQLException {
52                 // Trace message
53                 this.getLogger().trace("CALLED!"); //NOI18N
54
55                 // Set "table" name
56                 this.setTableName("category"); //NOI18N
57
58                 // Initalize backend
59                 this.initBackend();
60         }
61
62         /**
63          * Adds given category title as new category, parent may be null if not selected.
64          *
65          * @param title Title of category
66          * @param parent Parent id or null if not selected
67          */
68         @Override
69         public void addCategory (final String title, final Integer parent) throws SQLException, IOException {
70                 // Trace message
71                 this.getLogger().trace(MessageFormat.format("title={0},parent={1} - CALLED!", title, parent));
72
73                 // Title should not be null
74                 if (title == null) {
75                         // Abort here
76                         throw new NullPointerException("title is null");
77                 }
78
79                 // Clear dataset from previous usage
80                 this.clearDataSet();
81
82                 // Add title and parent
83                 this.addToDataSet(PizzaCategoryDatabaseConstants.COLUMN_TITLE, title);
84                 this.addToDataSet(PizzaCategoryDatabaseConstants.COLUMN_PARENT, parent);
85
86                 // Handle this over to the backend
87                 Result<? extends Storeable> result = this.doInsertDataSet();
88
89                 // Debug message
90                 this.getLogger().debug(MessageFormat.format("result={0}", result));
91
92                 // Trace message
93                 this.getLogger().trace("EXIT!");
94         }
95
96         /**
97          * Shuts down the database layer
98          * @throws java.sql.SQLException If an SQL error occurs
99          * @throws java.io.IOException If any IO error occurs
100          */
101         @Override
102         public void doShutdown () throws SQLException, IOException {
103                 // Trace message
104                 this.getLogger().trace("CALLED!"); //NOI18N
105
106                 // Shutdown backend
107                 this.getBackend().doShutdown();
108
109                 // Trace message
110                 this.getLogger().trace("EXIT!"); //NOI18N
111         }
112
113         /**
114          * Depending on column, an empty value may be converted to null
115          *
116          * @param key Key to check
117          * @param value Value to check
118          * @return Possible previous value or null
119          */
120         @Override
121         public Object emptyStringToNull (final String key, final Object value) {
122                 // Trace message
123                 this.getLogger().trace(MessageFormat.format("key={0},value={1} - CALLED!", key, value));
124
125                 // Copy value
126                 Object v = value;
127
128                 // Is the value empty?
129                 if ((value instanceof String) && ("".equals(value))) {
130                         // This value may need to be changed
131                         switch (key) {
132                                 case PizzaCategoryDatabaseConstants.COLUMN_PARENT: // Convert this
133                                         v = null;
134                                         break;
135                         }
136                 }
137
138                 // Trace message
139                 this.getLogger().trace(MessageFormat.format("v={0} - EXIT!", v));
140
141                 // Return it
142                 return v;
143         }
144
145         @Override
146         @SuppressWarnings ("unchecked")
147         public Iterator<Category> getCategories () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
148                 // Trace message
149                 this.getLogger().trace("CALLED!"); //NOI18N
150
151                 // Instance search criteria
152                 SearchableCriteria critera = new SearchCriteria();
153
154                 // Run the query
155                 Result<? extends Storeable> result = this.getBackend().doSelectByCriteria(critera);
156
157                 // Debug message
158                 this.getLogger().debug(MessageFormat.format("result={0}", result)); //NOI18N
159
160                 // Get iterator
161                 Iterator<?> iterator = result.iterator();
162
163                 // Trace message
164                 this.getLogger().trace(MessageFormat.format("iterator={0} - EXIT!", iterator)); //NOI18N
165
166                 // Get iterator and return it
167                 return (Iterator<Category>) iterator;
168         }
169
170         @Override
171         public Category getCategory (final Product product) throws IOException, BadTokenException, CorruptedDatabaseFileException, SQLException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
172                 // Trace message
173                 this.getLogger().trace(MessageFormat.format("product={0} - CALLED!", product));
174                 
175                 // product must not be null
176                 if (product == null) {
177                         // Abort here
178                         throw new NullPointerException("product is null");
179                 }
180                 
181                 // Get category id from it
182                 Long id = product.getCategory();
183                 
184                 // Debug message
185                 this.getLogger().debug(MessageFormat.format("id={0}", id));
186                 
187                 // It should be >0 here
188                 assert(id > 0) : MessageFormat.format("id={0} must be larger zero", id);
189                 
190                 // Then construct a search instance
191                 SearchableCriteria criteria = new SearchCriteria();
192                 
193                 // Add id to it
194                 criteria.addCriteria(PizzaCategoryDatabaseConstants.COLUMN_ID, id);
195                 
196                 // Only one entry is find
197                 criteria.setLimit(1);
198                 
199                 // Run it on backend
200                 Result<? extends Storeable> result = this.getBackend().doSelectByCriteria(criteria);
201                 
202                 // Debug log
203                 this.getLogger().debug(MessageFormat.format("result({0})={1}", result, result.size()));
204                 
205                 // Init category instance
206                 Category category = null;
207                 
208                 // Is there one entry?
209                 if (result.hasNext()) {
210                         // Read result from it
211                         Storeable storeable = result.next();
212                         
213                         // Debug message
214                         this.getLogger().debug(MessageFormat.format("storeable={0}", storeable));
215                         
216                         // Is it instance of Category?
217                         if (storeable instanceof Category) {
218                                 // Then cast it
219                                 category = (Category) storeable;
220                         }
221                 }
222                 
223                 // Trace message
224                 this.getLogger().trace(MessageFormat.format("category={0} - EXIT!", category));
225                 
226                 // Return it
227                 return category;
228         }
229
230         @Override
231         public String getIdName () {
232                 // Return column id
233                 return PizzaCategoryDatabaseConstants.COLUMN_ID;
234         }
235
236         /**
237          * Gets a Result back from given ResultSet instance
238          *
239          * @param resultSet ResultSet instance from SQL driver
240          * @return A typorized Result instance
241          * @throws java.sql.SQLException If any SQL error occurs
242          */
243         @Override
244         public Result<? extends Storeable> getResultFromSet (final ResultSet resultSet) throws SQLException {
245                 // Trace message
246                 this.getLogger().trace(MessageFormat.format("resultSet={0} - CALLED!", resultSet));
247
248                 // Init result instance
249                 Result<? extends Storeable> result = new DatabaseResult();
250
251                 // Reset result set before first row
252                 resultSet.beforeFirst();
253
254                 // "Walk" through all entries
255                 while (resultSet.next()) {
256                         // Get id, title and parent id
257                         Long id = resultSet.getLong(PizzaCategoryDatabaseConstants.COLUMN_ID);
258                         String title = resultSet.getString(PizzaCategoryDatabaseConstants.COLUMN_TITLE);
259                         Long parent = resultSet.getLong(PizzaCategoryDatabaseConstants.COLUMN_PARENT);
260
261                         // Debug message
262                         this.getLogger().debug(MessageFormat.format("id={0},title={1},parent={2}", id, title, parent));
263
264                         // Instance new object
265                         Category category = new ProductCategory(id, title, parent);
266
267                         // Debug log
268                         this.getLogger().debug(MessageFormat.format("category={0}", category));
269
270                         // Add it to result
271                         result.add(category);
272                 }
273
274                 // Trace message
275                 this.getLogger().trace(MessageFormat.format("result({0})={1} - EXIT!", result.size(), result));
276
277                 // Return result
278                 return result;
279         }
280
281         /**
282          * Checks if given category title is already used
283          *
284          * @param title Title to check
285          * @return Whether the title has been used
286          */
287         @Override
288         public boolean isCategoryTitleUsed (final String title) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
289                 // Trace message
290                 this.getLogger().trace(MessageFormat.format("title={0} - CALLED!", title));
291
292                 // Get search criteria
293                 SearchableCriteria criteria = new SearchCriteria();
294
295                 // Add criteria
296                 criteria.addCriteria(PizzaCategoryDatabaseConstants.COLUMN_TITLE, title);
297
298                 // Only one entry is find
299                 criteria.setLimit(1);
300
301                 // Run it on backend
302                 Result<? extends Storeable> result = this.getBackend().doSelectByCriteria(criteria);
303
304                 // Debug log
305                 this.getLogger().debug(MessageFormat.format("result({0})={1}", result, result.size()));
306
307                 // Now check size of the result
308                 boolean isFound = (result.size() == 1);
309
310                 // Trace message
311                 this.getLogger().trace(MessageFormat.format("isFound={0} - EXIT!", isFound));
312
313                 // Return it
314                 return isFound;
315         }
316
317         /**
318          * Converts the given map into a Storeable instance, depending on which class implements it. All
319          * keys are being interpreted as class fields/attributes and their respective setters are being searched for. As
320          * this method may fail to find one or access it, this method throws some exception.
321          *
322          * @param map Map instance to convert to Storeable
323          * @return An instance of a Storeable implementation
324          */
325         @Override
326         public Storeable toStoreable (final Map<String, String> map) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
327                 // Trace message
328                 this.getLogger().trace(MessageFormat.format("map={0} - CALLED!", map));
329
330                 // Is map null?
331                 if (map == null) {
332                         // Is null
333                         throw new NullPointerException("map is null");
334                 } else if (map.isEmpty()) {
335                         // Map is empty
336                         throw new IllegalArgumentException("map is empty.");
337                 }
338
339                 // Debug message
340                 this.getLogger().debug(MessageFormat.format("Has to handle {0} entries", map.size()));
341
342                 // Get iterator on all entries
343                 Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
344
345                 // Init object instance
346                 Storeable instance = new ProductCategory();
347
348                 // Iterate over all
349                 while (iterator.hasNext()) {
350                         // Get next entry
351                         Map.Entry<String, String> entry = iterator.next();
352
353                         // Debug message
354                         this.getLogger().debug(MessageFormat.format("entry:{0}={1}", entry.getKey(), entry.getValue()));
355
356                         // Try to set value
357                         instance.setValueFromColumn(entry.getKey(), entry.getValue());
358                 }
359
360                 // Trace message
361                 this.getLogger().trace(MessageFormat.format("instance={0} - EXIT!", instance));
362
363                 // Return it
364                 return instance;
365         }
366 }