Package com.sos.JSHelper.DataElements

Source Code of com.sos.JSHelper.DataElements.JSDataElement

/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
**   GNU General Public License version 2.0 (GPL)
**
**   as published by the Free Software Foundation
**   http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
**   LICENSE.GPL included in the packaging of this file.
**
** or the
** 
**   Agreement for Purchase and Licensing
**
**   as offered by Software- und Organisations-Service GmbH
**   in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package com.sos.JSHelper.DataElements;

/**
* \class JSDataElement
*
* \brief JSDataElement - Basisklasse f�r die Datenelement-Klassen des Dataswitch
*
* \details
* Basisklasse (SuperKlasse) f�r die Datenelement-Klassen des Dataswitch
*
* \section JSDataElement_intro_sec Introduction
*
* \section JSDataElement_samples Some Samples
*
* \code
*   .... code goes here ...
* \endcode
*
* <p style="text-align:center">
* <br />---------------------------------------------------------------------------
* <br /> APL/Software GmbH - Berlin
* <br />##### generated by ClaviusXPress (http://www.sos-berlin.com) #########
* <br />Sonntag, 7. Dezember 2008, eqbfd (eqbfd)
* <br />---------------------------------------------------------------------------
* </p>
* \author eqbfd
* @version $Id: JSDataElement.java 14731 2011-07-05 20:50:42Z sos $0.9
*
*/

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.sos.JSHelper.Basics.JSToolBox;
import com.sos.JSHelper.Exceptions.FormatPatternException;
import com.sos.JSHelper.io.Files.JSXMLFile;

/**
* @author EQCPN
*
*/
public class JSDataElement extends JSToolBox {

  private final String  conClassName          = "JSDataElement";

  public static boolean  flgXMLTagOnSingleLine      = false;
  public static boolean  flgTrimValues          = false;
  public static boolean  flgOmitEmptyXMLTags        = true;
  /**
   * steuert, ob bei einem �berschreiten der Feldl�nge eine Exception ausgel�st werden soll
   */
  public static boolean  flgExceptionOnFieldTruncation  = true;

  private String      strValue            = "";
  private String      strDefaultValue          = "";

  private String      strDescription          = "";

  private int        intSize              = 0;        // Size in Bytes
  public int        intPos              = 0;        // Position in einem Fix-File Record (IDoc-Segment z.B.)
  private String      strTitle            = "";
  private String      strColumnHeader          = "";

  private String      strXMLTagName          = "";
  private boolean      flgOmitXMLTag          = false;
  private String      strFormatString          = "";        // geh�rt in Integer, Double, etc Datenelement

  // EQCPN-2009-04-25: Formatpr�fung
  private String      strFormatPattern        = "";        // Muster f�r die Formatierungspr�fung
  private boolean      flgAllowEmptyValue        = true;      // Leeres Feld erlaubt

  private boolean      flgTrimValue          = false;

  /**
   * \todo Werte(bereichs)pr�fung mit dem regul�ren Ausdruck einbauen
   */

  @SuppressWarnings("unused")
  private final String  strRegExpr4Check        = "";
  private boolean      flgIsCData            = false;

  private boolean      flgIsDirty            = false;

  public void isDirty(final boolean pflgIsDirty) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::isDirty";

