Introduce system roles
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / auth / ImpliedByPrincipal.java
index c753601296657c9e69d03499a7b931ad9bdf8ee4..73f474637750a2f61aa825cddbdc0d12861df99e 100644 (file)
@@ -1,17 +1,17 @@
 package org.argeo.cms.internal.auth;
 
+import static org.argeo.api.acr.RuntimeNamespaceContext.getNamespaceContext;
+
 import java.security.Principal;
-import java.util.Collections;
-import java.util.Dictionary;
-import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.naming.InvalidNameException;
-import javax.naming.ldap.LdapName;
+import javax.xml.namespace.QName;
 
+import org.argeo.api.acr.CrName;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.cms.auth.RoleNameUtils;
 import org.osgi.service.useradmin.Authorization;
-import org.osgi.service.useradmin.Role;
 
 /**
  * A {@link Principal} which has been implied by an {@link Authorization}. If it
@@ -21,67 +21,88 @@ import org.osgi.service.useradmin.Role;
  * identity is removed, the related {@link ImpliedByPrincipal}s can thus be
  * removed.
  */
-public final class ImpliedByPrincipal implements Principal, Role {
-       private final LdapName name;
+public final class ImpliedByPrincipal implements Principal {
+       private final String name;
        private Set<Principal> causes = new HashSet<Principal>();
 
-       private int type = Role.ROLE;
+       private QName roleName;
+//     private int type = Role.ROLE;
+
+       private boolean systemRole = false;
+       private String context;
 
        public ImpliedByPrincipal(String name, Principal userPrincipal) {
-               try {
-                       this.name = new LdapName(name);
-               } catch (InvalidNameException e) {
-                       throw new IllegalArgumentException("Badly formatted role name", e);
+               this.name = name;
+               String cn = RoleNameUtils.getLastRdnValue(name);
+               roleName = NamespaceUtils.parsePrefixedName(getNamespaceContext(), cn);
+               if (roleName.getNamespaceURI().equals(CrName.ROLE_NAMESPACE_URI)) {
+                       systemRole = true;
                }
+               context = RoleNameUtils.getContext(name);
+//             try {
+//                     this.name = new LdapName(name);
+//             } catch (InvalidNameException e) {
+//                     throw new IllegalArgumentException("Badly formatted role name", e);
+//             }
                if (userPrincipal != null)
                        causes.add(userPrincipal);
        }
 
-       public ImpliedByPrincipal(LdapName name, Principal userPrincipal) {
-               this.name = name;
-               if (userPrincipal != null)
-                       causes.add(userPrincipal);
-       }
+//     public ImpliedByPrincipal(LdapName name, Principal userPrincipal) {
+//             this.name = name;
+//             if (userPrincipal != null)
+//                     causes.add(userPrincipal);
+//     }
 
        public String getName() {
-               return name.toString();
-       }
-
-       public boolean addMember(Principal user) {
-               throw new UnsupportedOperationException();
-       }
-
-       public boolean removeMember(Principal user) {
-               throw new UnsupportedOperationException();
-       }
-
-       public boolean isMember(Principal member) {
-               return causes.contains(member);
-       }
-
-       public Enumeration<? extends Principal> members() {
-               return Collections.enumeration(causes);
+               return name;
        }
 
        /*
         * USER ADMIN
         */
+//     public boolean addMember(Principal user) {
+//             throw new UnsupportedOperationException();
+//     }
+//
+//     public boolean removeMember(Principal user) {
+//             throw new UnsupportedOperationException();
+//     }
+//
+//     public boolean isMember(Principal member) {
+//             return causes.contains(member);
+//     }
+//
+//     public Enumeration<? extends Principal> members() {
+//             return Collections.enumeration(causes);
+//     }
+//
+//
+//     /** Type of {@link Role}, if known. */
+//     public int getType() {
+//             return type;
+//     }
+//
+//     /** Not supported for the time being. */
+//     public Dictionary<String, Object> getProperties() {
+//             throw new UnsupportedOperationException();
+//     }
 
-       @Override
-       /** Type of {@link Role}, if known. */
-       public int getType() {
-               return type;
+       /*
+        * OBJECT
+        */
+
+       public QName getRoleName() {
+               return roleName;
        }
 
-       @Override
-       /** Not supported for the time being. */
-       public Dictionary<String, Object> getProperties() {
-               throw new UnsupportedOperationException();
+       public String getContext() {
+               return context;
        }
 
-       /*
-        * OBJECT
-        */
+       public boolean isSystemRole() {
+               return systemRole;
+       }
 
        @Override
        public int hashCode() {