001/*
002 * ModeShape (http://www.modeshape.org)
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 */
016package org.modeshape.web.shared;
017
018import java.io.Serializable;
019import java.util.ArrayList;
020import java.util.Collection;
021import javax.jcr.security.Privilege;
022
023/**
024 *
025 * @author kulikov
026 */
027public class Policy implements Serializable {
028    
029    private JcrPermission LIFECYCLE_MANAGEMENT = new JcrPermission(Privilege.JCR_LIFECYCLE_MANAGEMENT, "Life cycle management");
030    private JcrPermission LOCK_MANAGEMENT = new JcrPermission(Privilege.JCR_LOCK_MANAGEMENT, "Lock management");
031    private JcrPermission NODE_TYPE_MANAGEMENT = new JcrPermission(Privilege.JCR_NODE_TYPE_MANAGEMENT, "Node type management");
032    private JcrPermission RETENTION_MANAGEMENT = new JcrPermission(Privilege.JCR_RETENTION_MANAGEMENT, "Retention management");
033    private JcrPermission VERSION_MANAGEMENT = new JcrPermission(Privilege.JCR_VERSION_MANAGEMENT, "Version management");
034    
035    private JcrPermission READ_ACCESS_CONTROL = new JcrPermission(Privilege.JCR_READ_ACCESS_CONTROL, "Read access control");
036    private JcrPermission MODIFY_ACCESS_CONTROL = new JcrPermission(Privilege.JCR_MODIFY_ACCESS_CONTROL, "Modify access control");
037
038    private JcrPermission READ = new JcrPermission(Privilege.JCR_READ, "Read");
039    
040    private JcrPermission ADD_CHILD_NODES = new JcrPermission(Privilege.JCR_ADD_CHILD_NODES, "Add child nodes");
041    private JcrPermission REMOVE_CHILD_NODES = new JcrPermission(Privilege.JCR_REMOVE_CHILD_NODES, "Remove child nodes");
042    private JcrPermission MODIFY_PROPERTIES = new JcrPermission(Privilege.JCR_MODIFY_PROPERTIES, "Modify properties");
043    private JcrPermission WRITE = new JcrPermission(Privilege.JCR_WRITE, "Write",
044            ADD_CHILD_NODES, REMOVE_CHILD_NODES, MODIFY_PROPERTIES);
045
046    private JcrPermission ALL = new JcrPermission(Privilege.JCR_ALL, "All permissions",
047            LIFECYCLE_MANAGEMENT, 
048            LOCK_MANAGEMENT, 
049            NODE_TYPE_MANAGEMENT,
050            RETENTION_MANAGEMENT,
051            VERSION_MANAGEMENT,
052            READ_ACCESS_CONTROL,
053            MODIFY_ACCESS_CONTROL,
054            READ, WRITE);
055    
056    private static final long serialVersionUID = 1L;
057    private String principal;
058    
059    private JcrPermission[] PERMISSIONS = new JcrPermission[]{
060        ALL,
061        LIFECYCLE_MANAGEMENT,
062        LOCK_MANAGEMENT,
063        NODE_TYPE_MANAGEMENT,
064        RETENTION_MANAGEMENT,
065        VERSION_MANAGEMENT,
066        READ_ACCESS_CONTROL,
067        MODIFY_ACCESS_CONTROL,
068        READ,
069        WRITE,
070        ADD_CHILD_NODES,
071        MODIFY_PROPERTIES,
072        REMOVE_CHILD_NODES
073    };
074
075    public String getPrincipal() {
076        return principal;
077    }
078    
079    public void setPrincipal(String principal) {
080        this.principal = principal;
081    }
082    
083    public void enable( String name ) {
084        forName(name).setStatus(true);
085    }
086    
087    public void disable( String name ) {
088        forName(name).setStatus(false);
089    }
090    
091    public void disableAll() {
092        for (int i = 0; i < PERMISSIONS.length; i++) {
093            PERMISSIONS[i].setStatus(false);
094        }
095    }
096
097    public void enableAll() {
098        for (int i = 0; i < PERMISSIONS.length; i++) {
099            PERMISSIONS[i].setStatus(true);
100        }
101    }
102
103    @SuppressWarnings("unchecked")
104    public Collection<JcrPermission> permissions() {
105        ArrayList<JcrPermission> list = new ArrayList();
106        for (int i = 0; i < PERMISSIONS.length; i++) {
107            list.add(PERMISSIONS[i]);
108        }
109        return list;
110    }
111    
112    public void modify(JcrPermission permission, boolean enabled) {
113        permission.setStatus(enabled);
114    }
115
116    private JcrPermission forName(String name) {
117        for (int i = 0; i < PERMISSIONS.length; i++) {
118            if (PERMISSIONS[i].getName().equalsIgnoreCase(name)) {
119                return PERMISSIONS[i];
120            }
121        }
122        return null;
123    }
124    
125    public boolean hasPermission(JcrPermission permission) {
126        for (JcrPermission p : PERMISSIONS) {
127            if (p.matches(permission)) {
128                return true;
129            }
130        }
131        return false;
132    }
133}