    flgIsDirty = pflgIsDirty;

  } // public void isDirty}

  public boolean isDirty() {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::isDirty";

    return flgIsDirty;
  } // public boolean isDirty}

  public void isCData(final boolean pflgIsCData) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::isCData";

    flgIsCData = pflgIsCData;

  } // public void isCData}

  public boolean isCData() {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::isCData";

    return flgIsCData;
  } // public boolean isCData}

  /**
   *
   * \brief toString
   *
   * \details
   *
   * \return
   *
   * @return
   */
  @Override
  public String toString() {
    return strDescription + ": " + strValue;
  }

  /**
   *
   * \brief JSDataElement
   *
   * \details
   *
   */
  public JSDataElement() {
    // TODO Auto-generated constructor stub
    doInit();
  }

  public JSDataElement(final String pstrValue) {
    Value(pstrValue);
    doInit();
  }

  // omit

  public JSDataElement(final String pstrValue, final String pstrDescription) {
    this.Value(pstrValue);
    this.Description(pstrDescription);
    doInit();
  }

  /**
   *
   * \brief JSDataElement
   *
   * \details
   * Dieser Konstruktur wird i.d.R. verwendet vom Generator, der aus der Dokumentation der IDocs (und Segmente)
   * die entsprechende Java-Klasse erzeugt.
   *
   * @param pstrValue
   * @param pstrDescription
   * @param pintSize
   * @param pintPos
   * @param pstrFormatString
   * @param pstrColumnHeader
   * @param pstrXMLTagName
   */
  public JSDataElement(final String pstrValue, //
      final String pstrDescription, //
      final int pintSize, //
      final int pintPos, //
      final String pstrFormatString, //
      final String pstrColumnHeader, //
      final String pstrXMLTagName) {

    doInit();

    this.Value(pstrValue);
    this.Description(pstrDescription);

    this.Size(pintSize);
    intPos = pintPos;
    this.FormatString(pstrFormatString.trim()); // the content must not be numeric
    this.Description(pstrDescription);
    if (pstrColumnHeader.length() <= 0) {
      this.ColumnHeader(pstrDescription);
    }
    else {
      this.ColumnHeader(pstrColumnHeader);
    }
    if (pstrXMLTagName.length() <= 0) {
      this.XMLTagName(pstrDescription);
    }
    else {
      this.XMLTagName(pstrXMLTagName);
    }

  }

  /**
   *
   * \brief ColumnHeader
   *
   * \details
   *
   * \return JSDataElement
   *
   * @param pstrColumnHeader
   * @return
   */
  public JSDataElement ColumnHeader(final String pstrColumnHeader) {
    if (pstrColumnHeader != null) {
      strColumnHeader = pstrColumnHeader;
    }
    return this;
  }

  /**
   *
   * \brief ColumnHeader
   *
   * \details
   *
   * \return String
   *
   * @return
   */
  public String ColumnHeader() {
    if (strColumnHeader == null) {
      strColumnHeader = "";
    }

    return strColumnHeader;
  }

  /**
   * \brief Title - Titel des Datenelements festlegen
   *
   * \details
   *
   * @param pstrTitle
   * @return
   */
  public JSDataElement Title(final String pstrTitle) {
    if (pstrTitle != null) {
      strTitle = pstrTitle;
    }
    return this;
  }

  /**
   * \brief Title - Titel des Datenelements liefern
   *
   * \details
   *
   * @param pstrTitle
   * @return
   */
  public String Title() {
    if (strTitle == null) {
      strTitle = "";
    }

    return strTitle;
  }

  public void Value(final JSDataElement objDE) {
    Value(objDE.Value());
  }

  /**
   * \brief Value - Wert des Datenelements festlegen
   *
   * \details
   *
   * @param pstrValue
   */
  public void Value(final String pstrValue) {
    if (pstrValue != null) {
      if (strValue.equals(pstrValue) == false) {
        isDirty(true);
        /**
         * \todo �ber den regexp pr�fen, ob die Werte syntaktisch korrekt sind
         */
        strValue = pstrValue;
        if (flgTrimValue || flgTrimValues) {
          strValue = strValue.trim();
        }
      }
    }
    else {
      strValue = "";
    }

  }

  /**
   * \brief Value - Wert des Datenelements liefern
   *
   * \details
   *
   * @param pstrValue
   * @return
   */
  public String Value() {
    if (strValue == null) {
      strValue = "";
    }

    return strValue;
  }

  /**
   *
   * \brief DefaultValue
   *
   * \details
   *
   * \return JSDataElement
   *
   * @param pstrDefaultValue
   * @return
   */
  public JSDataElement DefaultValue(final String pstrDefaultValue) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::DefaultValue";

    strDefaultValue = pstrDefaultValue;

    return this;
  } // public JSDataElement DefaultValue

  public String DefaultValue() {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::DefaultValue";

    return strDefaultValue;
  } // public String DefaultValue

  /**
   * \brief Description - Beschreibung des Datenelements festlegen
   *
   * \details
   *
   * @param pstrDescription
   * @return
   */
  public JSDataElement Description(final String pstrDescription) {
    if (pstrDescription != null) {
      strDescription = pstrDescription;
    }
    return this;
  }

  /**
   * \brief Description - Beschreibung des Datenelements liefern
   *
   * \details
   *
   * @param pstrDescription
   * @return String
   */
  public String Description() {
    if (strDescription == null) {
      strDescription = "";
    }

    return strDescription;
  }

  /**
   * \brief Size - Gr��e des Datenelements festlegen
   *
   * \details
   *
   * @param pintSize
   * @return
   */
  public JSDataElement Size(final int pintSize) {
    intSize = pintSize;
    return this;
  }

  public JSDataElement Size(final Integer pintSize) {
    intSize = pintSize;
    return this;
  }

  /**
   * \brief Size - Gr��e des Datenelements liefern
   *
   * \details
   *
   * @param pintSize
   * @return String
   */
  public int Size() {
    return intSize;
  }

  public Integer ISize() {
    return new Integer(intSize);
  }

  /**
   * \brief XMLTagName - XML-TagName des Datenelements festlegen
   *
   * \details
   *
   * @param pstrXMLTagName
   * @return
   */
  public JSDataElement XMLTagName(final String pstrXMLTagName) {
    if (pstrXMLTagName != null) {
      strXMLTagName = pstrXMLTagName;
    }
    return this;
  }

  /**
   * \brief XMLTagName - XML-TagName des Datenelements liefern
   *
   * \details
   *
   * @param pstrXMLTagName
   * @return String
   */
  public String XMLTagName() {
    if (strXMLTagName == null) {
      strXMLTagName = "";
    }

    return strXMLTagName;
  }

  /**
   *
   * \brief toXml
   *
   * \details
   *
   * \return String
   *
   * @param pstrTagName
   * @return
   */
  public String toXml(final String pstrTagName) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::toXml";

    if (OmittXMLTag() == true) {
      if (this instanceof JSDataElementDouble) {
        final JSDataElementDouble objT = (JSDataElementDouble) this;
        if (objT.dblValue == 0.0) {
          return "";
        }
      }
      if (this instanceof JSDataElementDate) {
        final JSDataElementDate objD = (JSDataElementDate) this;
        if (objD.isEmpty() == true) {
          return "";
        }
      }
      if (FormattedValue().length() <= 0) {
        return "";
      }
    }
    String strT = "";
    if (this.Value().length() > 0) {
      strT = "<" + pstrTagName + ">";

      if (this.isCData() == true) {
        strT += "<![CDATA[" + FormattedValue() + "]]>";
      }
      else {
        strT += FormattedValue();
      }
      strT += "</" + pstrTagName + ">";
    }
    else {
      strT = "<" + pstrTagName + "/>";

    }

    if (flgXMLTagOnSingleLine == true) {
      strT += "\n";
    }
    return strT;
  } // public String toXml

  /**
   * \brief toXml - XML-Tag mit dem Wert des Elements liefern
   *
   * \details
   *
   * @return String - den Wert des Elements im XML-Tag
   */
  public String toXml() {
    return this.toXml(this.XMLTagName());
  }

  /**
   *
   * \brief toXml
   *
   * \details
   *
   * \return void
   *
   * @param pobjXMLFile
   * @throws Exception
   */
  public void toXml(final JSXMLFile pobjXMLFile) throws Exception {
    pobjXMLFile.WriteLine(this.toXml());
  }

  /**
   *
   * \brief FormatString
   *
   * \details
   *
   * \return void
   *
   * @param pstrFormatString
   */
  public void FormatString(final String pstrFormatString) {
//- <remark who='EQALS' when='Donnerstag, 11. Juni 2009' id='Korrektur' >
    /**
     * \change Donnerstag, 11. Juni 2009 EQALS Korrektur
     * Korrektur Initialisierung FormatString
     */
//- <oldcode>
//    if (pstrFormatString == null) {
//      strFormatString = "";
//    }
//    else {
//      strFormatString = pstrFormatString;
//    }
//- </oldcode>
//- <newcode>
    if (isEmpty(pstrFormatString) == false) {
      strFormatString = pstrFormatString;
    }
    else {
      if (isEmpty(strFormatString)) {
        strFormatString = pstrFormatString;
      }
      else {
        // Default-Initialisierung nicht �berschreiben
      }
    }
//- </newcode>
//- </remark>      <!-- id=<Korrektur>  -->

  }

  public void FormatString(final JSDateFormat pJSDateFormat) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::FormatString";

    this.FormatString(pJSDateFormat.toPattern());

  } // public void FormatString}

  /**
   *
   * \brief FormatString - liefert den f�r das Datenelement definierten FormatString
   *
   * \details
   *
   * \return String
   *
   * @return
   */
  public String FormatString() {
    if (strFormatString == null) {
      strFormatString = "";
    }

    return strFormatString;
  }

  public void doInit() {
    //

  }

  /**
   *
   * \brief FormattedValue - Liefert den Wert des Elements formatiert
   *
   * \details
   * das Format (die Edit-Maske) wird �ber die Eigenschaft FormatString
   * definiert.
   *
   * Wenn kein Format-String definiert ist, so wird der Wert als String
   * zur�ckgegeben.
   *
   * \return String
   *
   * @return
   */
  public String FormattedValue() {
    // nur �berschreibbar

    return this.Value();
  }

  /**
   *
   * \brief OmitXMLTag
   *
   * \details
   * omit
   * \return JSDataElement
   *
   * @param pflgOmitXMLTag
   * @return
   */
  public JSDataElement OmitXMLTag(final boolean pflgOmitXMLTag) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::OmitXMLTag";

    flgOmitXMLTag = pflgOmitXMLTag;

    return this;
  } // public JSDataElement OmitXMLTag

  /**
   *
   * \brief OmittXMLTag
   *
   * \details
   *
   * \return boolean
   *
   * @return
   */
  public boolean OmittXMLTag() {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::OmittXMLTag";

    boolean flgF = flgOmitXMLTag;
//    if (flgOmitXMLTag || flgOmitEmptyXMLTags) {
    if (flgOmitXMLTag) {
      flgF = true;
    }
    return flgF;

  } // public boolean OmittXMLTag}

  /**
   *
   * \brief IsEmpty
   *
   * \details
   * Ist Value-String leer, dann liefert die Methode true
   *
   * \return boolean
   *
   * @return
   */
  public boolean IsEmpty() {
    return this.Value().trim().length() == 0;
  }

  public boolean IsNotEmpty () {
    return !IsEmpty();
  }
