001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.expando.service.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.util.LocaleUtil;
020    import com.liferay.portal.kernel.util.StringBundler;
021    import com.liferay.portal.kernel.util.Validator;
022    import com.liferay.portal.util.PortalUtil;
023    import com.liferay.portlet.expando.ColumnNameException;
024    import com.liferay.portlet.expando.ColumnTypeException;
025    import com.liferay.portlet.expando.DuplicateColumnNameException;
026    import com.liferay.portlet.expando.model.ExpandoColumn;
027    import com.liferay.portlet.expando.model.ExpandoColumnConstants;
028    import com.liferay.portlet.expando.model.ExpandoTable;
029    import com.liferay.portlet.expando.model.ExpandoTableConstants;
030    import com.liferay.portlet.expando.model.ExpandoValue;
031    import com.liferay.portlet.expando.model.impl.ExpandoValueImpl;
032    import com.liferay.portlet.expando.service.base.ExpandoColumnLocalServiceBaseImpl;
033    
034    import java.util.Collection;
035    import java.util.Collections;
036    import java.util.Date;
037    import java.util.List;
038    import java.util.Locale;
039    import java.util.Map;
040    
041    /**
042     * @author Raymond Aug??
043     * @author Brian Wing Shun Chan
044     */
045    public class ExpandoColumnLocalServiceImpl
046            extends ExpandoColumnLocalServiceBaseImpl {
047    
048            @Override
049            public ExpandoColumn addColumn(long tableId, String name, int type)
050                    throws PortalException, SystemException {
051    
052                    return addColumn(tableId, name, type, null);
053            }
054    
055            @Override
056            public ExpandoColumn addColumn(
057                            long tableId, String name, int type, Object defaultData)
058                    throws PortalException, SystemException {
059    
060                    // Column
061    
062                    ExpandoTable table = expandoTablePersistence.findByPrimaryKey(tableId);
063    
064                    ExpandoValue value = validate(0, tableId, name, type, defaultData);
065    
066                    long columnId = counterLocalService.increment();
067    
068                    ExpandoColumn column = expandoColumnPersistence.create(columnId);
069    
070                    column.setCompanyId(table.getCompanyId());
071                    column.setTableId(tableId);
072                    column.setName(name);
073                    column.setType(type);
074                    column.setDefaultData(value.getData());
075    
076                    expandoColumnPersistence.update(column);
077    
078                    // Resources
079    
080                    resourceLocalService.addResources(
081                            table.getCompanyId(), 0, 0, ExpandoColumn.class.getName(),
082                            column.getColumnId(), false, false, false);
083    
084                    return column;
085            }
086    
087            @Override
088            public void deleteColumn(ExpandoColumn column) throws SystemException {
089    
090                    // Column
091    
092                    expandoColumnPersistence.remove(column);
093    
094                    // Values
095    
096                    expandoValueLocalService.deleteColumnValues(column.getColumnId());
097            }
098    
099            @Override
100            public void deleteColumn(long columnId)
101                    throws PortalException, SystemException {
102    
103                    ExpandoColumn column = expandoColumnPersistence.findByPrimaryKey(
104                            columnId);
105    
106                    deleteColumn(column);
107            }
108    
109            @Override
110            public void deleteColumn(
111                            long companyId, long classNameId, String tableName, String name)
112                    throws PortalException, SystemException {
113    
114                    ExpandoTable table = expandoTableLocalService.getTable(
115                            companyId, classNameId, tableName);
116    
117                    deleteColumn(table.getTableId(), name);
118            }
119    
120            @Override
121            public void deleteColumn(long tableId, String name) throws SystemException {
122                    ExpandoColumn column = expandoColumnPersistence.fetchByT_N(
123                            tableId, name);
124    
125                    if (column != null) {
126                            expandoColumnPersistence.remove(column);
127                    }
128            }
129    
130            @Override
131            public void deleteColumn(
132                            long companyId, String className, String tableName, String name)
133                    throws PortalException, SystemException {
134    
135                    long classNameId = PortalUtil.getClassNameId(className);
136    
137                    deleteColumn(companyId, classNameId, tableName, name);
138            }
139    
140            @Override
141            public void deleteColumns(long tableId) throws SystemException {
142                    List<ExpandoColumn> columns = expandoColumnPersistence.findByTableId(
143                            tableId);
144    
145                    for (ExpandoColumn column : columns) {
146                            deleteColumn(column);
147                    }
148            }
149    
150            @Override
151            public void deleteColumns(
152                            long companyId, long classNameId, String tableName)
153                    throws PortalException, SystemException {
154    
155                    ExpandoTable table = expandoTableLocalService.getTable(
156                            companyId, classNameId, tableName);
157    
158                    deleteColumns(table.getTableId());
159            }
160    
161            @Override
162            public void deleteColumns(
163                            long companyId, String className, String tableName)
164                    throws PortalException, SystemException {
165    
166                    long classNameId = PortalUtil.getClassNameId(className);
167    
168                    deleteColumns(companyId, classNameId, tableName);
169            }
170    
171            @Override
172            public ExpandoColumn getColumn(long columnId)
173                    throws PortalException, SystemException {
174    
175                    return expandoColumnPersistence.findByPrimaryKey(columnId);
176            }
177    
178            @Override
179            public ExpandoColumn getColumn(
180                            long companyId, long classNameId, String tableName, String name)
181                    throws SystemException {
182    
183                    ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
184                            companyId, classNameId, tableName);
185    
186                    if (table == null) {
187                            return null;
188                    }
189    
190                    return expandoColumnPersistence.fetchByT_N(table.getTableId(), name);
191            }
192    
193            @Override
194            public ExpandoColumn getColumn(long tableId, String name)
195                    throws SystemException {
196    
197                    return expandoColumnPersistence.fetchByT_N(tableId, name);
198            }
199    
200            @Override
201            public ExpandoColumn getColumn(
202                            long companyId, String className, String tableName, String name)
203                    throws SystemException {
204    
205                    long classNameId = PortalUtil.getClassNameId(className);
206    
207                    return getColumn(companyId, classNameId, tableName, name);
208            }
209    
210            @Override
211            public List<ExpandoColumn> getColumns(long tableId) throws SystemException {
212                    return expandoColumnPersistence.findByTableId(tableId);
213            }
214    
215            @Override
216            public List<ExpandoColumn> getColumns(
217                            long tableId, Collection<String> names)
218                    throws SystemException {
219    
220                    return expandoColumnPersistence.findByT_N(
221                            tableId, names.toArray(new String[names.size()]));
222            }
223    
224            @Override
225            public List<ExpandoColumn> getColumns(
226                            long companyId, long classNameId, String tableName)
227                    throws SystemException {
228    
229                    ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
230                            companyId, classNameId, tableName);
231    
232                    if (table == null) {
233                            return Collections.emptyList();
234                    }
235    
236                    return expandoColumnPersistence.findByTableId(table.getTableId());
237            }
238    
239            @Override
240            public List<ExpandoColumn> getColumns(
241                            long companyId, long classNameId, String tableName,
242                            Collection<String> names)
243                    throws SystemException {
244    
245                    ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
246                            companyId, classNameId, tableName);
247    
248                    if (table == null) {
249                            return Collections.emptyList();
250                    }
251    
252                    return expandoColumnPersistence.findByT_N(
253                            table.getTableId(), names.toArray(new String[names.size()]));
254            }
255    
256            @Override
257            public List<ExpandoColumn> getColumns(
258                            long companyId, String className, String tableName)
259                    throws SystemException {
260    
261                    long classNameId = PortalUtil.getClassNameId(className);
262    
263                    return getColumns(companyId, classNameId, tableName);
264            }
265    
266            @Override
267            public List<ExpandoColumn> getColumns(
268                            long companyId, String className, String tableName,
269                            Collection<String> columnNames)
270                    throws SystemException {
271    
272                    long classNameId = PortalUtil.getClassNameId(className);
273    
274                    return getColumns(companyId, classNameId, tableName, columnNames);
275            }
276    
277            @Override
278            public int getColumnsCount(long tableId) throws SystemException {
279                    return expandoColumnPersistence.countByTableId(tableId);
280            }
281    
282            @Override
283            public int getColumnsCount(
284                            long companyId, long classNameId, String tableName)
285                    throws SystemException {
286    
287                    ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
288                            companyId, classNameId, tableName);
289    
290                    if (table == null) {
291                            return 0;
292                    }
293    
294                    return expandoColumnPersistence.countByTableId(table.getTableId());
295            }
296    
297            @Override
298            public int getColumnsCount(
299                            long companyId, String className, String tableName)
300                    throws SystemException {
301    
302                    long classNameId = PortalUtil.getClassNameId(className);
303    
304                    return getColumnsCount(companyId, classNameId, tableName);
305            }
306    
307            @Override
308            public ExpandoColumn getDefaultTableColumn(
309                            long companyId, long classNameId, String name)
310                    throws SystemException {
311    
312                    return getColumn(
313                            companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME,
314                            name);
315            }
316    
317            @Override
318            public ExpandoColumn getDefaultTableColumn(
319                            long companyId, String className, String name)
320                    throws SystemException {
321    
322                    long classNameId = PortalUtil.getClassNameId(className);
323    
324                    return getColumn(
325                            companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME,
326                            name);
327            }
328    
329            @Override
330            public List<ExpandoColumn> getDefaultTableColumns(
331                            long companyId, long classNameId)
332                    throws SystemException {
333    
334                    ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
335                            companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
336    
337                    if (table == null) {
338                            return Collections.emptyList();
339                    }
340    
341                    return expandoColumnPersistence.findByTableId(table.getTableId());
342            }
343    
344            @Override
345            public List<ExpandoColumn> getDefaultTableColumns(
346                            long companyId, String className)
347                    throws SystemException {
348    
349                    long classNameId = PortalUtil.getClassNameId(className);
350    
351                    return getColumns(
352                            companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
353            }
354    
355            @Override
356            public int getDefaultTableColumnsCount(long companyId, long classNameId)
357                    throws SystemException {
358    
359                    ExpandoTable table = expandoTablePersistence.fetchByC_C_N(
360                            companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
361    
362                    if (table == null) {
363                            return 0;
364                    }
365    
366                    return expandoColumnPersistence.countByTableId(table.getTableId());
367            }
368    
369            @Override
370            public int getDefaultTableColumnsCount(long companyId, String className)
371                    throws SystemException {
372    
373                    long classNameId = PortalUtil.getClassNameId(className);
374    
375                    return getColumnsCount(
376                            companyId, classNameId, ExpandoTableConstants.DEFAULT_TABLE_NAME);
377            }
378    
379            @Override
380            public ExpandoColumn updateColumn(long columnId, String name, int type)
381                    throws PortalException, SystemException {
382    
383                    return expandoColumnLocalService.updateColumn(
384                            columnId, name, type, null);
385            }
386    
387            @Override
388            public ExpandoColumn updateColumn(
389                            long columnId, String name, int type, Object defaultData)
390                    throws PortalException, SystemException {
391    
392                    ExpandoColumn column = expandoColumnPersistence.findByPrimaryKey(
393                            columnId);
394    
395                    ExpandoValue value = validate(
396                            columnId, column.getTableId(), name, type, defaultData);
397    
398                    column.setName(name);
399                    column.setType(type);
400                    column.setDefaultData(value.getData());
401    
402                    expandoColumnPersistence.update(column);
403    
404                    return column;
405            }
406    
407            @Override
408            public ExpandoColumn updateTypeSettings(long columnId, String typeSettings)
409                    throws PortalException, SystemException {
410    
411                    ExpandoColumn column = expandoColumnPersistence.findByPrimaryKey(
412                            columnId);
413    
414                    column.setTypeSettings(typeSettings);
415    
416                    expandoColumnPersistence.update(column);
417    
418                    return column;
419            }
420    
421            protected ExpandoValue validate(
422                            long columnId, long tableId, String name, int type,
423                            Object defaultData)
424                    throws PortalException, SystemException {
425    
426                    if (Validator.isNull(name)) {
427                            throw new ColumnNameException();
428                    }
429    
430                    ExpandoColumn column = expandoColumnPersistence.fetchByT_N(
431                            tableId, name);
432    
433                    if ((column != null) && (column.getColumnId() != columnId)) {
434                            StringBundler sb = new StringBundler(7);
435    
436                            sb.append("{tableId=");
437                            sb.append(tableId);
438                            sb.append(", columnId=");
439                            sb.append(columnId);
440                            sb.append(", name=");
441                            sb.append(name);
442                            sb.append("}");
443    
444                            throw new DuplicateColumnNameException(sb.toString());
445                    }
446    
447                    if ((type != ExpandoColumnConstants.BOOLEAN) &&
448                            (type != ExpandoColumnConstants.BOOLEAN_ARRAY) &&
449                            (type != ExpandoColumnConstants.DATE) &&
450                            (type != ExpandoColumnConstants.DATE_ARRAY) &&
451                            (type != ExpandoColumnConstants.DOUBLE) &&
452                            (type != ExpandoColumnConstants.DOUBLE_ARRAY) &&
453                            (type != ExpandoColumnConstants.FLOAT) &&
454                            (type != ExpandoColumnConstants.FLOAT_ARRAY) &&
455                            (type != ExpandoColumnConstants.INTEGER) &&
456                            (type != ExpandoColumnConstants.INTEGER_ARRAY) &&
457                            (type != ExpandoColumnConstants.LONG) &&
458                            (type != ExpandoColumnConstants.LONG_ARRAY) &&
459                            (type != ExpandoColumnConstants.NUMBER) &&
460                            (type != ExpandoColumnConstants.NUMBER_ARRAY) &&
461                            (type != ExpandoColumnConstants.SHORT) &&
462                            (type != ExpandoColumnConstants.SHORT_ARRAY) &&
463                            (type != ExpandoColumnConstants.STRING) &&
464                            (type != ExpandoColumnConstants.STRING_ARRAY) &&
465                            (type != ExpandoColumnConstants.STRING_ARRAY_LOCALIZED) &&
466                            (type != ExpandoColumnConstants.STRING_LOCALIZED)) {
467    
468                            throw new ColumnTypeException();
469                    }
470    
471                    ExpandoValue value = new ExpandoValueImpl();
472    
473                    if (defaultData == null) {
474                            return value;
475                    }
476    
477                    value.setColumnId(columnId);
478    
479                    if (type == ExpandoColumnConstants.BOOLEAN) {
480                            value.setBoolean((Boolean)defaultData);
481                    }
482                    else if (type == ExpandoColumnConstants.BOOLEAN_ARRAY) {
483                            value.setBooleanArray((boolean[])defaultData);
484                    }
485                    else if (type == ExpandoColumnConstants.DATE) {
486                            value.setDate((Date)defaultData);
487                    }
488                    else if (type == ExpandoColumnConstants.DATE_ARRAY) {
489                            value.setDateArray((Date[])defaultData);
490                    }
491                    else if (type == ExpandoColumnConstants.DOUBLE) {
492                            value.setDouble((Double)defaultData);
493                    }
494                    else if (type == ExpandoColumnConstants.DOUBLE_ARRAY) {
495                            value.setDoubleArray((double[])defaultData);
496                    }
497                    else if (type == ExpandoColumnConstants.FLOAT) {
498                            value.setFloat((Float)defaultData);
499                    }
500                    else if (type == ExpandoColumnConstants.FLOAT_ARRAY) {
501                            value.setFloatArray((float[])defaultData);
502                    }
503                    else if (type == ExpandoColumnConstants.INTEGER) {
504                            value.setInteger((Integer)defaultData);
505                    }
506                    else if (type == ExpandoColumnConstants.INTEGER_ARRAY) {
507                            value.setIntegerArray((int[])defaultData);
508                    }
509                    else if (type == ExpandoColumnConstants.LONG) {
510                            value.setLong((Long)defaultData);
511                    }
512                    else if (type == ExpandoColumnConstants.LONG_ARRAY) {
513                            value.setLongArray((long[])defaultData);
514                    }
515                    else if (type == ExpandoColumnConstants.NUMBER) {
516                            value.setNumber((Number)defaultData);
517                    }
518                    else if (type == ExpandoColumnConstants.NUMBER_ARRAY) {
519                            value.setNumberArray((Number[])defaultData);
520                    }
521                    else if (type == ExpandoColumnConstants.SHORT) {
522                            value.setShort((Short)defaultData);
523                    }
524                    else if (type == ExpandoColumnConstants.SHORT_ARRAY) {
525                            value.setShortArray((short[])defaultData);
526                    }
527                    else if (type == ExpandoColumnConstants.STRING) {
528                            value.setString((String)defaultData);
529                    }
530                    else if (type == ExpandoColumnConstants.STRING_ARRAY) {
531                            value.setStringArray((String[])defaultData);
532                    }
533                    else if (type == ExpandoColumnConstants.STRING_ARRAY_LOCALIZED) {
534                            value.setStringArrayMap(
535                                    (Map<Locale, String[]>)defaultData, LocaleUtil.getDefault());
536                    }
537                    else if (type == ExpandoColumnConstants.STRING_LOCALIZED) {
538                            value.setStringMap(
539                                    (Map<Locale, String>)defaultData, LocaleUtil.getDefault());
540                    }
541    
542                    return value;
543            }
544    
545    }