# AclRow.java

    /*
    ** Module   : AclRow.java
    ** Abstract : AclRow model.
    **
    ** Copyright (c) 2017, Golden Code Development Corporation.
    **
    ** -#- -I- --Date-- --------------------------------Description-----------------------------------
    ** 001 HC  20170612 Initial version.
    */
    /*
    ** This program is free software: you can redistribute it and/or modify
    ** it under the terms of the GNU Affero General Public License as
    ** published by the Free Software Foundation, either version 3 of the
    ** License, or (at your option) any later version.
    **
    ** This program is distributed in the hope that it will be useful,
    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ** GNU Affero General Public License for more details.
    **
    ** You may find a copy of the GNU Affero GPL version 3 at the following
    ** location: https://www.gnu.org/licenses/agpl-3.0.en.html
    **
    ** Additional terms under GNU Affero GPL version 3 section 7:
    **
    **   Under Section 7 of the GNU Affero GPL version 3, the following additional
    **   terms apply to the works covered under the License.  These additional terms
    **   are non-permissive additional terms allowed under Section 7 of the GNU
    **   Affero GPL version 3 and may not be removed by you.
    **
    **   0. Attribution Requirement.
    **
    **     You must preserve all legal notices or author attributions in the covered
    **     work or Appropriate Legal Notices displayed by works containing the covered
    **     work.  You may not remove from the covered work any author or developer
    **     credit already included within the covered work.
    **
    **   1. No License To Use Trademarks.
    **
    **     This license does not grant any license or rights to use the trademarks
    **     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
    **     of Golden Code Development Corporation. You are not authorized to use the
    **     name Golden Code, FWD, or the names of any author or contributor, for
    **     publicity purposes without written authorization.
    **
    **   2. No Misrepresentation of Affiliation.
    **
    **     You may not represent yourself as Golden Code Development Corporation or FWD.
    **
    **     You may not represent yourself for publicity purposes as associated with
    **     Golden Code Development Corporation, FWD, or any author or contributor to
    **     the covered work, without written authorization.
    **
    **   3. No Misrepresentation of Source or Origin.
    **
    **     You may not represent the covered work as solely your work.  All modified
    **     versions of the covered work must be marked in a reasonable way to make it
    **     clear that the modified work is not originating from Golden Code Development
    **     Corporation or FWD.  All modified versions must contain the notices of
    **     attribution required in this license.
    */
    package com.goldencode.p2j.admin.client.application.home.acl.model;

    /**
     * Created by hc on 22.3.17.
     */

    import com.goldencode.p2j.admin.*;
    import java.util.*;

    /**
     * A class holding all necessary info related to ACL items, to be
     * represented in a table.
     */
    public class AclRow
    extends TaggedName
    {
       /** Shared instance name */
       private static final String SHARED_INSTANCE = "*shared*";

       /** The string representation for the subjects list.*/
       private String subjects;

       /** A set with all subject names.*/
       private Set<String> subjectsSet;

       /** The ACL item for this row. */
       private Acl acl;

       /** The ACL parent definition for this row. */
       private AclDef aclDef;

       /**
        * Constructor.
        *
        * @param    aclDef
        *           The ACL parent definition for this row.
        * @param    acl
        *           The acl item.
        * @param    subjects
        *           The string representation for the subjects list.
        * @param    subjectsSet
        *           The set with all subject names
        */
       public AclRow(AclDef aclDef,
                     Acl acl,
                     String subjects,
                     Set<String> subjectsSet)
       {
          super((String) null, null);
          this.aclDef      = aclDef;
          this.acl         = acl;
          this.subjects    = subjects;
          this.subjectsSet = subjectsSet == null ? Collections.emptySet() : subjectsSet;
       }

       /**
        * Default ctor.
        */
       public AclRow()
       {
       }

       /**
        * Compares this instance of the class with another. The native ordering
        * is as follows:
        * <ul>
        * <li>by the instance name
        * <li>within instance by the resource type name
        * <li>within instance and resource type by the object ID
        * </ul>
        * In the effective view mode, the native order no longer applies. Since
        * the effective view is only possible for a single resource type, the
        * effective ordering is just the object ID ordering.
        *
        * @param    o
        *           Object to compare with.
        *
        * @return   the usual integers required by Comparable
        */
       @SuppressWarnings("NonJREEmulationClassesInClientCode")
       public int compareTo(TaggedName o)
       {
          AclRow row = (AclRow) o;

          if (!getInstance().equals(row.getInstance()))
          {
             return getInstance().compareTo(row.getInstance());
          }
          else if (!getResourceType().equals(row.getResourceType()))
          {
             return getResourceType().compareTo(row.getResourceType());
          }
          else
          {
             return acl.oid - ((AclRow) o).acl.oid;
          }
       }

       /**
        * Get a value for a certain column.
        *
        * @param    col
        *           The column for which the value is needed.
        *
        * @return   The content of this column.
        */
       public String getValueAt(int col)
       {
          switch (col)
          {
             case 0 :
             {
                String instance = getInstance();
                return instance.length() == 0 ? SHARED_INSTANCE
                : instance;
             }
             case 1 :
             {
                return getResourceType();
             }
             case 2 :
             {
                return "" + getId();
             }
             case 3 :
             {
                return getName();
             }
             case 4 :
             {
                return getSubjects();
             }
             case 5 :
             {
                return getRights();
             }
          }

          return null;
       }

       /**
        * Compares this instance of the class with another. Comparison is
        * case-insensitive.
        *
        * @param    o
        *           Object to compare with.
        *
        * @return   <code>true</code> when both are equal
        */
       public boolean equals(Object o)
       {
          if (!(o instanceof AclRow))
          {
             return false;
          }

          AclRow row = (AclRow) o;
          return getResourceType().equals(row.getResourceType()) &&
          getInstance().equals(row.getInstance())         &&
          getId() == row.getId() &&
          getName().equals(row.getName());
       }

       /**
        * Calculates the hash code for instances of this class. Hash codes are
        * calculated off the lower case version of the name field.
        *
        * @return   calculated integer hash code
        */
       @Override
       public int hashCode()
       {
          int result = super.hashCode();
          result = 31 * result + getResourceType().hashCode();
          result = 31 * result + getInstance().hashCode();
          result = 31 * result + getId();
          result = 31 * result + getName().hashCode();
          return result;
       }

       /**
        * Get the instance name for this item.
        *
        * @return   instance name for this item.
        */
       public String getInstance()
       {
          if (acl.origin != null)
          {
             return acl.origin;
          }

          return aclDef.server;
       }

       /**
        * Get the resource type for this item.
        *
        * @return   the resource type for this item.
        */
       public String getResourceType()
       {
          return aclDef.resourceName;
       }

       /**
        * Get the id for this item.
        *
        * @return   the id for this item.
        */
       public int getId()
       {
          return acl.oid;
       }

       /**
        * Get the Resource Instance Name for this item.
        *
        * @return   Resource Instance Name for this item.
        */
       public String getName()
       {
          return acl.name;
       }

       /**
        * Set the Resource Instance Name for this item.
        *
        * @param    name
        *           The name to be set.
        */
       public void setName(String name)
       {
          acl.name = name;
       }

       /**
        * Get the exact nature of this item.
        *
        * @return   <code>true</code> if exact; <code>false</code> if regexp.
        */
       public boolean getExact()
       {
          return acl.exact;
       }

       /**
        * Set the exact nature of this item
        *
        * @param    exact
        *           <code>true</code> if exact; <code>false</code> if regexp.
        */
       private void setExact(boolean exact)
       {
          acl.exact = exact;
       }

       /**
        * Get a string representation of the subjects.
        *
        * @return   string representation of the subjects
        */
       private String getSubjects()
       {
          return subjects;
       }

       /**
        * Get a string representation of the rights.
        *
        * @return   string representation of the rights.
        */
       private String getRights()
       {
          if (acl.rights == null)
          {
             return "*** error ***";
          }

          return acl.rights.toString();
       }

       /**
        * Acl getter.
        *
        * @return   acl object
        */
       public Acl getAcl()
       {
          return acl;
       }

       /**
        * AclDef getter.
        *
        * @return   AclDef object
        */
       public AclDef getAclDef()
       {
          return aclDef;
       }

       /**
        * Subjects getter.
        *
        * @return   subjects
        */
       public Set<String> getSubjectsSet()
       {
          return subjectsSet;
       }

       /**
        * Get the OID error flag.
        *
        * @return   <code>true</code> if OID is invalid
        */
       private boolean isErrorOid()
       {
          return acl.errOid;
       }

       /**
        * Get the resource instance name error flag.
        *
        * @return   <code>true</code> if the resource instance name is invalid
        */
       public boolean isErrorName()
       {
          return acl.errName;
       }

       /**
        * Get the resource instance name nature error flag.
        *
        * @return   <code>true</code> if the resource instance name nature is
        *           invalid
        */
       private boolean isErrorExact()
       {
          return acl.errExact;
       }

       /**
        * Get the subjects error flag.
        *
        * @return   <code>true</code> if subjects is invalid
        */
       private boolean isErrorSubjs()
       {
          return acl.errSubjs;
       }

       /**
        * Get the rights error flag.
        *
        * @return   <code>true</code> if rights is invalid
        */
       public boolean isErrorRights()
       {
          return acl.errRights;
       }

       /**
        * Clear the OID error flag.
        */
       private void clearErrorOid()
       {
          acl.errOid = false;
       }

       /**
        * Clear the resource instance name error flag.
        */
       private void clearErrorName()
       {
          acl.errName = false;
       }

       /**
        * Clear the resource instance name nature error flag.
        */
       private void clearErrorExact()
       {
          acl.errExact = false;
       }

       /**
        * Clear the subjects error flag.
        */
       private void clearErrorSubjs()
       {
          acl.errSubjs = false;
       }

       /**
        * Clear the rights error flag.
        */
       public void clearErrorRights()
       {
          acl.errRights = false;
       }
    }