javacommons/javastorage/javasrc/com/nokia/mj/impl/storage/StorageAttribute.java
changeset 21 2a9601315dfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/javastorage/javasrc/com/nokia/mj/impl/storage/StorageAttribute.java	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,244 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.mj.impl.storage;
+
+/**
+ * StorageAttribute represents one attribute in JavaStorageEntry. It is
+ * basically a key value pair and it holds one storage column information.
+ */
+public final class StorageAttribute implements StorageNames
+{
+    /**
+     * Escape delimiter is used to escape such characters that cannot exists
+     * in SQL statement column value.
+     */
+    private static final char ESCAPE_CHAR_SQUOTE = '\'';
+
+    private String iName;
+    private String iValue;
+    private int iType;
+
+    /**
+     * StorageAttribute value type Int.
+     */
+    public static final int INT_TYPE = 1;
+
+    /**
+     * StorageAttribute value type String. Default type.
+     */
+    public static final int STRING_TYPE = 2;
+
+    /**
+     * StorageAttribute value type NULL.
+     */
+    public static final int NULL_TYPE = 3;
+
+    private StorageAttribute() {}
+
+    /**
+     * Constructor. Create attribute based on name and value. Type is set to
+     * default i.e. STRING_TYPE.
+     *
+     * @param aName attribute name.
+     * @param aValue attribute value. Null value is converted to empty String.
+     * @throws StorageException if name is null or empty and if value type
+     *         is unsupported.
+     */
+    public StorageAttribute(String aName, String aValue)
+    throws StorageException
+    {
+        setAttribute(aName, aValue, STRING_TYPE);
+    }
+
+    /**
+     * Constructor. Create attribute based on name, value and type.
+     *
+     * @param aName attribute name.
+     * @param aValue attribute value. Null value is converted to empty String.
+     * @param aAttributeType attribute type.
+     * @throws StorageException if name is null or empty and if value type
+     *         is unsupported.
+     */
+    public StorageAttribute(String aName, String aValue, int aAttributeType)
+    throws StorageException
+    {
+        setAttribute(aName, aValue, aAttributeType);
+    }
+
+    /*** ----------------------------- PUBLIC ------------------------------ */
+
+    /**
+     * Set attribute. Overrides existing value.
+     *
+     * @param aName attribute name.
+     * @param aValue attribute value. If value is null type is set
+     *               to NULL_TYPE.
+     * @param aAttributeType type of attribute.
+     * @throws StorageException if name is null or empty of value type
+     *         is unsupported.
+     */
+    public void setAttribute(String aName, String aValue, int aAttributeType)
+    throws StorageException
+    {
+        if (aName == null || aName.equals(""))
+        {
+            throw new StorageException("Invalid name argument");
+        }
+
+        if (aAttributeType < INT_TYPE || aAttributeType > NULL_TYPE)
+        {
+            throw new StorageException("Invalid type argument");
+        }
+
+        iName = aName;
+
+        if (aValue == null || aAttributeType == NULL_TYPE)
+        {
+            iValue = "NULL";
+            iType = NULL_TYPE;
+        }
+        else
+        {
+            iValue = aValue;
+            iType = aAttributeType;
+        }
+    }
+
+    /**
+     * Get attribute name.
+     *
+     * @return name.
+     */
+    public String getName()
+    {
+        return iName;
+    }
+
+    /**
+     * Get attribute value.
+     *
+     * @return value. If value is not set null is returned.
+     */
+    public String getValue()
+    {
+        if (iType != NULL_TYPE)
+            return iValue;
+        else
+            return null;
+    }
+
+    /**
+     * Get attribute type.<p>
+     * NOTE: Attribute type is not stored to database. This is used
+     * by the storage clients to inform StorageSession of INT value.
+     * When reading data from storage all attributes have default type value
+     * that is StorageSession.STRING_TYPE.
+     *
+     * @return type.
+     */
+    public int getType()
+    {
+        return iType;
+    }
+
+    /**
+     * Print StorageAttribute as String.
+     *
+     * @return attribute in String format. NAME='VALUE' Type: TYPE'
+     */
+    public String toString()
+    {
+        return iName + "='" + iValue + "' Type: " + Integer.toString(iType);
+    }
+
+    /**
+     * Returns a hash code value for this object.
+     */
+    public int hashCode()
+    {
+        return iName.hashCode() + iValue.hashCode() + iType;
+    }
+
+    /**
+     * Indicates whether given object is equal to this one.
+     */
+    public boolean equals(Object aObj)
+    {
+
+        if (!(aObj instanceof StorageAttribute))
+        {
+            return false;
+        }
+
+        StorageAttribute attr = (StorageAttribute) aObj;
+
+        if (this.getName().equals(attr.getName())
+                && this.getValue().equals(attr.getValue())
+                && this.getType() == attr.getType())
+        {
+            return true;
+        }
+
+        return false;
+    }
+
+    /*** ------------------------ PACKAGE PROTECTED ------------------------ */
+
+    /**
+     * Escape value. This is used internally when storage query is constructed.
+     *
+     * @return escaped StorageAttribute value.
+     */
+    String getEscapedValue()
+    {
+        if (iValue.indexOf(ESCAPE_CHAR_SQUOTE) != -1)
+        {
+            return escape();
+        }
+        else
+        {
+            return iValue;
+        }
+    }
+
+    /*** ----------------------------- PACKAGE ---------------------------- */
+    /*** ----------------------------- PRIVATE ---------------------------- */
+
+    /**
+     * Escape attribute value.
+     *
+     * @param  aValue to be escaped.
+     * @return escaped string.
+     */
+    private String escape()
+    {
+        StringBuffer escapedVal = new StringBuffer(iValue);
+        for (int i = 0; i < escapedVal.length(); i++)
+        {
+            if (escapedVal.charAt(i) == ESCAPE_CHAR_SQUOTE)
+            {
+                escapedVal.insert(i, ESCAPE_CHAR_SQUOTE);
+                i++;
+            }
+        }
+        return escapedVal.toString();
+    }
+
+    /*** ----------------------------- NATIVE ----------------------------- */
+}