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.portal.service;
016    
017    import com.liferay.portal.NoSuchUserException;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.kernel.upload.UploadPortletRequest;
021    import com.liferay.portal.kernel.util.ArrayUtil;
022    import com.liferay.portal.kernel.util.Constants;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.StringUtil;
025    import com.liferay.portal.kernel.util.Validator;
026    import com.liferay.portal.kernel.util.WebKeys;
027    import com.liferay.portal.kernel.workflow.WorkflowConstants;
028    import com.liferay.portal.model.Group;
029    import com.liferay.portal.model.GroupConstants;
030    import com.liferay.portal.model.PortletPreferencesIds;
031    import com.liferay.portal.model.User;
032    import com.liferay.portal.theme.ThemeDisplay;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portlet.PortletPreferencesFactoryUtil;
035    import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil;
036    
037    import java.io.Serializable;
038    
039    import java.util.ArrayList;
040    import java.util.Date;
041    import java.util.Enumeration;
042    import java.util.HashMap;
043    import java.util.List;
044    import java.util.Map;
045    
046    import javax.portlet.PortletRequest;
047    
048    import javax.servlet.http.HttpServletRequest;
049    
050    /**
051     * @author Brian Wing Shun Chan
052     * @author Raymond Aug??
053     */
054    public class ServiceContextFactory {
055    
056            public static ServiceContext getInstance(HttpServletRequest request)
057                    throws PortalException, SystemException {
058    
059                    ServiceContext serviceContext = new ServiceContext();
060    
061                    // Theme display
062    
063                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
064                            WebKeys.THEME_DISPLAY);
065    
066                    if (themeDisplay != null) {
067                            serviceContext.setCompanyId(themeDisplay.getCompanyId());
068                            serviceContext.setLanguageId(themeDisplay.getLanguageId());
069                            serviceContext.setLayoutFullURL(
070                                    PortalUtil.getCanonicalURL(
071                                            PortalUtil.getLayoutFullURL(themeDisplay), themeDisplay,
072                                            themeDisplay.getLayout(), true));
073                            serviceContext.setLayoutURL(
074                                    PortalUtil.getCanonicalURL(
075                                            PortalUtil.getLayoutURL(themeDisplay), themeDisplay,
076                                            themeDisplay.getLayout(), true));
077                            serviceContext.setPlid(themeDisplay.getPlid());
078                            serviceContext.setScopeGroupId(themeDisplay.getScopeGroupId());
079                            serviceContext.setSignedIn(themeDisplay.isSignedIn());
080                            serviceContext.setTimeZone(themeDisplay.getTimeZone());
081    
082                            User user = themeDisplay.getUser();
083    
084                            serviceContext.setUserDisplayURL(user.getDisplayURL(themeDisplay));
085                            serviceContext.setUserId(user.getUserId());
086                    }
087                    else {
088                            long companyId = PortalUtil.getCompanyId(request);
089    
090                            serviceContext.setCompanyId(companyId);
091    
092                            Group guestGroup = GroupLocalServiceUtil.getGroup(
093                                    serviceContext.getCompanyId(), GroupConstants.GUEST);
094    
095                            serviceContext.setScopeGroupId(guestGroup.getGroupId());
096    
097                            long plid = LayoutLocalServiceUtil.getDefaultPlid(
098                                    serviceContext.getScopeGroupId(), false);
099    
100                            serviceContext.setPlid(plid);
101    
102                            User user = null;
103    
104                            try {
105                                    user = PortalUtil.getUser(request);
106                            }
107                            catch (NoSuchUserException nsue) {
108    
109                                    // LPS-24160
110    
111                            }
112    
113                            if (user != null) {
114                                    serviceContext.setSignedIn(!user.isDefaultUser());
115                                    serviceContext.setUserId(user.getUserId());
116                            }
117                            else {
118                                    serviceContext.setSignedIn(false);
119                            }
120                    }
121    
122                    serviceContext.setPortalURL(PortalUtil.getPortalURL(request));
123                    serviceContext.setPathMain(PortalUtil.getPathMain());
124                    serviceContext.setPathFriendlyURLPrivateGroup(
125                            PortalUtil.getPathFriendlyURLPrivateGroup());
126                    serviceContext.setPathFriendlyURLPrivateUser(
127                            PortalUtil.getPathFriendlyURLPrivateUser());
128                    serviceContext.setPathFriendlyURLPublic(
129                            PortalUtil.getPathFriendlyURLPublic());
130    
131                    // Attributes
132    
133                    Map<String, Serializable> attributes =
134                            new HashMap<String, Serializable>();
135    
136                    Map<String, String[]> parameters = request.getParameterMap();
137    
138                    for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
139                            String name = entry.getKey();
140                            String[] values = entry.getValue();
141    
142                            if (ArrayUtil.isNotEmpty(values)) {
143                                    if (values.length == 1) {
144                                            attributes.put(name, values[0]);
145                                    }
146                                    else {
147                                            attributes.put(name, values);
148                                    }
149                            }
150                    }
151    
152                    serviceContext.setAttributes(attributes);
153    
154                    // Command
155    
156                    String cmd = ParamUtil.getString(request, Constants.CMD);
157    
158                    serviceContext.setCommand(cmd);
159    
160                    // Current URL
161    
162                    String currentURL = PortalUtil.getCurrentURL(request);
163    
164                    serviceContext.setCurrentURL(currentURL);
165    
166                    // Form date
167    
168                    long formDateLong = ParamUtil.getLong(request, "formDate");
169    
170                    if (formDateLong > 0) {
171                            Date formDate = new Date(formDateLong);
172    
173                            serviceContext.setFormDate(formDate);
174                    }
175    
176                    // Permissions
177    
178                    boolean addGroupPermissions = ParamUtil.getBoolean(
179                            request, "addGroupPermissions");
180                    boolean addGuestPermissions = ParamUtil.getBoolean(
181                            request, "addGuestPermissions");
182                    String[] groupPermissions = PortalUtil.getGroupPermissions(request);
183                    String[] guestPermissions = PortalUtil.getGuestPermissions(request);
184    
185                    serviceContext.setAddGroupPermissions(addGroupPermissions);
186                    serviceContext.setAddGuestPermissions(addGuestPermissions);
187                    serviceContext.setGroupPermissions(groupPermissions);
188                    serviceContext.setGuestPermissions(guestPermissions);
189    
190                    // Portlet preferences ids
191    
192                    String portletId = PortalUtil.getPortletId(request);
193    
194                    if (Validator.isNotNull(portletId)) {
195                            PortletPreferencesIds portletPreferencesIds =
196                                    PortletPreferencesFactoryUtil.getPortletPreferencesIds(
197                                            request, portletId);
198    
199                            serviceContext.setPortletPreferencesIds(portletPreferencesIds);
200                    }
201    
202                    // Request
203    
204                    Map<String, String> headerMap = new HashMap<String, String>();
205    
206                    Enumeration<String> enu = request.getHeaderNames();
207    
208                    while (enu.hasMoreElements()) {
209                            String header = enu.nextElement();
210    
211                            String value = request.getHeader(header);
212    
213                            headerMap.put(header, value);
214                    }
215    
216                    serviceContext.setHeaders(headerMap);
217    
218                    serviceContext.setRemoteAddr(request.getRemoteAddr());
219                    serviceContext.setRemoteHost(request.getRemoteHost());
220                    serviceContext.setRequest(request);
221    
222                    // Asset
223    
224                    Map<String, String[]> parameterMap = request.getParameterMap();
225    
226                    List<Long> assetCategoryIdsList = new ArrayList<Long>();
227    
228                    boolean updateAssetCategoryIds = false;
229    
230                    for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
231                            String name = entry.getKey();
232    
233                            if (name.startsWith("assetCategoryIds")) {
234                                    updateAssetCategoryIds = true;
235    
236                                    long[] assetVocabularyAssetCategoryIds = StringUtil.split(
237                                            ParamUtil.getString(request, name), 0L);
238    
239                                    for (long assetCategoryId : assetVocabularyAssetCategoryIds) {
240                                            assetCategoryIdsList.add(assetCategoryId);
241                                    }
242                            }
243                    }
244    
245                    if (updateAssetCategoryIds) {
246                            long[] assetCategoryIds = ArrayUtil.toArray(
247                                    assetCategoryIdsList.toArray(
248                                            new Long[assetCategoryIdsList.size()]));
249    
250                            serviceContext.setAssetCategoryIds(assetCategoryIds);
251                    }
252    
253                    boolean assetEntryVisible = ParamUtil.getBoolean(
254                            request, "assetEntryVisible", true);
255    
256                    serviceContext.setAssetEntryVisible(assetEntryVisible);
257    
258                    String assetLinkEntryIdsString = request.getParameter(
259                            "assetLinksSearchContainerPrimaryKeys");
260    
261                    if (assetLinkEntryIdsString != null) {
262                            long[] assetLinkEntryIds = StringUtil.split(
263                                    assetLinkEntryIdsString, 0L);
264    
265                            serviceContext.setAssetLinkEntryIds(assetLinkEntryIds);
266                    }
267    
268                    String assetTagNamesString = request.getParameter("assetTagNames");
269    
270                    if (assetTagNamesString != null) {
271                            String[] assetTagNames = StringUtil.split(assetTagNamesString);
272    
273                            serviceContext.setAssetTagNames(assetTagNames);
274                    }
275    
276                    // Workflow
277    
278                    int workflowAction = ParamUtil.getInteger(
279                            request, "workflowAction", WorkflowConstants.ACTION_PUBLISH);
280    
281                    serviceContext.setWorkflowAction(workflowAction);
282    
283                    return serviceContext;
284            }
285    
286            public static ServiceContext getInstance(PortletRequest portletRequest)
287                    throws PortalException, SystemException {
288    
289                    // Theme display
290    
291                    ServiceContext serviceContext =
292                            ServiceContextThreadLocal.getServiceContext();
293    
294                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
295                            WebKeys.THEME_DISPLAY);
296    
297                    if (serviceContext != null) {
298                            serviceContext = (ServiceContext)serviceContext.clone();
299                    }
300                    else {
301                            serviceContext = new ServiceContext();
302    
303                            serviceContext.setCompanyId(themeDisplay.getCompanyId());
304                            serviceContext.setLanguageId(themeDisplay.getLanguageId());
305                            serviceContext.setLayoutFullURL(
306                                    PortalUtil.getLayoutFullURL(themeDisplay));
307                            serviceContext.setLayoutURL(PortalUtil.getLayoutURL(themeDisplay));
308                            serviceContext.setPathFriendlyURLPrivateGroup(
309                                    PortalUtil.getPathFriendlyURLPrivateGroup());
310                            serviceContext.setPathFriendlyURLPrivateUser(
311                                    PortalUtil.getPathFriendlyURLPrivateUser());
312                            serviceContext.setPathFriendlyURLPublic(
313                                    PortalUtil.getPathFriendlyURLPublic());
314                            serviceContext.setPathMain(PortalUtil.getPathMain());
315                            serviceContext.setPlid(themeDisplay.getPlid());
316                            serviceContext.setPortalURL(
317                                    PortalUtil.getPortalURL(portletRequest));
318                            serviceContext.setSignedIn(themeDisplay.isSignedIn());
319                            serviceContext.setTimeZone(themeDisplay.getTimeZone());
320    
321                            User user = themeDisplay.getUser();
322    
323                            serviceContext.setUserDisplayURL(user.getDisplayURL(themeDisplay));
324                            serviceContext.setUserId(user.getUserId());
325                    }
326    
327                    serviceContext.setScopeGroupId(themeDisplay.getScopeGroupId());
328    
329                    // Attributes
330    
331                    Map<String, Serializable> attributes =
332                            new HashMap<String, Serializable>();
333    
334                    Enumeration<String> enu = portletRequest.getParameterNames();
335    
336                    while (enu.hasMoreElements()) {
337                            String param = enu.nextElement();
338    
339                            String[] values = portletRequest.getParameterValues(param);
340    
341                            if (ArrayUtil.isNotEmpty(values)) {
342                                    if (values.length == 1) {
343                                            attributes.put(param, values[0]);
344                                    }
345                                    else {
346                                            attributes.put(param, values);
347                                    }
348                            }
349                    }
350    
351                    serviceContext.setAttributes(attributes);
352    
353                    // Command
354    
355                    String cmd = ParamUtil.getString(portletRequest, Constants.CMD);
356    
357                    serviceContext.setCommand(cmd);
358    
359                    // Current URL
360    
361                    String currentURL = PortalUtil.getCurrentURL(portletRequest);
362    
363                    serviceContext.setCurrentURL(currentURL);
364    
365                    // Form date
366    
367                    long formDateLong = ParamUtil.getLong(portletRequest, "formDate");
368    
369                    if (formDateLong > 0) {
370                            Date formDate = new Date(formDateLong);
371    
372                            serviceContext.setFormDate(formDate);
373                    }
374    
375                    // Permissions
376    
377                    boolean addGroupPermissions = ParamUtil.getBoolean(
378                            portletRequest, "addGroupPermissions");
379                    boolean addGuestPermissions = ParamUtil.getBoolean(
380                            portletRequest, "addGuestPermissions");
381                    String[] groupPermissions = PortalUtil.getGroupPermissions(
382                            portletRequest);
383                    String[] guestPermissions = PortalUtil.getGuestPermissions(
384                            portletRequest);
385    
386                    serviceContext.setAddGroupPermissions(addGroupPermissions);
387                    serviceContext.setAddGuestPermissions(addGuestPermissions);
388                    serviceContext.setGroupPermissions(groupPermissions);
389                    serviceContext.setGuestPermissions(guestPermissions);
390    
391                    // Portlet preferences ids
392    
393                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
394                            portletRequest);
395    
396                    String portletId = PortalUtil.getPortletId(portletRequest);
397    
398                    PortletPreferencesIds portletPreferencesIds =
399                            PortletPreferencesFactoryUtil.getPortletPreferencesIds(
400                                    request, portletId);
401    
402                    serviceContext.setPortletPreferencesIds(portletPreferencesIds);
403    
404                    // Request
405    
406                    Map<String, String> headerMap = new HashMap<String, String>();
407    
408                    enu = request.getHeaderNames();
409    
410                    while (enu.hasMoreElements()) {
411                            String header = enu.nextElement();
412    
413                            String value = request.getHeader(header);
414    
415                            headerMap.put(header, value);
416                    }
417    
418                    serviceContext.setHeaders(headerMap);
419    
420                    serviceContext.setRemoteAddr(request.getRemoteAddr());
421                    serviceContext.setRemoteHost(request.getRemoteHost());
422                    serviceContext.setRequest(request);
423    
424                    // Asset
425    
426                    Map<String, String[]> parameterMap = portletRequest.getParameterMap();
427    
428                    List<Long> assetCategoryIdsList = new ArrayList<Long>();
429    
430                    boolean updateAssetCategoryIds = false;
431    
432                    for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
433                            String name = entry.getKey();
434    
435                            if (name.startsWith("assetCategoryIds")) {
436                                    updateAssetCategoryIds = true;
437    
438                                    long[] assetVocabularyAssetCategoryIds = StringUtil.split(
439                                            ParamUtil.getString(portletRequest, name), 0L);
440    
441                                    for (long assetCategoryId : assetVocabularyAssetCategoryIds) {
442                                            assetCategoryIdsList.add(assetCategoryId);
443                                    }
444                            }
445                    }
446    
447                    if (updateAssetCategoryIds) {
448                            long[] assetCategoryIds = ArrayUtil.toArray(
449                                    assetCategoryIdsList.toArray(
450                                            new Long[assetCategoryIdsList.size()]));
451    
452                            serviceContext.setAssetCategoryIds(assetCategoryIds);
453                    }
454    
455                    boolean assetEntryVisible = ParamUtil.getBoolean(
456                            portletRequest, "assetEntryVisible", true);
457    
458                    serviceContext.setAssetEntryVisible(assetEntryVisible);
459    
460                    String assetLinkEntryIdsString = request.getParameter(
461                            "assetLinksSearchContainerPrimaryKeys");
462    
463                    if (assetLinkEntryIdsString != null) {
464                            long[] assetLinkEntryIds = StringUtil.split(
465                                    assetLinkEntryIdsString, 0L);
466    
467                            serviceContext.setAssetLinkEntryIds(assetLinkEntryIds);
468                    }
469    
470                    String assetTagNamesString = request.getParameter("assetTagNames");
471    
472                    if (assetTagNamesString != null) {
473                            String[] assetTagNames = StringUtil.split(assetTagNamesString);
474    
475                            serviceContext.setAssetTagNames(assetTagNames);
476                    }
477    
478                    // Workflow
479    
480                    int workflowAction = ParamUtil.getInteger(
481                            portletRequest, "workflowAction", WorkflowConstants.ACTION_PUBLISH);
482    
483                    serviceContext.setWorkflowAction(workflowAction);
484    
485                    return serviceContext;
486            }
487    
488            public static ServiceContext getInstance(
489                            String className, PortletRequest portletRequest)
490                    throws PortalException, SystemException {
491    
492                    ServiceContext serviceContext = getInstance(portletRequest);
493    
494                    // Permissions
495    
496                    String[] groupPermissions = PortalUtil.getGroupPermissions(
497                            portletRequest, className);
498                    String[] guestPermissions = PortalUtil.getGuestPermissions(
499                            portletRequest, className);
500    
501                    if (groupPermissions != null) {
502                            serviceContext.setGroupPermissions(groupPermissions);
503                    }
504    
505                    if (guestPermissions != null) {
506                            serviceContext.setGuestPermissions(guestPermissions);
507                    }
508    
509                    // Expando
510    
511                    Map<String, Serializable> expandoBridgeAttributes =
512                            PortalUtil.getExpandoBridgeAttributes(
513                                    ExpandoBridgeFactoryUtil.getExpandoBridge(
514                                            serviceContext.getCompanyId(), className),
515                                    portletRequest);
516    
517                    serviceContext.setExpandoBridgeAttributes(expandoBridgeAttributes);
518    
519                    return serviceContext;
520            }
521    
522            public static ServiceContext getInstance(
523                            String className, UploadPortletRequest uploadPortletRequest)
524                    throws PortalException, SystemException {
525    
526                    ServiceContext serviceContext = getInstance(uploadPortletRequest);
527    
528                    // Permissions
529    
530                    String[] groupPermissions = PortalUtil.getGroupPermissions(
531                            uploadPortletRequest, className);
532                    String[] guestPermissions = PortalUtil.getGuestPermissions(
533                            uploadPortletRequest, className);
534    
535                    if (groupPermissions != null) {
536                            serviceContext.setGroupPermissions(groupPermissions);
537                    }
538    
539                    if (guestPermissions != null) {
540                            serviceContext.setGuestPermissions(guestPermissions);
541                    }
542    
543                    // Expando
544    
545                    Map<String, Serializable> expandoBridgeAttributes =
546                            PortalUtil.getExpandoBridgeAttributes(
547                                    ExpandoBridgeFactoryUtil.getExpandoBridge(
548                                            serviceContext.getCompanyId(), className),
549                                    uploadPortletRequest);
550    
551                    serviceContext.setExpandoBridgeAttributes(expandoBridgeAttributes);
552    
553                    return serviceContext;
554            }
555    
556    }