# Source: jala/code/HopObject.js

    //
    // Jala Project [http://opensvn.csie.org/traccgi/jala]
    //
    // Copyright 2004 ORF Online und Teletext GmbH
    //
    // Licensed 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.
    //
    // $Revision$
    // $LastChangedBy$
    // $LastChangedDate$
    // $HeadURL$
    //

    /**
     * @fileoverview Additional fields and methods of the HopObject class.
     */

    /**
     * HelmaLib dependencies
     */
    app.addRepository("modules/core/String.js");
    app.addRepository("modules/helma/File.js");

    /**
     * Constructs a name from an object which
     * is unique in the underlying HopObject collection.
     * @param {Object} obj The object representing or containing
     * the alias name. Possible object types include:
     * <ul>
     * <li>File</li>
     * <li>helma.File</li>
     * <li>java.io.File</li>
     * <li>String</li>
     * <li>java.lang.String</li>
     * <li>Packages.helma.util.MimePart</li>
     * </ul>
     * @param {Number} maxLength The maximum length of the alias
     * @returns The resulting alias
     * @type String
     */
    HopObject.prototype.getAccessName = function(obj, maxLength) {
       /**
        * Private method checking if the key passed as argument is already
        * existing in this object
        * @param {String} key The key string to test
        * @returns True in case the key is already in use, false otherwise
        * @type Boolean
        */
       var isReserved = function(obj, key) {
          return key === "." ||
                 key === ".." ||
                 obj[key] != null ||
                 obj[key + "_action"] != null ||
                 obj.get(key) != null
       };

       // prepare name depending on argument
       var name;
       var clazz = obj.constructor || obj.getClass();
       switch (clazz) {
          case File:
          case helma.File:
          case java.io.File:
          case Packages.helma.util.MimePart:
             // first fix bloody ie/win file paths containing backslashes
             name = obj.getName().split(/[\\\/]/).pop();
             if (name.contains("."))
                name = name.substring(0, name.lastIndexOf("."));
             break;
          case String:
          case java.lang.String:
             name = obj;
             break;
          default:
             name = obj.toString();
       }

       // remove all (back)slashes
       var accessName = name.replace(/[\\\/]/g, "");
       // remove all plus signs
       accessName = accessName.replace("+","");
       if (accessName.length > maxLength) {
          accessName = accessName.substring(0, maxLength);
       }
       var result = accessName;
       if (isReserved(this, result)) {
          var len = result.length;
          var counter = 1;
          var overflow;
          while (isReserved(this, result)) {
             result = accessName + "-" + counter.toString();
             if ((overflow = result.length - maxLength) > 0) {
                result = accessName.substring(0, accessName.length - overflow) +
                         "-" + counter.toString();
                if (result.length > maxLength) {
                   throw "Unable to create accessname due to limit restriction";
                }
             }
             counter += 1;
          }
       }
       return result;
    };

    /**
     * Returns true if the internal state of this HopObject is TRANSIENT.
     * @returns True if this HopObject is marked as <em>transient</em>, false otherwise.
     * @type Boolean
     */
    HopObject.prototype.isTransient = function() {
       return this.__node__.getState() === Packages.helma.objectmodel.INodeState.TRANSIENT;
    };

    /**
     * Returns true if the internal state of this HopObject is VIRTUAL.
     * @returns True if this HopObject is marked as <em>virtual</em>, false otherwise.
     * @type Boolean
     */
    HopObject.prototype.isVirtual = function() {
       return this.__node__.getState() === Packages.helma.objectmodel.INodeState.VIRTUAL;
    };

    /**
     * Returns true if the internal state of this HopObject is INVALID.
     * @returns True if this HopObject is marked as <em>invalid</em>, false otherwise.
     * @type Boolean
     */
    HopObject.prototype.isInvalid = function() {
       return this.__node__.getState() === Packages.helma.objectmodel.INodeState.INVALID;
    };

    /**
     * Returns true if the internal state of this HopObject is CLEAN.
     * @returns True if this HopObject is marked as <em>clean</em>, false otherwise.
     * @type Boolean
     */
    HopObject.prototype.isClean = function() {
       return this.__node__.getState() === Packages.helma.objectmodel.INodeState.CLEAN;
    };

    /**
     * Returns true if the internal state of this HopObject is NEW.
     * @returns True if this HopObject is marked as <em>new</em>, false otherwise.
     * @type Boolean
     */
    HopObject.prototype.isNew = function() {
       return this.__node__.getState() === Packages.helma.objectmodel.INodeState.NEW;
    };

    /**
     * Returns true if the internal state of this HopObject is MODIFIED.
     * @returns True if this HopObject is marked as <em>modified</em>, false otherwise.
     * @type Boolean
     */
    HopObject.prototype.isModified = function() {
       return this.__node__.getState() === Packages.helma.objectmodel.INodeState.MODIFIED;
    };

    /**
     * Returns true if the internal state of this HopObject is DELETED.
     * @returns True if this HopObject is marked as <em>deleted</em>, false otherwise.
     * @type Boolean
     */
    HopObject.prototype.isDeleted = function() {
       return this.__node__.getState() === Packages.helma.objectmodel.INodeState.DELETED;
    };