001/*
002 * (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     dmetzler
016 */
017package org.nuxeo.ecm.restapi.server.jaxrs.usermanager;
018
019import java.io.Serializable;
020
021import javax.ws.rs.core.Response;
022
023import org.nuxeo.ecm.core.api.DocumentModel;
024import org.nuxeo.ecm.core.api.NuxeoGroup;
025import org.nuxeo.ecm.platform.query.api.PageProviderDefinition;
026import org.nuxeo.ecm.platform.query.api.PageProviderService;
027import org.nuxeo.ecm.platform.usermanager.UserManager;
028import org.nuxeo.ecm.webengine.WebException;
029import org.nuxeo.ecm.webengine.model.WebObject;
030import org.nuxeo.runtime.api.Framework;
031
032/**
033 * @since 5.7.3
034 */
035@WebObject(type = "groups")
036public class GroupRootObject extends AbstractUMRootObject<NuxeoGroup> {
037
038    public static final String PAGE_PROVIDER_NAME = "nuxeo_groups_listing";
039
040    @Override
041    protected NuxeoGroup getArtifact(String id) {
042        return um.getGroup(id);
043    }
044
045    @Override
046    protected String getArtifactType() {
047        return "group";
048    }
049
050    @Override
051    protected void checkPrecondition(NuxeoGroup group) {
052        checkCurrentUserCanCreateArtifact(group);
053        checkGroupHasAName(group);
054        checkGroupDoesNotAlreadyExists(group, um);
055    }
056
057    @Override
058    protected NuxeoGroup createArtifact(NuxeoGroup group) {
059        DocumentModel groupModel = buildModelFromGroup(group, um);
060
061        um.createGroup(groupModel);
062        return um.getGroup(group.getName());
063    }
064
065    private DocumentModel buildModelFromGroup(NuxeoGroup group, UserManager um) {
066        DocumentModel groupModel = um.getBareGroupModel();
067        String schemaName = um.getGroupSchemaName();
068        groupModel.setProperty(schemaName, um.getGroupIdField(), group.getName());
069        groupModel.setProperty(schemaName, um.getGroupLabelField(), group.getLabel());
070
071        groupModel.setPropertyValue(um.getGroupMembersField(), (Serializable) group.getMemberUsers());
072        groupModel.setPropertyValue(um.getGroupSubGroupsField(), (Serializable) group.getMemberGroups());
073        return groupModel;
074    }
075
076    private void checkGroupDoesNotAlreadyExists(NuxeoGroup group, UserManager um) {
077        if (um.getGroup(group.getName()) != null) {
078            throw new WebException("Group already exists", Response.Status.PRECONDITION_FAILED.getStatusCode());
079        }
080    }
081
082    private void checkGroupHasAName(NuxeoGroup group) {
083        if (group.getName() == null) {
084            throw new WebException("Group MUST have a name", Response.Status.PRECONDITION_FAILED.getStatusCode());
085        }
086    }
087
088    @Override
089    boolean isAPowerUserEditableArtifact(NuxeoGroup artifact) {
090        return isAPowerUserEditableGroup(artifact);
091
092    }
093
094    static boolean isAPowerUserEditableGroup(NuxeoGroup group) {
095        UserManager um = Framework.getLocalService(UserManager.class);
096        return !um.getAdministratorsGroups().contains(group.getName());
097
098    }
099
100    @Override
101    protected PageProviderDefinition getPageProviderDefinition() {
102        PageProviderService ppService = Framework.getLocalService(PageProviderService.class);
103        return ppService.getPageProviderDefinition(PAGE_PROVIDER_NAME);
104    }
105
106}