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.Arrays;
021import javax.jcr.security.Privilege;
022
023/**
024 * Permission object.
025 * 
026 * @author kulikov
027 */
028public class JcrPermission implements Serializable {
029    private static final long serialVersionUID = 1L;
030    private String name;
031    private String displayName;
032    private String jcrName;
033    private boolean status;
034    
035    private ArrayList<JcrPermission> aggregates = new ArrayList<JcrPermission>();
036    
037    public static final JcrPermission LIFECYCLE_MANAGEMENT = new JcrPermission(Privilege.JCR_LIFECYCLE_MANAGEMENT, "Life cycle management");
038    public static final JcrPermission LOCK_MANAGEMENT = new JcrPermission(Privilege.JCR_LOCK_MANAGEMENT, "Lock management");
039    public static final JcrPermission NODE_TYPE_MANAGEMENT = new JcrPermission(Privilege.JCR_NODE_TYPE_MANAGEMENT, "Node type management");
040    public static final JcrPermission RETENTION_MANAGEMENT = new JcrPermission(Privilege.JCR_RETENTION_MANAGEMENT, "Retention management");
041    public static final JcrPermission VERSION_MANAGEMENT = new JcrPermission(Privilege.JCR_VERSION_MANAGEMENT, "Version management");
042    
043    public static final JcrPermission READ_ACCESS_CONTROL = new JcrPermission(Privilege.JCR_READ_ACCESS_CONTROL, "Read access control");
044    public static final JcrPermission MODIFY_ACCESS_CONTROL = new JcrPermission(Privilege.JCR_MODIFY_ACCESS_CONTROL, "Modify access control");
045
046    public static final JcrPermission READ = new JcrPermission(Privilege.JCR_READ, "Read");
047    
048    public static final JcrPermission ADD_CHILD_NODES = new JcrPermission(Privilege.JCR_ADD_CHILD_NODES, "Add child nodes");
049    public static final JcrPermission REMOVE_CHILD_NODES = new JcrPermission(Privilege.JCR_REMOVE_CHILD_NODES, "Remove child nodes");
050    public static final JcrPermission MODIFY_PROPERTIES = new JcrPermission(Privilege.JCR_MODIFY_PROPERTIES, "Modify properties");
051    public static final JcrPermission WRITE = new JcrPermission(Privilege.JCR_WRITE, "Write",
052            ADD_CHILD_NODES, REMOVE_CHILD_NODES, MODIFY_PROPERTIES);
053
054    public static final JcrPermission ALL = new JcrPermission(Privilege.JCR_ALL, "All permissions",
055            LIFECYCLE_MANAGEMENT, 
056            LOCK_MANAGEMENT, 
057            NODE_TYPE_MANAGEMENT,
058            RETENTION_MANAGEMENT,
059            VERSION_MANAGEMENT,
060            READ_ACCESS_CONTROL,
061            MODIFY_ACCESS_CONTROL,
062            READ, WRITE);
063    
064
065    private static JcrPermission[] PERMISSIONS = new JcrPermission[]{
066        JcrPermission.ALL,
067        JcrPermission.LIFECYCLE_MANAGEMENT,
068        JcrPermission.LOCK_MANAGEMENT,
069        JcrPermission.NODE_TYPE_MANAGEMENT,
070        JcrPermission.RETENTION_MANAGEMENT,
071        JcrPermission.VERSION_MANAGEMENT,
072        JcrPermission.READ_ACCESS_CONTROL,
073        JcrPermission.MODIFY_ACCESS_CONTROL,
074        JcrPermission.READ,
075        JcrPermission.WRITE,
076        JcrPermission.ADD_CHILD_NODES,
077        JcrPermission.MODIFY_PROPERTIES,
078        JcrPermission.REMOVE_CHILD_NODES
079    };
080    
081    public static JcrPermission fromDisplayName(String name) {
082        for (int i = 0; i < PERMISSIONS.length; i++) {
083            if (PERMISSIONS[i].getDisplayName().equals(name)) {
084                return PERMISSIONS[i];
085            }
086        }
087        return null;
088    }
089
090    public static JcrPermission forName(String name) {
091        for (int i = 0; i < PERMISSIONS.length; i++) {
092            if (PERMISSIONS[i].getName().equalsIgnoreCase(name)) {
093                return PERMISSIONS[i];
094            }
095        }
096        return null;
097    }
098    
099    public JcrPermission() {
100    }
101    
102    protected JcrPermission(String name) {
103        if (name.startsWith("{")) {
104            this.name = "jcr:" + name.substring(name.indexOf("}") + 1);
105            this.jcrName = name;
106        } else {
107            this.name = name;
108        }
109    }
110    
111    protected JcrPermission(String name, String displayName) {
112        this(name);
113        this.displayName = displayName;
114    }
115    
116    protected JcrPermission(String name, String displayName, JcrPermission... aggregates) {
117        this(name);
118        this.displayName = displayName;
119        this.aggregates.addAll(Arrays.asList(aggregates));
120    }
121    
122    public String getName() {
123        return name;
124    }
125    
126    public void setName(String name) {
127        this.name = name;
128    }
129    
130    public String getDisplayName() {
131        return displayName;
132    }
133    
134    public void setDisplayName(String displayName) {
135        this.displayName = displayName;
136    }
137    
138    public String getJcrName() {
139        return jcrName;
140    }
141    
142    public boolean getStatus() {
143        return status;
144    }
145    
146    public void setStatus(boolean status) {
147        this.status = status;
148    }
149    
150    public boolean matches(JcrPermission permission) {
151        if (this.name.equalsIgnoreCase(permission.name)) {
152            return true;
153        }
154        
155        for (JcrPermission p : aggregates) {
156            if (p.matches(permission)) {
157                return true;
158            }
159        }
160        
161        return false;
162    }
163}