001    /**
002     * Copyright (c) 2000-present 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.portal.service.impl;
016    
017    import com.liferay.portal.kernel.exception.LayoutSetVirtualHostException;
018    import com.liferay.portal.kernel.exception.NoSuchImageException;
019    import com.liferay.portal.kernel.exception.NoSuchVirtualHostException;
020    import com.liferay.portal.kernel.exception.PortalException;
021    import com.liferay.portal.kernel.exception.SystemException;
022    import com.liferay.portal.kernel.log.Log;
023    import com.liferay.portal.kernel.log.LogFactoryUtil;
024    import com.liferay.portal.kernel.model.Group;
025    import com.liferay.portal.kernel.model.Image;
026    import com.liferay.portal.kernel.model.LayoutSet;
027    import com.liferay.portal.kernel.model.VirtualHost;
028    import com.liferay.portal.kernel.service.ServiceContext;
029    import com.liferay.portal.kernel.util.ColorSchemeFactoryUtil;
030    import com.liferay.portal.kernel.util.FileUtil;
031    import com.liferay.portal.kernel.util.PortalUtil;
032    import com.liferay.portal.kernel.util.PropsKeys;
033    import com.liferay.portal.kernel.util.StringPool;
034    import com.liferay.portal.kernel.util.StringUtil;
035    import com.liferay.portal.kernel.util.ThemeFactoryUtil;
036    import com.liferay.portal.kernel.util.Validator;
037    import com.liferay.portal.service.base.LayoutSetLocalServiceBaseImpl;
038    import com.liferay.portal.util.PrefsPropsUtil;
039    import com.liferay.portal.util.PropsValues;
040    
041    import java.io.File;
042    import java.io.IOException;
043    import java.io.InputStream;
044    
045    import java.util.Date;
046    import java.util.List;
047    
048    /**
049     * @author Brian Wing Shun Chan
050     * @author Julio Camarero
051     * @author Ganesh Ram
052     */
053    public class LayoutSetLocalServiceImpl extends LayoutSetLocalServiceBaseImpl {
054    
055            @Override
056            public LayoutSet addLayoutSet(long groupId, boolean privateLayout)
057                    throws PortalException {
058    
059                    Group group = groupPersistence.findByPrimaryKey(groupId);
060    
061                    Date now = new Date();
062    
063                    long layoutSetId = counterLocalService.increment();
064    
065                    LayoutSet layoutSet = layoutSetPersistence.create(layoutSetId);
066    
067                    layoutSet.setGroupId(groupId);
068                    layoutSet.setCompanyId(group.getCompanyId());
069                    layoutSet.setCreateDate(now);
070                    layoutSet.setModifiedDate(now);
071                    layoutSet.setPrivateLayout(privateLayout);
072    
073                    layoutSet = initLayoutSet(layoutSet);
074    
075                    layoutSetPersistence.update(layoutSet);
076    
077                    return layoutSet;
078            }
079    
080            @Override
081            public void deleteLayoutSet(
082                            long groupId, boolean privateLayout, ServiceContext serviceContext)
083                    throws PortalException {
084    
085                    Group group = groupPersistence.findByPrimaryKey(groupId);
086    
087                    LayoutSet layoutSet = layoutSetPersistence.findByG_P(
088                            groupId, privateLayout);
089    
090                    // Layouts
091    
092                    serviceContext.setAttribute("updatePageCount", Boolean.FALSE);
093    
094                    layoutLocalService.deleteLayouts(
095                            groupId, privateLayout, serviceContext);
096    
097                    // Logo
098    
099                    if (group.isStagingGroup() || !group.isOrganization() ||
100                            !group.isSite()) {
101    
102                            try {
103                                    imageLocalService.deleteImage(layoutSet.getLogoId());
104                            }
105                            catch (NoSuchImageException nsie) {
106                                    if (_log.isWarnEnabled()) {
107                                            _log.warn(
108                                                    "Unable to delete image " + layoutSet.getLogoId());
109                                    }
110                            }
111                    }
112    
113                    // Layout set
114    
115                    if (!group.isStagingGroup() && group.isOrganization() &&
116                            group.isSite()) {
117    
118                            layoutSet = initLayoutSet(layoutSet);
119    
120                            layoutSet.setLogoId(layoutSet.getLogoId());
121    
122                            layoutSetPersistence.update(layoutSet);
123                    }
124                    else {
125                            layoutSetPersistence.removeByG_P(groupId, privateLayout);
126                    }
127    
128                    // Virtual host
129    
130                    try {
131                            virtualHostPersistence.removeByC_L(
132                                    layoutSet.getCompanyId(), layoutSet.getLayoutSetId());
133                    }
134                    catch (NoSuchVirtualHostException nsvhe) {
135                    }
136            }
137    
138            @Override
139            public LayoutSet fetchLayoutSet(String virtualHostname) {
140                    virtualHostname = StringUtil.toLowerCase(virtualHostname.trim());
141    
142                    VirtualHost virtualHost = virtualHostPersistence.fetchByHostname(
143                            virtualHostname);
144    
145                    if ((virtualHost == null) || (virtualHost.getLayoutSetId() == 0)) {
146                            return null;
147                    }
148    
149                    return layoutSetPersistence.fetchByPrimaryKey(
150                            virtualHost.getLayoutSetId());
151            }
152    
153            @Override
154            public LayoutSet getLayoutSet(long groupId, boolean privateLayout)
155                    throws PortalException {
156    
157                    return layoutSetPersistence.findByG_P(groupId, privateLayout);
158            }
159    
160            @Override
161            public LayoutSet getLayoutSet(String virtualHostname)
162                    throws PortalException {
163    
164                    virtualHostname = StringUtil.toLowerCase(virtualHostname.trim());
165    
166                    VirtualHost virtualHost = virtualHostPersistence.findByHostname(
167                            virtualHostname);
168    
169                    if (virtualHost.getLayoutSetId() == 0) {
170                            throw new LayoutSetVirtualHostException(
171                                    "Virtual host is associated with company " +
172                                            virtualHost.getCompanyId());
173                    }
174    
175                    return layoutSetPersistence.findByPrimaryKey(
176                            virtualHost.getLayoutSetId());
177            }
178    
179            @Override
180            public List<LayoutSet> getLayoutSetsByLayoutSetPrototypeUuid(
181                    String layoutSetPrototypeUuid) {
182    
183                    return layoutSetPersistence.findByLayoutSetPrototypeUuid(
184                            layoutSetPrototypeUuid);
185            }
186    
187            /**
188             * Updates the state of the layout set prototype link.
189             *
190             * @param groupId the primary key of the group
191             * @param privateLayout whether the layout set is private to the group
192             * @param layoutSetPrototypeLinkEnabled whether the layout set prototype is
193             *        link enabled
194             * @param layoutSetPrototypeUuid the uuid of the layout set prototype to
195             *        link with
196             */
197            @Override
198            public void updateLayoutSetPrototypeLinkEnabled(
199                            long groupId, boolean privateLayout,
200                            boolean layoutSetPrototypeLinkEnabled,
201                            String layoutSetPrototypeUuid)
202                    throws PortalException {
203    
204                    LayoutSet layoutSet = layoutSetPersistence.findByG_P(
205                            groupId, privateLayout);
206    
207                    if (Validator.isNull(layoutSetPrototypeUuid)) {
208                            layoutSetPrototypeUuid = layoutSet.getLayoutSetPrototypeUuid();
209                    }
210    
211                    if (Validator.isNull(layoutSetPrototypeUuid)) {
212                            layoutSetPrototypeLinkEnabled = false;
213                    }
214    
215                    layoutSet.setLayoutSetPrototypeLinkEnabled(
216                            layoutSetPrototypeLinkEnabled);
217                    layoutSet.setLayoutSetPrototypeUuid(layoutSetPrototypeUuid);
218    
219                    layoutSetPersistence.update(layoutSet);
220            }
221    
222            @Override
223            public LayoutSet updateLogo(
224                            long groupId, boolean privateLayout, boolean logo, byte[] bytes)
225                    throws PortalException {
226    
227                    LayoutSet layoutSet = layoutSetPersistence.findByG_P(
228                            groupId, privateLayout);
229    
230                    layoutSet.setModifiedDate(new Date());
231    
232                    PortalUtil.updateImageId(layoutSet, logo, bytes, "logoId", 0, 0, 0);
233    
234                    return layoutSetPersistence.update(layoutSet);
235            }
236    
237            @Override
238            public LayoutSet updateLogo(
239                            long groupId, boolean privateLayout, boolean logo, File file)
240                    throws PortalException {
241    
242                    byte[] bytes = null;
243    
244                    try {
245                            bytes = FileUtil.getBytes(file);
246                    }
247                    catch (IOException ioe) {
248                            throw new SystemException(ioe);
249                    }
250    
251                    return updateLogo(groupId, privateLayout, logo, bytes);
252            }
253    
254            @Override
255            public LayoutSet updateLogo(
256                            long groupId, boolean privateLayout, boolean logo, InputStream is)
257                    throws PortalException {
258    
259                    return updateLogo(groupId, privateLayout, logo, is, true);
260            }
261    
262            @Override
263            public LayoutSet updateLogo(
264                            long groupId, boolean privateLayout, boolean logo, InputStream is,
265                            boolean cleanUpStream)
266                    throws PortalException {
267    
268                    byte[] bytes = null;
269    
270                    try {
271                            bytes = FileUtil.getBytes(is, -1, cleanUpStream);
272                    }
273                    catch (IOException ioe) {
274                            throw new SystemException(ioe);
275                    }
276    
277                    return updateLogo(groupId, privateLayout, logo, bytes);
278            }
279    
280            @Override
281            public LayoutSet updateLookAndFeel(
282                            long groupId, boolean privateLayout, String themeId,
283                            String colorSchemeId, String css)
284                    throws PortalException {
285    
286                    LayoutSet layoutSet = layoutSetPersistence.findByG_P(
287                            groupId, privateLayout);
288    
289                    layoutSet.setModifiedDate(new Date());
290    
291                    if (Validator.isNull(themeId)) {
292                            themeId = ThemeFactoryUtil.getDefaultRegularThemeId(
293                                    layoutSet.getCompanyId());
294                    }
295    
296                    if (Validator.isNull(colorSchemeId)) {
297                            colorSchemeId =
298                                    ColorSchemeFactoryUtil.getDefaultRegularColorSchemeId();
299                    }
300    
301                    layoutSet.setThemeId(themeId);
302                    layoutSet.setColorSchemeId(colorSchemeId);
303                    layoutSet.setCss(css);
304    
305                    layoutSetPersistence.update(layoutSet);
306    
307                    if (PrefsPropsUtil.getBoolean(
308                                    PropsKeys.THEME_SYNC_ON_GROUP,
309                                    PropsValues.THEME_SYNC_ON_GROUP)) {
310    
311                            LayoutSet otherLayoutSet = layoutSetPersistence.findByG_P(
312                                    layoutSet.getGroupId(), layoutSet.isPrivateLayout());
313    
314                            otherLayoutSet.setThemeId(themeId);
315                            otherLayoutSet.setColorSchemeId(colorSchemeId);
316    
317                            layoutSetPersistence.update(otherLayoutSet);
318                    }
319    
320                    return layoutSet;
321            }
322    
323            @Override
324            public void updateLookAndFeel(
325                            long groupId, String themeId, String colorSchemeId, String css)
326                    throws PortalException {
327    
328                    updateLookAndFeel(groupId, false, themeId, colorSchemeId, css);
329                    updateLookAndFeel(groupId, true, themeId, colorSchemeId, css);
330            }
331    
332            @Override
333            public LayoutSet updatePageCount(long groupId, boolean privateLayout)
334                    throws PortalException {
335    
336                    int pageCount = layoutPersistence.countByG_P(groupId, privateLayout);
337    
338                    LayoutSet layoutSet = layoutSetPersistence.findByG_P(
339                            groupId, privateLayout);
340    
341                    layoutSet.setModifiedDate(new Date());
342                    layoutSet.setPageCount(pageCount);
343    
344                    layoutSetPersistence.update(layoutSet);
345    
346                    return layoutSet;
347            }
348    
349            @Override
350            public LayoutSet updateSettings(
351                            long groupId, boolean privateLayout, String settings)
352                    throws PortalException {
353    
354                    LayoutSet layoutSet = layoutSetPersistence.findByG_P(
355                            groupId, privateLayout);
356    
357                    layoutSet.setModifiedDate(new Date());
358                    layoutSet.setSettings(settings);
359    
360                    layoutSetPersistence.update(layoutSet);
361    
362                    return layoutSet;
363            }
364    
365            @Override
366            public LayoutSet updateVirtualHost(
367                            long groupId, boolean privateLayout, String virtualHostname)
368                    throws PortalException {
369    
370                    virtualHostname = StringUtil.toLowerCase(virtualHostname.trim());
371    
372                    if (Validator.isNotNull(virtualHostname) &&
373                            !Validator.isDomain(virtualHostname)) {
374    
375                            throw new LayoutSetVirtualHostException();
376                    }
377    
378                    LayoutSet layoutSet = layoutSetPersistence.findByG_P(
379                            groupId, privateLayout);
380    
381                    if (Validator.isNotNull(virtualHostname)) {
382                            VirtualHost virtualHost = virtualHostPersistence.fetchByHostname(
383                                    virtualHostname);
384    
385                            if (virtualHost == null) {
386                                    virtualHostLocalService.updateVirtualHost(
387                                            layoutSet.getCompanyId(), layoutSet.getLayoutSetId(),
388                                            virtualHostname);
389                            }
390                            else {
391                                    if ((virtualHost.getCompanyId() != layoutSet.getCompanyId()) ||
392                                            (virtualHost.getLayoutSetId() !=
393                                                    layoutSet.getLayoutSetId())) {
394    
395                                            throw new LayoutSetVirtualHostException();
396                                    }
397                            }
398                    }
399                    else {
400                            try {
401                                    virtualHostPersistence.removeByC_L(
402                                            layoutSet.getCompanyId(), layoutSet.getLayoutSetId());
403                            }
404                            catch (NoSuchVirtualHostException nsvhe) {
405                            }
406                    }
407    
408                    return layoutSet;
409            }
410    
411            protected LayoutSet initLayoutSet(LayoutSet layoutSet)
412                    throws PortalException {
413    
414                    Group group = layoutSet.getGroup();
415    
416                    boolean privateLayout = layoutSet.isPrivateLayout();
417    
418                    if (group.isStagingGroup()) {
419                            LayoutSet liveLayoutSet = null;
420    
421                            Group liveGroup = group.getLiveGroup();
422    
423                            if (privateLayout) {
424                                    liveLayoutSet = liveGroup.getPrivateLayoutSet();
425                            }
426                            else {
427                                    liveLayoutSet = liveGroup.getPublicLayoutSet();
428                            }
429    
430                            layoutSet.setLogoId(liveLayoutSet.getLogoId());
431    
432                            if (liveLayoutSet.isLogo()) {
433                                    Image logoImage = imageLocalService.getImage(
434                                            liveLayoutSet.getLogoId());
435    
436                                    long logoId = counterLocalService.increment();
437    
438                                    imageLocalService.updateImage(
439                                            logoId, logoImage.getTextObj(), logoImage.getType(),
440                                            logoImage.getHeight(), logoImage.getWidth(),
441                                            logoImage.getSize());
442    
443                                    layoutSet.setLogoId(logoId);
444                            }
445    
446                            layoutSet.setThemeId(liveLayoutSet.getThemeId());
447                            layoutSet.setColorSchemeId(liveLayoutSet.getColorSchemeId());
448                            layoutSet.setCss(liveLayoutSet.getCss());
449                            layoutSet.setSettings(liveLayoutSet.getSettings());
450                    }
451                    else {
452                            layoutSet.setThemeId(
453                                    ThemeFactoryUtil.getDefaultRegularThemeId(
454                                            group.getCompanyId()));
455                            layoutSet.setColorSchemeId(
456                                    ColorSchemeFactoryUtil.getDefaultRegularColorSchemeId());
457                            layoutSet.setCss(StringPool.BLANK);
458                            layoutSet.setSettings(StringPool.BLANK);
459                    }
460    
461                    return layoutSet;
462            }
463    
464            private static final Log _log = LogFactoryUtil.getLog(
465                    LayoutSetLocalServiceImpl.class);
466    
467    }