content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.activemq.security;
  
  import org.apache.activemq.filter.DestinationMapEntry;
  
  import java.util.Collections;
  import java.util.HashSet;
  import java.util.Set;
  import java.util.StringTokenizer;
  
  /**
   * Represents an entry in a {@link DefaultAuthorizationMap} for assigning
   * different operations (read, write, admin) of user roles to a specific
   * destination or a hierarchical wildcard area of destinations.
   */
  @SuppressWarnings("rawtypes")
  public class AuthorizationEntry extends DestinationMapEntry {
  
      private Set<Object> readACLs = emptySet();
      private Set<Object> writeACLs = emptySet();
      private Set<Object> adminACLs = emptySet();
  
      protected String adminRoles;
      protected String readRoles;
      protected String writeRoles;
  
      private String groupClass;
  
      public String getGroupClass() {
          return groupClass;
      }
  
      private Set<Object> emptySet() {
          return Collections.emptySet();
      }
  
      public void setGroupClass(String groupClass) {
          this.groupClass = groupClass;
      }
  
      public Set<Object> getAdminACLs() {
          return adminACLs;
      }
  
      public void setAdminACLs(Set<Object> adminACLs) {
          this.adminACLs = adminACLs;
      }
  
      public Set<Object> getReadACLs() {
          return readACLs;
      }
  
      public void setReadACLs(Set<Object> readACLs) {
          this.readACLs = readACLs;
      }
  
      public Set<Object> getWriteACLs() {
          return writeACLs;
      }
  
      public void setWriteACLs(Set<Object> writeACLs) {
          this.writeACLs = writeACLs;
      }
  
      // helper methods for easier configuration in Spring
      // ACLs are already set in the afterPropertiesSet method to ensure that
      // groupClass is set first before
      // calling parceACLs() on any of the roles. We still need to add the call to
      // parceACLs inside the helper
      // methods for instances where we configure security programatically without
      // using xbean
      // -------------------------------------------------------------------------
      public void setAdmin(String roles) throws Exception {
          adminRoles = roles;
          setAdminACLs(parseACLs(adminRoles));
      }
  
      public void setRead(String roles) throws Exception {
          readRoles = roles;
          setReadACLs(parseACLs(readRoles));
      }
  
      public void setWrite(String roles) throws Exception {
          writeRoles = roles;
          setWriteACLs(parseACLs(writeRoles));
      }
  
      protected Set<Object> parseACLs(String roles) throws Exception {
          Set<Object> answer = new HashSet<Object>();
          StringTokenizer iter = new StringTokenizer(roles, ",");
          while (iter.hasMoreTokens()) {
              String name = iter.nextToken().trim();
              String groupClass = (this.groupClass != null ? this.groupClass : DefaultAuthorizationMap.DEFAULT_GROUP_CLASS);
              answer.add(DefaultAuthorizationMap.createGroupPrincipal(name, groupClass));
          }
          return answer;
      }
  
      @Override
      public boolean equals(Object o) {
          if (this == o) return true;
          if (!(o instanceof AuthorizationEntry)) return false;
  
          AuthorizationEntry that = (AuthorizationEntry) o;
  
          if (adminACLs != null ? !adminACLs.equals(that.adminACLs) : that.adminACLs != null) return false;
          if (adminRoles != null ? !adminRoles.equals(that.adminRoles) : that.adminRoles != null) return false;
          if (groupClass != null ? !groupClass.equals(that.groupClass) : that.groupClass != null) return false;
          if (readACLs != null ? !readACLs.equals(that.readACLs) : that.readACLs != null) return false;
          if (readRoles != null ? !readRoles.equals(that.readRoles) : that.readRoles != null) return false;
          if (writeACLs != null ? !writeACLs.equals(that.writeACLs) : that.writeACLs != null) return false;
          if (writeRoles != null ? !writeRoles.equals(that.writeRoles) : that.writeRoles != null) return false;
  
          return true;
      }
  
      @Override
      public int hashCode() {
          int result = readACLs != null ? readACLs.hashCode() : 0;
          result = 31 * result + (writeACLs != null ? writeACLs.hashCode() : 0);
          result = 31 * result + (adminACLs != null ? adminACLs.hashCode() : 0);
          result = 31 * result + (adminRoles != null ? adminRoles.hashCode() : 0);
          result = 31 * result + (readRoles != null ? readRoles.hashCode() : 0);
          result = 31 * result + (writeRoles != null ? writeRoles.hashCode() : 0);
          result = 31 * result + (groupClass != null ? groupClass.hashCode() : 0);
          return result;
      }
  }
  