
package org.stroque.util;

import java.util.StringTokenizer;
import java.util.Vector;

import org.apache.torque.TorqueException;
import org.apache.torque.om.*;

/**
 * @author Mathieu Frenette
 * @version 1.0
 */
public class KeyHelper
{
    private static final String SEPARATOR = ":";

    public static String convertObjectKeyToString(ObjectKey key)
    {
        // Determine correct prefix
        if (key instanceof NumberKey)
        {
            return "n" + key.toString();
        }
        else if (key instanceof StringKey)
        {
            return "s" + key.toString();
        }
        else if (key instanceof ComboKey)
        {
            SimpleKey[] keys = (SimpleKey[])key.getValue();
            StringBuffer buf = new StringBuffer(15);
            buf.append("c");
            for (int i = 0; i < keys.length; i++)
            {
                SimpleKey simpleKey = keys[i];
                if (i > 0)
                {
                    buf.append(SEPARATOR);
                }
                buf.append(convertObjectKeyToString(simpleKey));
            }
            return buf.toString();
        }
        else
        {
            throw new UnsupportedOperationException("Unsupported ObjectKey sub-class: " + key.getClass().getName());
        }
    }

    public static ObjectKey convertStringToObjectKey(String str)
    {
        if (str == null)
        {
            return null;
        }

        String prefix = str.substring(0, 1);
        String key = str.substring(1);

        if (prefix.equals("n"))
        {
            return new NumberKey(key);
        }
        else if (prefix.equals("s"))
        {
            return new StringKey(key);
        }
        else if (prefix.equals("c"))
        {
            StringTokenizer tokenizer = new StringTokenizer(key, SEPARATOR);
            int tokens = tokenizer.countTokens();
            SimpleKey[] keys = new SimpleKey[tokens];
            for (int i=0; i<tokens; i++)
            {
                final String token = tokenizer.nextToken();
                keys[i] = (SimpleKey)convertStringToObjectKey(token);
            }
            return new ComboKey(keys);
        }
        else
        {
            throw new UnsupportedOperationException("Illegal prefix: " + prefix);
        }
    }
}

