001/*
002 *  Copyright 2026 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016
017package org.ametys.cms.repository;
018
019import java.util.Map;
020import java.util.Set;
021
022import javax.jcr.Node;
023
024import org.ametys.core.group.GroupIdentity;
025import org.ametys.core.right.ProfileAssignmentStorage.AnonymousOrAnyConnectedKeys;
026import org.ametys.core.right.ProfileAssignmentStorage.UserOrGroup;
027import org.ametys.core.user.UserIdentity;
028import org.ametys.plugins.repository.AmetysObject;
029import org.ametys.plugins.repository.AmetysObjectIterable;
030import org.ametys.plugins.repository.AmetysRepositoryException;
031import org.ametys.plugins.repository.ModifiableACLAmetysObject;
032import org.ametys.plugins.repository.RepositoryIntegrityViolationException;
033import org.ametys.plugins.repository.TraversableAmetysObject;
034import org.ametys.plugins.repository.UnknownAmetysObjectException;
035import org.ametys.plugins.repository.jcr.ACLJCRAmetysObjectHelper;
036import org.ametys.plugins.repository.jcr.JCRTraversableAmetysObject;
037
038/**
039 * Default implementation of a {@link TraversableAmetysObject}, backed by a JCR node.<br>
040 * This implementation heavily relies on its {@link DefaultIndexableTraversableAmetysObjectFactory} counterpart.
041 * @param <F> the actual type of factory.
042 */
043public class DefaultIndexableTraversableAmetysObject<F extends DefaultIndexableTraversableAmetysObjectFactory> extends SimpleIndexableAmetysObject<F> implements JCRTraversableAmetysObject, ModifiableACLAmetysObject
044{
045    private DefaultIndexableTraversableAmetysObjectFactory _traversableFactory;
046    
047    /**
048     * Creates a DefaultModelAwareTraversableAmetysObject.
049     * @param node the node backing this {@link AmetysObject}.
050     * @param parentPath the parent path in the Ametys hierarchy.
051     * @param factory the {@link DefaultIndexableTraversableAmetysObjectFactory} which creates the AmetysObject.
052     */
053    public DefaultIndexableTraversableAmetysObject(Node node, String parentPath, F factory)
054    {
055        super(node, parentPath, factory);
056        _traversableFactory = factory;
057    }
058
059    public boolean hasChild(String name) throws AmetysRepositoryException
060    {
061        return _traversableFactory.hasChild(this, name);
062    }
063
064    @SuppressWarnings("unchecked")
065    public <A extends AmetysObject> A createChild(String name, String type) throws AmetysRepositoryException, RepositoryIntegrityViolationException
066    {
067        return (A) _traversableFactory.createChild(this, name, type);
068    }
069    
070    @SuppressWarnings("unchecked")
071    public <A extends AmetysObject> A getChild(String path) throws AmetysRepositoryException, UnknownAmetysObjectException
072    {
073        return (A) _traversableFactory.getChild(this, path);
074    }
075
076    public <A extends AmetysObject> AmetysObjectIterable<A> getChildren() throws AmetysRepositoryException
077    {
078        return _traversableFactory.getChildren(this);
079    }
080
081    public Map<AnonymousOrAnyConnectedKeys, Set<String>> getProfilesForAnonymousAndAnyConnectedUser()
082    {
083        return ACLJCRAmetysObjectHelper.getProfilesForAnonymousAndAnyConnectedUser(getNode());
084    }
085    
086    public Map<GroupIdentity, Map<UserOrGroup, Set<String>>> getProfilesForGroups(Set<GroupIdentity> groups)
087    {
088        return ACLJCRAmetysObjectHelper.getProfilesForGroups(getNode(), groups);
089    }
090    
091    public Map<UserIdentity, Map<UserOrGroup, Set<String>>> getProfilesForUsers(UserIdentity user)
092    {
093        return ACLJCRAmetysObjectHelper.getProfilesForUsers(getNode(), user);
094    }
095    
096    public void addAllowedProfilesForAnyConnectedUser(Set<String> profileIds)
097    {
098        ACLJCRAmetysObjectHelper.addAllowedProfilesForAnyConnectedUser(getNode(), profileIds);
099    }
100    
101    public void removeAllowedProfilesForAnyConnectedUser(Set<String> profileIds)
102    {
103        ACLJCRAmetysObjectHelper.removeAllowedProfilesForAnyConnectedUser(getNode(), profileIds);
104    }
105    
106    public void addDeniedProfilesForAnyConnectedUser(Set<String> profileIds)
107    {
108        ACLJCRAmetysObjectHelper.addDeniedProfilesForAnyConnectedUser(getNode(), profileIds);
109    }
110    
111    public void removeDeniedProfilesForAnyConnectedUser(Set<String> profileIds)
112    {
113        ACLJCRAmetysObjectHelper.removeDeniedProfilesForAnyConnectedUser(getNode(), profileIds);
114    }
115    
116    public void addAllowedProfilesForAnonymous(Set<String> profileIds)
117    {
118        ACLJCRAmetysObjectHelper.addAllowedProfilesForAnonymous(getNode(), profileIds);
119    }
120    
121    public void removeAllowedProfilesForAnonymous(Set<String> profileIds)
122    {
123        ACLJCRAmetysObjectHelper.removeAllowedProfilesForAnonymous(getNode(), profileIds);
124    }
125    
126    public void addDeniedProfilesForAnonymous(Set<String> profileIds)
127    {
128        ACLJCRAmetysObjectHelper.addDeniedProfilesForAnonymous(getNode(), profileIds);
129    }
130    
131    public void removeDeniedProfilesForAnonymous(Set<String> profileIds)
132    {
133        ACLJCRAmetysObjectHelper.removeDeniedProfilesForAnonymous(getNode(), profileIds);
134    }
135    
136    public void addAllowedUsers(Set<UserIdentity> users, String profileId)
137    {
138        ACLJCRAmetysObjectHelper.addAllowedUsers(users, getNode(), profileId);
139    }
140    
141    public void removeAllowedUsers(Set<UserIdentity> users, String profileId)
142    {
143        ACLJCRAmetysObjectHelper.removeAllowedUsers(users, getNode(), profileId);
144    }
145    
146    public void removeAllowedUsers(Set<UserIdentity> users)
147    {
148        ACLJCRAmetysObjectHelper.removeAllowedUsers(users, getNode());
149    }
150    
151    public void addAllowedGroups(Set<GroupIdentity> groups, String profileId)
152    {
153        ACLJCRAmetysObjectHelper.addAllowedGroups(groups, getNode(), profileId);
154    }
155    
156    public void removeAllowedGroups(Set<GroupIdentity> groups, String profileId)
157    {
158        ACLJCRAmetysObjectHelper.removeAllowedGroups(groups, getNode(), profileId);
159    }
160    
161    public void removeAllowedGroups(Set<GroupIdentity> groups)
162    {
163        ACLJCRAmetysObjectHelper.removeAllowedGroups(groups, getNode());
164    }
165    
166    public void addDeniedUsers(Set<UserIdentity> users, String profileId)
167    {
168        ACLJCRAmetysObjectHelper.addDeniedUsers(users, getNode(), profileId);
169    }
170    
171    public void removeDeniedUsers(Set<UserIdentity> users, String profileId)
172    {
173        ACLJCRAmetysObjectHelper.removeDeniedUsers(users, getNode(), profileId);
174    }
175    
176    public void removeDeniedUsers(Set<UserIdentity> users)
177    {
178        ACLJCRAmetysObjectHelper.removeDeniedUsers(users, getNode());
179    }
180    
181    public void addDeniedGroups(Set<GroupIdentity> groups, String profileId)
182    {
183        ACLJCRAmetysObjectHelper.addDeniedGroups(groups, getNode(), profileId);
184    }
185    
186    public void removeDeniedGroups(Set<GroupIdentity> groups, String profileId)
187    {
188        ACLJCRAmetysObjectHelper.removeDeniedGroups(groups, getNode(), profileId);
189    }
190    
191    public void removeDeniedGroups(Set<GroupIdentity> groups)
192    {
193        ACLJCRAmetysObjectHelper.removeDeniedGroups(groups, getNode());
194    }
195    
196    public boolean isInheritanceDisallowed()
197    {
198        return ACLJCRAmetysObjectHelper.isInheritanceDisallowed(getNode());
199    }
200    
201    public void disallowInheritance(boolean disallow)
202    {
203        ACLJCRAmetysObjectHelper.disallowInheritance(getNode(), disallow);
204    }
205}