/****************************************************************************
 * Copyright (c) 2008 Composent, Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Composent, Inc. - initial API and implementation
 *****************************************************************************/

package org.eclipse.ecf.storage;

import org.eclipse.ecf.core.identity.*;
import org.eclipse.equinox.security.storage.ISecurePreferences;

/**
 * Representation of an ID instance inside of an {@link IIDStore}.
 */
public interface IIDEntry {

	/**
	 * Get the underlying {@link ISecurePreferences} node that represents this IDEntry
	 * in the storage.
	 * 
	 * @return {@link ISecurePreferences} that represents this IIDEntry in the underlying storage.  Will
	 * not return <code>null</code>.
	 */
	public ISecurePreferences getPreferences();

	/**
	 * Create an ID from this IDEntry.  This method may be used to create new ID instance from this
	 * {@link IIDEntry}.  The created ID will be equivalent (via ID.equals(other)) to the ID previously
	 * stored via {@link IIDStore#store(ID)}.
	 * 
	 * @return {@link ID} that corresponds to this previously stored {@link IIDEntry}.
	 * @throws IDCreateException if the ID cannot be created in this environment...e.g. due to missing
	 * {@link Namespace}.
	 */
	public ID createID() throws IDCreateException;

	/**
	 * Get any {@link IIDEntry}s that have previously been associated with this IIDEntry via {@link #putAssociate(java.lang.String,IIDEntry,boolean)}.
	 * @param key the String key for retrieving associates.  Must not be <code>null</code>. 
	 * 
	 * @return IIDEntry[] of associated IIDEntry instances that have previously been successfully stored via {@link #putAssociate(java.lang.String,IIDEntry,boolean)}.
	 * If no IIDEntries have been previously stored with the given key, an empty array will be returned.  Will not return <code>null</code>.  Note
	 * that the order of the returned IIDEntrys will not necessarily correspond to the order added via {@link #putAssociate(String, IIDEntry, boolean)}.
	 */
	public IIDEntry[] getAssociates(String key);

	/**
	 * Associate an IIDEntry instance with a String key in this IIDEntry.  The association is one-way (i.e. if successful, future calls to
	 * this {@link #getAssociates(java.lang.String)} with the same key will include the new entry.
	 * 
	 * @param key the String key for storing associates.  Must not be <code>null</code>..
	 * @param entry the {@link IIDEntry} to associated with this {@link IIDEntry}.  Must not be <code>null</code>.
	 * @param encrypt if <code>true</code> associate IIDEntry will be encrypted, <code>false</code> and it will 
	 * not be encrypted.
	 * @throws IDStoreException thrown if the given {@link IIDEntry} cannot be stored.
	 */
	public void putAssociate(String key, IIDEntry entry, boolean encrypt) throws IDStoreException;

	/**
	 * Delete this IIDEntry from the {@link IIDStore}.  This will <b>not</be> delete any associated {@link IIDEntry}s.  It is
	 * up to the client to explicitly remove any such associated entries.
	 */
	public void delete();

}
