/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cc.kune.lists.server;
import cc.kune.core.client.errors.AccessViolationException;
import cc.kune.core.server.UserSessionManager;
import cc.kune.core.server.content.ContainerManager;
import cc.kune.core.server.content.ContentUtils;
import cc.kune.core.server.rpc.ContentRPC;
import cc.kune.core.shared.domain.GroupListMode;
import cc.kune.core.shared.domain.utils.StateToken;
import cc.kune.core.shared.dto.StateContainerDTO;
import cc.kune.core.shared.dto.StateContentDTO;
import cc.kune.domain.AccessLists;
import cc.kune.domain.Container;
import cc.kune.domain.Group;
import cc.kune.lists.shared.ListsToolConstants;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class ListServerServiceDefault implements ListServerService {
private final ContainerManager contentManager;
private final ContentRPC contentRPC;
private final UserSessionManager userSessionManager;
@Inject
public ListServerServiceDefault(final ContentRPC contentRPC,
final UserSessionManager userSessionManager, final ContainerManager contentManager) {
this.contentRPC = contentRPC;
this.userSessionManager = userSessionManager;
this.contentManager = contentManager;
}
private String composeListName(final StateToken parentToken, final String listname) {
// FIXME In the future use tags here
return parentToken.getGroup() + "-" + listname;
}
@Override
public StateContainerDTO createList(final String userHash, final StateToken parentToken,
final String listName, final String description, final boolean isPublic) {
final StateContainerDTO newList = contentRPC.addFolder(userHash, parentToken,
composeListName(parentToken, listName), ListsToolConstants.TYPE_LIST);
setContainerAcl(newList.getStateToken(), isPublic);
// Not public list, don't permit subscriptions neither view posts
return subscribeCurrentUserToList(newList.getStateToken(), true);
}
private Container getContainer(final StateToken token) {
final Container container = contentManager.find(ContentUtils.parseId(token.getFolder()));
if (!container.getTypeId().equals(ListsToolConstants.TYPE_LIST)) {
throw new RuntimeException("This container is not a list!");
}
return container;
}
private Group getUserGroup() {
return userSessionManager.getUser().getUserGroup();
}
@Override
public StateContentDTO newPost(final String userHash, final StateToken parentToken,
final String postTitle) {
final Container container = getContainer(parentToken);
final StateContentDTO content = contentRPC.addContent(userHash, parentToken,
"[" + container.getName() + "] " + postTitle, ListsToolConstants.TYPE_POST);
// FIXME In the future use tabs here
return content;
}
private Container setContainerAcl(final StateToken token, final boolean isPublic) {
final Container container = getContainer(token);
final AccessLists acl = new AccessLists();
acl.getAdmins().setMode(GroupListMode.NORMAL);
acl.getAdmins().add(getUserGroup());
acl.getEditors().setMode(isPublic ? GroupListMode.EVERYONE : GroupListMode.NOBODY);
setViewersAcl(isPublic, acl);
contentManager.setAccessList(container, acl);
return container;
}
@Override
public StateContainerDTO setPublic(final StateToken token, final Boolean isPublic) {
final Container container = setPublicAcl(token, isPublic);
return contentRPC.getState(container);
}
private Container setPublicAcl(final StateToken token, final boolean isPublic) {
final Container container = getContainer(token);
final AccessLists acl = container.getAccessLists();
setViewersAcl(isPublic, acl);
contentManager.setAccessList(container, acl);
return container;
}
private void setViewersAcl(final boolean isPublic, final AccessLists acl) {
acl.getViewers().clear();
acl.getViewers().setMode(isPublic ? GroupListMode.EVERYONE : GroupListMode.NOBODY);
}
@Override
public StateContainerDTO subscribeCurrentUserToList(final StateToken token, final Boolean subscribe) {
final Group userGroup = getUserGroup();
return subscribeToList(token, subscribe, userGroup);
}
private StateContainerDTO subscribeToList(final StateToken token, final Boolean subscribe,
final Group userGroup) {
final Container container = getContainer(token);
final AccessLists acl = container.getAccessLists();
if (subscribe) {
if (!acl.getAdmins().includes(userGroup)
&& acl.getViewers().getMode().equals(GroupListMode.NOBODY)) {
// Not public list, don't permit subscriptions neither view posts
throw new AccessViolationException();
} else {
acl.getEditors().add(userGroup);
}
} else {
acl.getEditors().remove(userGroup);
}
contentManager.setAccessList(container, acl);
return contentRPC.getState(container);
}
/**
* This is used by invitations when confirmed
*/
@Override
public StateContainerDTO subscribeToListWithoutPermCheck(final StateToken token,
final Group userGroup, final Boolean subscribe) {
final Container container = getContainer(token);
final AccessLists acl = container.getAccessLists();
if (subscribe) {
acl.getEditors().add(userGroup);
} else {
acl.getEditors().add(userGroup);
}
contentManager.setAccessList(container, acl);
return contentRPC.getState(container);
}
}