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