SessionDateUtils.java

/*
** Module   : SessionDateUtils.java
** Abstract : Defines APIs used to access the SESSION date-related attributes and methods.
**
** Copyright (c) 2020, Golden Code Development Corporation.
**
** -#- -I- --Date-- --------------------------------Description-----------------------------------
** 001 IAS 20200410 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.util;

/**
 * This class provides implementation for SESSION date-related attributes.
 * Mainly, the APIs implemented here are defined in the {@link CommonSession}
 * interface (or one of its super interfaces) and are not statically 
 * implemented by the classes used by the {@link SessionUtils#asHandle()}.
 */
public class SessionDateUtils
implements SessionExports 
{
   /** Singleton instance */
   public static SessionDateUtils INSTANCE = new SessionDateUtils();
   
   /** Private default constructor - to enforce singleton */
   private SessionDateUtils()
   {
      super();
   }
      /** 
       * Sets the order of date components (SESSION:DATE-FORMAT) for conversion to/from strings.
       * <p>
       * The order of the 3 date sub-components as a 3 character string using "M", "D" and "Y" once 
       * each.  The order from index 0 to index 2 represents the left to right ordering of the 
       * components. So the leftmost date component will be defined by the character at index 
       * position 0.
       * <p>
       * The value set is specific to the current user's context.
       *
       * @param    dateFormat
       *           Defines the order of date components for conversion to/from strings.
       */
      public void setDateFormat(String dateFormat)
      {
         setDateFormat(new character(dateFormat));
      }
      
      /** 
       * Sets the order of date components (SESSION:DATE-FORMAT) for conversion to/from strings.
       * <p>
       * The order of the 3 date sub-components as a 3 character string using "M", "D" and "Y" once 
       * each.  The order from index 0 to index 2 represents the left to right ordering of the 
       * components. So the leftmost date component will be defined by the character at index 
       * position 0.
       * <p>
       * The value set is specific to the current user's context.
       *
       * @param    dateFormat
       *           Defines the order of date components for conversion to/from strings.
       */
      public void setDateFormat(character dateFormat)
      {
         date.setDateOrder(dateFormat);
      }
      
      /** 
       * Gets the order of date components (SESSION:DATE-FORMAT) for conversion to/from strings.
       * <p>
       * The order of the 3 date sub-components is a 3 character string using
       * "M", "D" and "Y" once each.  The order from index 0 to index 2
       * represents the left to right ordering of the components. So the leftmost
       * date component will be defined by the character at index position 0.
       * <p>
       * The value accessed is specific to the current user's context.
       *
       * @return   Defines the order of date components for conversion to/from strings.
       */
      public character getDateFormat()
      {
         return date.getDateOrder();
      }
      
      /**
       * Sets the SESSION:TIMEZONE used as the default offset in minutes from
       * UTC for this user's context.
       *
       * @param    offset
       *           The new timezone offset which must be between -840 and 840
       *           inclusive.  The value may also be <code>unknown</code> which
       *           is the equivalent of resetting this attribute to the default.
       */
      public void setSessionTimeZone(NumberType offset)
      {
         date.setTimeZone(offset);
      }
      
      /**
       * Accesses the SESSION:TIMEZONE used as the default offset in minutes from
       * UTC for this user's context.
       *
       * @return   The timezone offset. If this has never been set, then
       *           <code>unknown</code> will be returned.
       */
      public integer getSessionTimeZone()
      {
         return date.getTimeZone();
      }

      /**
       * Obtains the currently configured TIME-SOURCE attribute for the current
       * user's context.  This attribute is can be read and written but it is
       * not honored for date/time processing in P2J.  The intention of the
       * attribute is to define the system from which time values will be obtained.
       * In P2J, time values are always obtained from the application server. 
       * <p>
       * The default value is "local" which in Progress means that the client
       * machine is the source  (this is the same as the empty string "").  It is
       * common to use a database name in the 4GL, which makes the application
       * use the database server as the time source.
       *
       * @return   The time source attribute.
       */
      public character getSessionTimeSource()
      {
         return date.getTimeSource();
      }
      
      /**
       * Sets the <code>TIME-SOURCE</code> attribute for the user's context.
       * This attribute is can be read and written but it is not honored for 
       * date/time processing in P2J.  The intention of the attribute is to define
       * the system from which time values will be obtained. In P2J, time values
       * are always obtained from the application server.
       *
       * @param    timeSource
       *           The new value to set. If <code>null</code>, then the empty
       *           string will be used, which in the 4GL has the same affect as
       *           "local".
       */
      public void setSessionTimeSource(character timeSource)
      {
         date.setTimeSource(timeSource);
      }
      
      /**
       * Obtains the currently configured DISPLAY-TIMEZONE attribute for the current
       * user's context. This attribute is used for displaying DATETIME-TZ values that do not have 
       * the timezone specified in the display format. 
       *
       * @return   The display-timezone attribute.
       */
      public integer getSessionDisplayTimeZone()
      {
         return date.getDisplayTimeZone();
      }
      
      /**
       * Sets the <code>DISPLAY-TIMEZONE</code> attribute for the user's context.
       * This attribute is used for displaying DATETIME-TZ values that do not have 
       * the timezone specified in the display format. 
       *
       * @param    displayTimezone
       *           The new value to set.
       */
      public void setSessionDisplayTimeZone(NumberType displayTimezone)
      {
         date.setDisplayTimeZone(displayTimezone);
      }
      
      /**
       * Implementation of SESSION:YEAR-OFFSET attribute getter. Returns the 
       * currently configured start year for the two-digit Y2K windowing range.
       * This is the equivalent to the Progress -yy command line parameter. The 
       * default value is 1950 unless otherwise specified in the directory (see
       * {@link date#getWindowingYear}).
       * 
       * @return  The start year for the two-digit windowing range.
       */
      public integer getYearOffset()
      {
         return date.getYearOffset();
      }
      
      /**
       * Implementation of SESSION:YEAR-OFFSET attribute setter. Sets the 
       * configured start year for the two-digit Y2K windowing range. This is
       * the equivalent of the Progress -yy command line parameter. The 
       * default value is 1950 unless otherwise specified in the directory (see
       * {@link date#getWindowingYear}).
       * 
       * @param   year
       *          The new start year for the two-digit windowing range.
       */
      public void setYearOffset(NumberType year)
      {
         date.setYearOffset(year);
      }
}