1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.expando.service.impl;
16  
17  import com.liferay.portal.kernel.exception.PortalException;
18  import com.liferay.portal.kernel.exception.SystemException;
19  import com.liferay.portal.kernel.util.Validator;
20  import com.liferay.portal.util.PortalUtil;
21  import com.liferay.portlet.expando.ColumnNameException;
22  import com.liferay.portlet.expando.ColumnTypeException;
23  import com.liferay.portlet.expando.DuplicateColumnNameException;
24  import com.liferay.portlet.expando.model.ExpandoColumn;
25  import com.liferay.portlet.expando.model.ExpandoColumnConstants;
26  import com.liferay.portlet.expando.model.ExpandoTable;
27  import com.liferay.portlet.expando.model.ExpandoTableConstants;
28  import com.liferay.portlet.expando.model.ExpandoValue;
29  import com.liferay.portlet.expando.model.impl.ExpandoValueImpl;
30  import com.liferay.portlet.expando.service.base.ExpandoColumnLocalServiceBaseImpl;
31  
32  import java.util.Collections;
33  import java.util.Date;
34  import java.util.List;
35  
36  /**
37   * <a href="ExpandoColumnLocalServiceImpl.java.html"><b><i>View Source</i></b>
38   * </a>
39   *
40   * @author Raymond Augé
41   * @author Brian Wing Shun Chan
42   */
43  public class ExpandoColumnLocalServiceImpl
44      extends ExpandoColumnLocalServiceBaseImpl {
45  
46      public ExpandoColumn addColumn(long tableId, String name, int type)
47          throws PortalException, SystemException {
48  
49          return addColumn(tableId, name, type, null);
50      }
51  
52      public ExpandoColumn addColumn(
53              long tableId, String name, int type, Object defaultData)
54          throws PortalException, SystemException {
55  
56          // Column
57  
58          ExpandoTable table = expandoTablePersistence.findByPrimaryKey(tableId);
59  
60          ExpandoValue value = validate(0, tableId, name, type, defaultData);
61  
62          long columnId = counterLocalService.increment();
63  
64          ExpandoColumn column = expandoColumnPersistence.create(columnId);
65  
66          column.setCompanyId(table.getCompanyId());
67          column.setTableId(tableId);
68          column.setName(name);
69          column.setType(type);
70          column.setDefaultData(value.getData());
71  
72          expandoColumnPersistence.update(column, false);
73  
74          // Resources
75  
76          resourceLocalService.addResources(
77              table.getCompanyId(), 0, 0, ExpandoColumn.class.getName(),
78              column.getColumnId(), false, false, false);
79  
80          return column;
81      }
82  
83      public void deleteColumn(ExpandoColumn column) throws SystemException {
84  
85          // Column
86  
87          expandoColumnPersistence.remove(column);
88  
89          // Values
90  
91          expandoValueLocalService.deleteColumnValues(column.getColumnId());
92      }
93  
94      public void deleteColumn(long columnId)
95          throws PortalException, SystemException {
96  
97          ExpandoColumn column = expandoColumnPersistence.findByPrimaryKey(
98              columnId);
99  
100         deleteColumn(column);
101     }
102 
103     public void deleteColumn(
104             long companyId, long classNameId, String tableName, String name)
105         throws PortalException, SystemException {
106 
107         ExpandoTable table = expandoTableLocalService.getTable(
108             companyId, classNameId, tableName);
109 
110         deleteColumn(table.getTableId(), name);
111     }
112 
113     public void deleteColumn(long tableId, String name)
114         throws PortalException, SystemException {
115 
116         ExpandoColumn column = expandoColumnPersistence.findByT_N(
117             tableId, name);
118 
119         deleteColumn(column);
120     }
121 
122     public void deleteColumn(
123             long companyId, String className, String tableName, String name)
124         throws PortalException, SystemException {
125 
126         long classNameId = PortalUtil.getClassNameId(className);
127 
128         deleteColumn(companyId, classNameId, tableName, name);
129     }
130 
131     public void deleteColumns(long tableId) throws SystemException {
132         List<ExpandoColumn> columns = expandoColumnPersistence.findByTableId(
133             tableId);
134 
135         for (ExpandoColumn column : columns) {
136             deleteColumn(column);
137         }
138     }
139 
140     public void deleteColumns(
141             long companyId, long classNameId, String tableName)
142         throws PortalException, SystemException {
143 
144         ExpandoTable table = expandoTableLocalService.getTable(
145             companyId, classNameId, tableName);
146 
147         deleteColumns(table.getTableId());
148     }
149 
150     public void deleteColumns(
151             long companyId, String className, String tableName)
152         throws PortalException, SystemException {
153 
154         long classNameId = PortalUtil.getClassNameId(className);
155 
156         deleteColumns(companyId, classNameId, tableName);
157     }
158 
159     public ExpandoColumn getColumn(long columnId)
160         throws PortalException, SystemException {
161 
162         return expandoColumnPersistence.findByPrimaryKey(columnId);
163     }
164 
165     public ExpandoColumn getColumn(
166             long companyId, long classNameId, String tableName, String name)
167         throws SystemException {
168 
169         ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
170             companyId, classNameId, tableName);
171 
172         if (table == null) {
173             return null;
174         }
175 
176         return expandoColumnPersistence.fetchByT_N(table.getTableId(), name);
177     }
178 
179     public ExpandoColumn getColumn(long tableId, String name)
180         throws PortalException, SystemException {
181 
182         return expandoColumnPersistence.findByT_N(tableId, name);
183     }
184 
185     public ExpandoColumn getColumn(
186             long companyId, String className, String tableName, String name)
187         throws SystemException {
188 
189         long classNameId = PortalUtil.getClassNameId(className);
190 
191         return getColumn(companyId, classNameId, tableName, name);
192     }
193 
194     public List<ExpandoColumn> getColumns(long tableId)
195         throws SystemException {
196 
197         return expandoColumnPersistence.findByTableId(tableId);
198     }
199 
200     public List<ExpandoColumn> getColumns(
201             long companyId, long classNameId, String tableName)
202         throws SystemException {
203 
204         ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
205             companyId, classNameId, tableName);
206 
207         if (table == null) {
208             return Collections.EMPTY_LIST;
209         }
210 
211         return expandoColumnPersistence.findByTableId(table.getTableId());
212     }
213 
214     public List<ExpandoColumn> getColumns(
215             long companyId, String className, String tableName)
216         throws SystemException {
217 
218         long classNameId = PortalUtil.getClassNameId(className);
219 
220         return getColumns(companyId, classNameId, tableName);
221     }
222 
223     public int getColumnsCount(long tableId) throws SystemException {
224         return expandoColumnPersistence.countByTableId(tableId);
225     }
226 
227     public int getColumnsCount(
228             long companyId, long classNameId, String tableName)
229         throws SystemException {
230 
231         ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
232             companyId, classNameId, tableName);
233 
234         if (table == null) {
235             return 0;
236         }
237 
238         return expandoColumnPersistence.countByTableId(table.getTableId());
239     }
240 
241     public int getColumnsCount(
242             long companyId, String className, String tableName)
243         throws SystemException {
244 
245         long classNameId = PortalUtil.getClassNameId(className);
246 
247         return getColumnsCount(companyId, classNameId, tableName);
248     }
249 
250     public ExpandoColumn getDefaultTableColumn(
251             long companyId, long classNameId, String name)
252         throws SystemException {
253 
254         return getColumn(
255             companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME,
256             name);
257     }
258 
259     public ExpandoColumn getDefaultTableColumn(
260             long companyId, String className, String name)
261         throws SystemException {
262 
263         long classNameId = PortalUtil.getClassNameId(className);
264 
265         return getColumn(
266             companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME,
267             name);
268     }
269 
270     public List<ExpandoColumn> getDefaultTableColumns(
271             long companyId, long classNameId)
272         throws SystemException {
273 
274         ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
275             companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
276 
277         if (table == null) {
278             return Collections.EMPTY_LIST;
279         }
280 
281         return expandoColumnPersistence.findByTableId(table.getTableId());
282     }
283 
284     public List<ExpandoColumn> getDefaultTableColumns(
285             long companyId, String className)
286         throws SystemException {
287 
288         long classNameId = PortalUtil.getClassNameId(className);
289 
290         return getColumns(
291             companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
292     }
293 
294     public int getDefaultTableColumnsCount(long companyId, long classNameId)
295         throws SystemException {
296 
297         ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
298             companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
299 
300         if (table == null) {
301             return 0;
302         }
303 
304         return expandoColumnPersistence.countByTableId(table.getTableId());
305     }
306 
307     public int getDefaultTableColumnsCount(long companyId, String className)
308         throws SystemException {
309 
310         long classNameId = PortalUtil.getClassNameId(className);
311 
312         return getColumnsCount(
313             companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
314     }
315 
316     public ExpandoColumn updateColumn(long columnId, String name, int type)
317         throws PortalException, SystemException {
318 
319         return updateColumn(columnId, name, type, null);
320     }
321 
322     public ExpandoColumn updateColumn(
323             long columnId, String name, int type, Object defaultData)
324         throws PortalException, SystemException {
325 
326         ExpandoColumn column = expandoColumnPersistence.findByPrimaryKey(
327             columnId);
328 
329         ExpandoValue value = validate(
330             columnId, column.getTableId(), name, type, defaultData);
331 
332         column.setName(name);
333         column.setType(type);
334         column.setDefaultData(value.getData());
335 
336         expandoColumnPersistence.update(column, false);
337 
338         return column;
339     }
340 
341     public ExpandoColumn updateTypeSettings(long columnId, String typeSettings)
342         throws PortalException, SystemException {
343 
344         ExpandoColumn column = expandoColumnPersistence.findByPrimaryKey(
345             columnId);
346 
347         column.setTypeSettings(typeSettings);
348 
349         expandoColumnPersistence.update(column, false);
350 
351         return column;
352     }
353 
354     protected ExpandoValue validate(
355             long columnId, long tableId, String name, int type,
356             Object defaultData)
357         throws PortalException, SystemException {
358 
359         if (Validator.isNull(name)) {
360             throw new ColumnNameException();
361         }
362 
363         ExpandoColumn column = expandoColumnPersistence.fetchByT_N(
364             tableId, name);
365 
366         if ((column != null) && (column.getColumnId() != columnId)) {
367             throw new DuplicateColumnNameException();
368         }
369 
370         if ((type != ExpandoColumnConstants.BOOLEAN) &&
371             (type != ExpandoColumnConstants.BOOLEAN_ARRAY) &&
372             (type != ExpandoColumnConstants.DATE) &&
373             (type != ExpandoColumnConstants.DATE_ARRAY) &&
374             (type != ExpandoColumnConstants.DOUBLE) &&
375             (type != ExpandoColumnConstants.DOUBLE_ARRAY) &&
376             (type != ExpandoColumnConstants.FLOAT) &&
377             (type != ExpandoColumnConstants.FLOAT_ARRAY) &&
378             (type != ExpandoColumnConstants.INTEGER) &&
379             (type != ExpandoColumnConstants.INTEGER_ARRAY) &&
380             (type != ExpandoColumnConstants.LONG) &&
381             (type != ExpandoColumnConstants.LONG_ARRAY) &&
382             (type != ExpandoColumnConstants.SHORT) &&
383             (type != ExpandoColumnConstants.SHORT_ARRAY) &&
384             (type != ExpandoColumnConstants.STRING) &&
385             (type != ExpandoColumnConstants.STRING_ARRAY)) {
386 
387             throw new ColumnTypeException();
388         }
389 
390         ExpandoValue value = new ExpandoValueImpl();
391 
392         if (Validator.isNotNull(defaultData)) {
393             value.setColumnId(columnId);
394 
395             if (type == ExpandoColumnConstants.BOOLEAN) {
396                 value.setBoolean((Boolean)defaultData);
397             }
398             else if (type == ExpandoColumnConstants.BOOLEAN_ARRAY) {
399                 value.setBooleanArray((boolean[])defaultData);
400             }
401             else if (type == ExpandoColumnConstants.DATE) {
402                 value.setDate((Date)defaultData);
403             }
404             else if (type == ExpandoColumnConstants.DATE_ARRAY) {
405                 value.setDateArray((Date[])defaultData);
406             }
407             else if (type == ExpandoColumnConstants.DOUBLE) {
408                 value.setDouble((Double)defaultData);
409             }
410             else if (type == ExpandoColumnConstants.DOUBLE_ARRAY) {
411                 value.setDoubleArray((double[])defaultData);
412             }
413             else if (type == ExpandoColumnConstants.FLOAT) {
414                 value.setFloat((Float)defaultData);
415             }
416             else if (type == ExpandoColumnConstants.FLOAT_ARRAY) {
417                 value.setFloatArray((float[])defaultData);
418             }
419             else if (type == ExpandoColumnConstants.INTEGER) {
420                 value.setInteger((Integer)defaultData);
421             }
422             else if (type == ExpandoColumnConstants.INTEGER_ARRAY) {
423                 value.setIntegerArray((int[])defaultData);
424             }
425             else if (type == ExpandoColumnConstants.LONG) {
426                 value.setLong((Long)defaultData);
427             }
428             else if (type == ExpandoColumnConstants.LONG_ARRAY) {
429                 value.setLongArray((long[])defaultData);
430             }
431             else if (type == ExpandoColumnConstants.SHORT) {
432                 value.setShort((Short)defaultData);
433             }
434             else if (type == ExpandoColumnConstants.SHORT_ARRAY) {
435                 value.setShortArray((short[])defaultData);
436             }
437             else if (type == ExpandoColumnConstants.STRING) {
438                 value.setString((String)defaultData);
439             }
440             else if (type == ExpandoColumnConstants.STRING_ARRAY) {
441                 value.setStringArray((String[])defaultData);
442             }
443         }
444 
445         return value;
446     }
447 
448 }