// 
  /**
   *
   * \brief hasValue
   *
   * \details
   *
   * \return boolean
   *
   * @return
   */
  public boolean hasValue() {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::hasValue";

    return this.Value().trim().length() > 0;
  } // public boolean hasValue}

  /**
   *
   * \brief TrimValue
   *
   * \details
   *
   * \return void
   *
   * @param pflgTrimValue
   */
  public void TrimValue(final boolean pflgTrimValue) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::TrimValue";

    flgTrimValue = pflgTrimValue;

  } // public void TrimValue

  /**
   *
   * \brief RecordValue - setzt den Wert aus einem festformatierten Satz (z.B. IDoc-Segement)
   *
   * \details
   *
   * \return void
   *
   * @param pstrRecord
   */
  public void RecordValue(final StringBuffer pstrRecord) {

    this.Value(pstrRecord.substring(intPos, intPos + intSize).trim());
  }

  /**
   *
   * \brief BuildRecord
   *
   * \details
   * Mit dieser Methode wird der aktuelle Wert f�r das Datenfeld in einen "festen" Record (z.B. das Segment eines IDocs)
   * an die definierte Stelle in der definierten L�nge eingesetzt.
   *
   * eigentlich nehmen wir den Wert wie er ist.
   * Ist allerdings ein format-string definiert, dann wird der
   * mit diesem String formatierte Wert verwendet.
   * \return void
   *
   * @param pstrRecord
   * @throws Exception
   */
  public void BuildRecord(final StringBuffer pstrRecord) throws Exception {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::BuildRecord";
    String strVal = this.Value();
    /**
     * eigentlich nehmen wir den Wert wie er ist.
     * Ist allerdings ein format-string definiert, dann wird der
     * mit diesem String formatierte Wert verwendet.
     */
    if (strVal.length() > intSize || this.FormatString().length() > 0) {
      strVal = FormattedValue();
      if (strVal.length() > intSize && flgExceptionOnFieldTruncation == true) {
        throw new Exception("Value truncated. max " + intSize + ", actual " + this.Value().length() + ". Description:" + this.Description()
            + ". Value = '" + this.Value() + "', " + FormattedValue());
      }
    }

    doReplace(pstrRecord, intPos, intPos + intSize, strVal);

  } // public void BuildRecord

  /**
   *
   * \brief doReplace
   *
   * \details
   *
   * \return StringBuffer
   *
   * @param pstrS
   * @param pintPos
   * @param pintPos2
   * @param pstrR
   * @return
   */
  protected StringBuffer doReplace(final StringBuffer pstrS, final int pintPos, final int pintPos2, final String pstrR) {
    final int intlSize = pintPos2 - pintPos;
    final int intLen = pstrS.length();
    if (intLen < pintPos2) {
      pstrS.append(repeatString(" ", pintPos2 - intLen + 1));
    }
    String strT = pstrR + repeatString(" ", intlSize);
    strT = strT.substring(0, intlSize);
    pstrS.replace(pintPos, pintPos2, strT);
    return pstrS;
  }

  /**
   * \brief setFormatPattern - Muster f�r die Formatpr�fung vorgeben
   *
   * \details
   * Diese Methode setzt das Muster f�r einen regul�ren Ausdruck, der in der Methode
   * checkFormatPattern() zur formalen Pr�fung des Feldwertes verwendet wird.
   *
   * @param pstrFormatPattern
   */
  public void setFormatPattern(final String pstrFormatPattern) {
    if (pstrFormatPattern != null) {
      strFormatPattern = pstrFormatPattern;
    }
  }

  /**
   * \brief allowEmptyValue - Leere Feldwerte erlauben
   *
   * \details
   * Bestimmt, ob die Formatpr�fung auch bei leeren Felder stattfindet (pflgAllowEmptyValue = false).
   *
   * @param pflgAllowEmptyValue
   */
  public void allowEmptyValue(final boolean pflgAllowEmptyValue) {
    flgAllowEmptyValue = pflgAllowEmptyValue;
  }

  /**
   * \brief Formale Pr�fung des Feldinhaltes
   *
   * \details
   * Vor Aufruf dieser Methode mu� mit setFormatPattern() ein Muster zur Feldpr�fung angegeben werden.
   * Im Allgemeinen findet dies in der Methode doInit() der abgeleiteten Klasse statt.
   *
   * Das Muster gibt einen regul�ren Ausdruck vor, gegen den der Feldinhalt gepr�ft wird.
   * Entspricht der Feldinhalt nicht dem vorgegebenen Muster wird eine FormatPatternException
   * ausgel�st.
   *
   * @throws FormatPatternException
   */
  public void checkFormatPattern() throws FormatPatternException {
    if (isNotEmpty(strFormatPattern)) { // Keine Formatpr�fung ohne Pattern
      if (flgAllowEmptyValue == false || !this.Value().trim().equals("")) {
        final Pattern objP = Pattern.compile(strFormatPattern);
        final Matcher objM = objP.matcher(this.Value());
        if (objM.find() == false) {
          throw new FormatPatternException("the value '" + this.Value() + "' does not correspond with the pattern " + strFormatPattern);
        }
      }
    }
  }

  /**
   *
   * \brief equals
   *
   * \details
   *
   * \return boolean
   *
   * @param pobjO
   * @return
   */
  public boolean isEqual(final JSDataElement pobjO) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::equals";

    boolean flgC = false;
    if (pobjO != null) {
      flgC = this.Value().equalsIgnoreCase(pobjO.Value());
    }
    return flgC;
  } // public boolean  equals

  public String SQLValue() {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::SQLValue";

    String strT = this.Value();
    strT = strT.replace("'", "''");

    return "'" + strT + "'";
  } // public String SQLValue

  /**
   *
   * \brief equals
   *
   * \details
   * Vergleicht den Wert dieses DatenElementes mit einem String oder mit dem Wert eines
   * anderen DatenElements.
   *
   * Ist der Parameter nicht vom Typ String oder JSDataElement, so wird ein Objektvergleich
   * durchgef�hrt.
   *
   * \return true = Identit�t, false = keine Identit�t
   *
   * @param pobjO (String, JSDataElement, Object)
   */
  @Override
  public boolean equals (final Object pobjO) {

    @SuppressWarnings("unused")
    final String conMethodName = conClassName + "::equals";

    if (pobjO instanceof String) {
      final String strT = (String) pobjO;
      return this.Value().equals(strT);
    }

    if (pobjO instanceof JSDataElement) {
      return this.Value().equals(((JSDataElement) pobjO).Value());
    }

    return pobjO.equals(this);
  }
}
TOP

Related Classes of com.sos.JSHelper.DataElements.JSDataElement

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.