--- /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 ----------------------------- */
+}