/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.opensocial.shindig.service;
import com.liferay.document.library.kernel.model.DLFolder;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppLocalServiceUtil;
import com.liferay.document.library.kernel.service.DLAppServiceUtil;
import com.liferay.opensocial.shindig.util.SerializerUtil;
import com.liferay.opensocial.shindig.util.ShindigUtil;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.json.JSONException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.social.kernel.model.SocialRelationConstants;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Future;
import javax.servlet.http.HttpServletResponse;
import org.apache.shindig.auth.SecurityToken;
import org.apache.shindig.common.util.ImmediateFuture;
import org.apache.shindig.protocol.ProtocolException;
import org.apache.shindig.protocol.RestfulCollection;
import org.apache.shindig.social.core.model.AlbumImpl;
import org.apache.shindig.social.opensocial.model.Album;
import org.apache.shindig.social.opensocial.spi.AlbumService;
import org.apache.shindig.social.opensocial.spi.CollectionOptions;
import org.apache.shindig.social.opensocial.spi.GroupId;
import org.apache.shindig.social.opensocial.spi.UserId;
/**
* @author Dennis Ju
*/
public class LiferayAlbumService implements AlbumService {
public Future<Void> createAlbum(
UserId userId, String appId, Album album,
SecurityToken securityToken)
throws ProtocolException {
try {
doCreateAlbum(userId, appId, album, securityToken);
return ImmediateFuture.newInstance(null);
}
catch (Exception e) {
if (_log.isDebugEnabled()) {
_log.debug(e, e);
}
throw new ProtocolException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage(),
e);
}
}
public Future<Void> deleteAlbum(
UserId userId, String appId, String albumId,
SecurityToken securityToken)
throws ProtocolException {
try {
doDeleteAlbum(userId, appId, albumId, securityToken);
return ImmediateFuture.newInstance(null);
}
catch (Exception e) {
if (_log.isDebugEnabled()) {
_log.debug(e, e);
}
throw new ProtocolException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage(),
e);
}
}
public Future<Album> getAlbum(
UserId userId, String appId, Set<String> fields, String albumId,
SecurityToken securityToken)
throws ProtocolException {
try {
Album album = doGetAlbum(
userId, appId, fields, albumId, securityToken);
return ImmediateFuture.newInstance(album);
}
catch (Exception e) {
if (_log.isDebugEnabled()) {
_log.debug(e, e);
}
throw new ProtocolException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage(),
e);
}
}
public Future<RestfulCollection<Album>> getAlbums(
Set<UserId> userIds, GroupId groupId, String appId,
Set<String> fields, CollectionOptions collectionOptions,
SecurityToken securityToken)
throws ProtocolException {
try {
RestfulCollection<Album> albums = doGetAlbums(
userIds, groupId, appId, fields, collectionOptions,
securityToken);
return ImmediateFuture.newInstance(albums);
}
catch (Exception e) {
if (_log.isDebugEnabled()) {
_log.debug(e, e);
}
throw new ProtocolException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage(),
e);
}
}
public Future<RestfulCollection<Album>> getAlbums(
UserId userId, String appId, Set<String> fields,
CollectionOptions collectionOptions, Set<String> albumIds,
SecurityToken securityToken)
throws ProtocolException {
try {
RestfulCollection<Album> albums = doGetAlbums(
userId, appId, fields, collectionOptions, albumIds,
securityToken);
return ImmediateFuture.newInstance(albums);
}
catch (Exception e) {
if (_log.isDebugEnabled()) {
_log.debug(e, e);
}
throw new ProtocolException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage(),
e);
}
}
public Future<Void> updateAlbum(
UserId userId, String appId, Album album, String albumId,
SecurityToken securityToken)
throws ProtocolException {
try {
doUpdateAlbum(userId, appId, album, albumId, securityToken);
return ImmediateFuture.newInstance(null);
}
catch (Exception e) {
if (_log.isDebugEnabled()) {
_log.debug(e, e);
}
throw new ProtocolException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage(),
e);
}
}
protected void doCreateAlbum(
UserId userId, String appId, Album album,
SecurityToken securityToken)
throws Exception {
doUpdateAlbum(userId, appId, album, null, securityToken);
}
protected void doDeleteAlbum(
UserId userId, String appId, String albumId,
SecurityToken securityToken)
throws Exception {
long albumIdLong = GetterUtil.getLong(albumId);
DLAppServiceUtil.deleteFolder(albumIdLong);
}
protected Album doGetAlbum(
UserId userId, String appId, Set<String> fields, String albumId,
SecurityToken securityToken)
throws Exception {
long albumIdLong = GetterUtil.getLong(albumId);
Folder folder = DLAppServiceUtil.getFolder(albumIdLong);
return toAlbum(folder, fields, securityToken);
}
protected RestfulCollection<Album> doGetAlbums(
Set<UserId> userIds, GroupId groupId, String appId,
Set<String> fields, CollectionOptions collectionOptions,
SecurityToken securityToken)
throws Exception {
List<Album> albums = new ArrayList<>();
for (UserId userId : userIds) {
String userIdString = userId.getUserId(securityToken);
long userIdLong = GetterUtil.getLong(userIdString);
User user = UserLocalServiceUtil.getUserById(userIdLong);
if (!ShindigUtil.isValidUser(user)) {
continue;
}
List<Folder> folders = new ArrayList<>();
GroupId.Type groupIdType = groupId.getType();
if (groupIdType.equals(GroupId.Type.all) ||
groupIdType.equals(GroupId.Type.friends) ||
groupIdType.equals(GroupId.Type.groupId)) {
List<User> socialUsers = UserLocalServiceUtil.getSocialUsers(
user.getUserId(), SocialRelationConstants.TYPE_BI_FRIEND,
QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
for (User socialUser : socialUsers) {
Group group = socialUser.getGroup();
List<Folder> friendFolders = DLAppServiceUtil.getFolders(
group.getGroupId(),
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
folders.addAll(friendFolders);
}
}
else if (groupIdType.equals(GroupId.Type.self)) {
Group group = user.getGroup();
folders = DLAppServiceUtil.getFolders(
group.getGroupId(),
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
}
for (Folder folder : folders) {
Album album = toAlbum(folder, fields, securityToken);
albums.add(album);
}
}
return new RestfulCollection<>(
albums, collectionOptions.getFirst(), albums.size(),
collectionOptions.getMax());
}
protected RestfulCollection<Album> doGetAlbums(
UserId userId, String appId, Set<String> fields,
CollectionOptions collectionOptions, Set<String> albumIds,
SecurityToken securityToken)
throws Exception {
List<Album> albums = new ArrayList<>();
for (String albumId : albumIds) {
Folder folder = DLAppServiceUtil.getFolder(
GetterUtil.getLong(albumId));
Album album = toAlbum(folder, fields, securityToken);
albums.add(album);
}
return new RestfulCollection<>(
albums, collectionOptions.getFirst(), albums.size(),
collectionOptions.getMax());
}
protected void doUpdateAlbum(
UserId userId, String appId, Album album, String albumId,
SecurityToken securityToken)
throws Exception {
long userIdLong = GetterUtil.getLong(userId.getUserId(securityToken));
User user = UserLocalServiceUtil.getUserById(userIdLong);
if (!ShindigUtil.isValidUser(user)) {
return;
}
Group group = user.getGroup();
long groupIdLong = group.getGroupId();
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(true);
serviceContext.setAddGuestPermissions(true);
serviceContext.setExpandoBridgeAttributes(
SerializerUtil.toExpandoAttributes(
album, _ALBUM_FIELDS, user.getCompanyId(),
DLFolder.class.getName()));
serviceContext.setScopeGroupId(groupIdLong);
if (albumId == null) {
DLAppServiceUtil.addFolder(
groupIdLong, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
album.getTitle(), album.getDescription(), serviceContext);
}
else {
Folder folder = DLAppLocalServiceUtil.getFolder(
GetterUtil.getLong(albumId));
DLAppServiceUtil.updateFolder(
folder.getFolderId(), album.getTitle(), album.getDescription(),
serviceContext);
}
}
protected Album toAlbum(
Folder folder, Set<String> fields, SecurityToken securityToken)
throws JSONException {
Album album = new AlbumImpl();
album.setDescription(folder.getDescription());
album.setId(String.valueOf(folder.getFolderId()));
album.setOwnerId(String.valueOf(folder.getUserId()));
album.setTitle(folder.getName());
SerializerUtil.copyProperties(
folder.getAttributes(), album, _ALBUM_FIELDS);
return album;
}
private static final Album.Field[] _ALBUM_FIELDS = {
Album.Field.LOCATION, Album.Field.THUMBNAIL_URL
};
private static final Log _log = LogFactoryUtil.getLog(
LiferayAlbumService.class);
}