1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portal.service.impl;
21  
22  import com.liferay.portal.LayoutSetVirtualHostException;
23  import com.liferay.portal.NoSuchCompanyException;
24  import com.liferay.portal.NoSuchLayoutException;
25  import com.liferay.portal.NoSuchLayoutSetException;
26  import com.liferay.portal.PortalException;
27  import com.liferay.portal.SystemException;
28  import com.liferay.portal.kernel.util.Http;
29  import com.liferay.portal.kernel.util.StringPool;
30  import com.liferay.portal.kernel.util.Validator;
31  import com.liferay.portal.model.Group;
32  import com.liferay.portal.model.Layout;
33  import com.liferay.portal.model.LayoutConstants;
34  import com.liferay.portal.model.LayoutSet;
35  import com.liferay.portal.model.impl.ColorSchemeImpl;
36  import com.liferay.portal.model.impl.ThemeImpl;
37  import com.liferay.portal.service.base.LayoutSetLocalServiceBaseImpl;
38  import com.liferay.portal.util.PrefsPropsUtil;
39  import com.liferay.portal.util.PropsKeys;
40  import com.liferay.portal.util.PropsValues;
41  
42  import java.io.File;
43  import java.io.FileInputStream;
44  import java.io.IOException;
45  import java.io.InputStream;
46  
47  import java.util.List;
48  
49  /**
50   * <a href="LayoutSetLocalServiceImpl.java.html"><b><i>View Source</i></b></a>
51   *
52   * @author Brian Wing Shun Chan
53   * @author Julio Camarero
54   * @author Ganesh Ram
55   *
56   */
57  public class LayoutSetLocalServiceImpl extends LayoutSetLocalServiceBaseImpl {
58  
59      public LayoutSet addLayoutSet(long groupId, boolean privateLayout)
60          throws PortalException, SystemException {
61  
62          Group group = groupPersistence.findByPrimaryKey(groupId);
63  
64          long layoutSetId = counterLocalService.increment();
65  
66          LayoutSet layoutSet = layoutSetPersistence.create(layoutSetId);
67  
68          layoutSet.setGroupId(groupId);
69          layoutSet.setCompanyId(group.getCompanyId());
70          layoutSet.setPrivateLayout(privateLayout);
71          layoutSet.setThemeId(
72              ThemeImpl.getDefaultRegularThemeId(group.getCompanyId()));
73          layoutSet.setColorSchemeId(
74              ColorSchemeImpl.getDefaultRegularColorSchemeId());
75          layoutSet.setWapThemeId(
76              ThemeImpl.getDefaultWapThemeId(group.getCompanyId()));
77          layoutSet.setWapColorSchemeId(
78              ColorSchemeImpl.getDefaultWapColorSchemeId());
79          layoutSet.setCss(StringPool.BLANK);
80  
81          layoutSetPersistence.update(layoutSet, false);
82  
83          return layoutSet;
84      }
85  
86      public void deleteLayoutSet(long groupId, boolean privateLayout)
87          throws PortalException, SystemException {
88  
89          LayoutSet layoutSet = layoutSetPersistence.findByG_P(
90              groupId, privateLayout);
91  
92          // Layouts
93  
94          List<Layout> layouts = layoutPersistence.findByG_P_P(
95              groupId, privateLayout, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
96  
97          for (Layout layout : layouts) {
98              try {
99                  layoutLocalService.deleteLayout(layout, false);
100             }
101             catch (NoSuchLayoutException nsle) {
102             }
103         }
104 
105         // Logo
106 
107         imageLocalService.deleteImage(layoutSet.getLogoId());
108 
109         // Layout set
110 
111         layoutSetPersistence.removeByG_P(groupId, privateLayout);
112     }
113 
114     public LayoutSet getLayoutSet(long groupId, boolean privateLayout)
115         throws PortalException, SystemException {
116 
117         return layoutSetPersistence.findByG_P(groupId, privateLayout);
118     }
119 
120     public LayoutSet getLayoutSet(String virtualHost)
121         throws PortalException, SystemException {
122 
123         virtualHost = virtualHost.trim().toLowerCase();
124 
125         return layoutSetPersistence.findByVirtualHost(virtualHost);
126     }
127 
128     public void updateLogo(
129             long groupId, boolean privateLayout, boolean logo, File file)
130         throws PortalException, SystemException {
131 
132         InputStream is = null;
133 
134         if (logo) {
135             try{
136                 is = new FileInputStream(file);
137             }
138             catch (IOException ioe) {
139                 throw new SystemException(ioe);
140             }
141         }
142 
143         updateLogo(groupId, privateLayout, logo, is);
144     }
145 
146     public void updateLogo(
147             long groupId, boolean privateLayout, boolean logo, InputStream is)
148         throws PortalException, SystemException {
149 
150         LayoutSet layoutSet = layoutSetPersistence.findByG_P(
151             groupId, privateLayout);
152 
153         layoutSet.setLogo(logo);
154 
155         if (logo) {
156             long logoId = layoutSet.getLogoId();
157 
158             if (logoId <= 0) {
159                 logoId = counterLocalService.increment();
160 
161                 layoutSet.setLogoId(logoId);
162             }
163         }
164 
165         layoutSetPersistence.update(layoutSet, false);
166 
167         if (logo) {
168             imageLocalService.updateImage(layoutSet.getLogoId(), is);
169         }
170         else {
171             imageLocalService.deleteImage(layoutSet.getLogoId());
172         }
173     }
174 
175     public void updateLookAndFeel(
176             long groupId, String themeId, String colorSchemeId, String css,
177             boolean wapTheme)
178         throws PortalException, SystemException {
179 
180         updateLookAndFeel(
181             groupId, false, themeId, colorSchemeId, css, wapTheme);
182         updateLookAndFeel(
183             groupId, true, themeId, colorSchemeId, css, wapTheme);
184     }
185 
186     public LayoutSet updateLookAndFeel(
187             long groupId, boolean privateLayout, String themeId,
188             String colorSchemeId, String css, boolean wapTheme)
189         throws PortalException, SystemException {
190 
191         LayoutSet layoutSet = layoutSetPersistence.findByG_P(
192             groupId, privateLayout);
193 
194         if (wapTheme) {
195             layoutSet.setWapThemeId(themeId);
196             layoutSet.setWapColorSchemeId(colorSchemeId);
197         }
198         else {
199             layoutSet.setThemeId(themeId);
200             layoutSet.setColorSchemeId(colorSchemeId);
201             layoutSet.setCss(css);
202         }
203 
204         layoutSetPersistence.update(layoutSet, false);
205 
206         if (PrefsPropsUtil.getBoolean(
207                 PropsKeys.THEME_SYNC_ON_GROUP,
208                 PropsValues.THEME_SYNC_ON_GROUP)) {
209 
210             LayoutSet otherLayoutSet = layoutSetPersistence.findByG_P(
211                 layoutSet.getGroupId(), layoutSet.isPrivateLayout());
212 
213             if (wapTheme) {
214                 otherLayoutSet.setWapThemeId(themeId);
215                 otherLayoutSet.setWapColorSchemeId(colorSchemeId);
216             }
217             else {
218                 otherLayoutSet.setThemeId(themeId);
219                 otherLayoutSet.setColorSchemeId(colorSchemeId);
220             }
221 
222             layoutSetPersistence.update(otherLayoutSet, false);
223         }
224 
225         return layoutSet;
226     }
227 
228     public LayoutSet updatePageCount(long groupId, boolean privateLayout)
229         throws PortalException, SystemException {
230 
231         int pageCount = layoutPersistence.countByG_P(groupId, privateLayout);
232 
233         LayoutSet layoutSet = layoutSetPersistence.findByG_P(
234             groupId, privateLayout);
235 
236         layoutSet.setPageCount(pageCount);
237 
238         layoutSetPersistence.update(layoutSet, false);
239 
240         return layoutSet;
241     }
242 
243     public LayoutSet updateVirtualHost(
244             long groupId, boolean privateLayout, String virtualHost)
245         throws PortalException, SystemException {
246 
247         virtualHost = virtualHost.trim().toLowerCase();
248 
249         if (virtualHost.startsWith(Http.HTTP_WITH_SLASH) ||
250             virtualHost.startsWith(Http.HTTPS_WITH_SLASH)) {
251 
252             throw new LayoutSetVirtualHostException();
253         }
254 
255         LayoutSet layoutSet = layoutSetPersistence.findByG_P(
256             groupId, privateLayout);
257 
258         if (Validator.isNotNull(virtualHost)) {
259             try {
260                 LayoutSet virtualHostLayoutSet = getLayoutSet(virtualHost);
261 
262                 if (!layoutSet.equals(virtualHostLayoutSet)) {
263                     throw new LayoutSetVirtualHostException();
264                 }
265             }
266             catch (NoSuchLayoutSetException nslse) {
267             }
268 
269             try {
270                 companyLocalService.getCompanyByVirtualHost(virtualHost);
271 
272                 throw new LayoutSetVirtualHostException();
273             }
274             catch (NoSuchCompanyException nsce) {
275             }
276         }
277 
278         layoutSet.setVirtualHost(virtualHost);
279 
280         layoutSetPersistence.update(layoutSet, false);
281 
282         return layoutSet;
283     }
284 
285 }