# UniqueIndexLookup.java

    /*
    ** Module   : UniqueIndexLookup.java
    ** Abstract : Container for properties and values used when doing a unique index look-up.
    **
    ** Copyright (c) 2023, Golden Code Development Corporation.
    **
    ** -#- -I- --Date-- -----------------------------------Description-----------------------------------
    ** 001 AL2 20230210 Created 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.persist;

    import java.util.ArrayList;
    import java.util.List;

    /**
     * Utility class which stores the properties and values of a look-up which is done
     * over an unique index.
     */
    public class UniqueIndexLookup
    {
       /** The properties of the unique index, not necessarily in order */
       private List<String> properties;

       /**
        * The values used for look-up; the order matched the order of the properties
        * A null value means a value that is provided latter (by substitution parameters).
        */
       private List<Object> values;

       /**
        * Basic constructor
        */
       public UniqueIndexLookup()
       {
          properties = new ArrayList<>();
          values = new ArrayList<>();
       }

       /**
        * Copy constructor
        *
        * @param  prototype
        *         The prototype to be used when building this object.
        */
       public UniqueIndexLookup(UniqueIndexLookup prototype)
       {
          this.properties = new ArrayList<>(prototype.properties);
          // deep copy is not needed; values are immutable
          this.values = new ArrayList<>(prototype.values);
       }

       /**
        * Fill the {@code null} values from the values array with the provided fill values.
        * This is used to lazily add the substitution parameters when needed.
        *
        * @param   fillValues
        *          The values to be used when filling the parameters array.
        *
        * @return  {@code true} if the filling succeeded. If this returns {@code false}, the
        *          object reaches a stale state, so avoid using it.
        */
       public boolean fill(Object[] fillValues)
       {
          int from = 0;
          for (int i = 0; i < this.values.size(); i++)
          {
             if (this.values.get(i) == null)
             {
                if (fillValues == null || fillValues.length <= from)
                {
                   return false;
                }
                this.values.set(i, fillValues[from++]);
             }
          }
          if (fillValues == null)
          {
             return from == 0;
          }
          return from == fillValues.length;
       }

       /**
        * Add a new property-value mapping to this look-up.
        *
        * @param   property
        *          The property from an unique index.
        * @param   value
        *          The value to be used when doing look-up.
        */
       public void addMapping(String property, Object value)
       {
          properties.add(property);
          values.add(value);
       }

       /**
        * Retrieve the properties as an array.
        *
        * @return   The array of properties.
        */
       public String[] getProperties()
       {
          return properties.toArray(new String[0]);
       }

       /**
        * Retrieve the values as an array.
        *
        * @return   The array of values.
        */
       public Object[] getValues()
       {
          return values.toArray();
       }

    }