/**************************************************************************** * 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.internal.storage; import java.util.*; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.ecf.core.identity.*; import org.eclipse.ecf.storage.IDStoreException; import org.eclipse.ecf.storage.IIDEntry; import org.eclipse.equinox.security.storage.EncodingUtils; import org.eclipse.equinox.security.storage.ISecurePreferences; /** * */ public class IDEntry implements IIDEntry { /** * */ private static final String DELIMITER = ":"; //$NON-NLS-1$ private final ISecurePreferences prefs; public IDEntry(ISecurePreferences prefs) { this.prefs = prefs; } /* * (non-Javadoc) * * @see org.eclipse.ecf.storage.IIDEntry#getPreferences() */ public ISecurePreferences getPreferences() { return prefs; } public void putAssociate(String key, IIDEntry entry, boolean encrypt) throws IDStoreException { if (key == null) throw new IDStoreException("key cannot be null"); //$NON-NLS-1$ if (entry == null) throw new IDStoreException("entry cannot be null"); //$NON-NLS-1$ ISecurePreferences associateNode = prefs.node(key); ISecurePreferences prefs = entry.getPreferences(); // This is where associates are created with form: // <index>:<namespace>:<idname> String entryAssociate = String .valueOf(associateNode.childrenNames().length) + DELIMITER + prefs.parent().name() + DELIMITER + prefs.name(); associateNode.node(entryAssociate); } private ISecurePreferences getNamespaceRoot() { // The namespace root is the parent of our parent (which is the // namespace) return prefs.parent().parent(); } private ISecurePreferences getPreferences(ISecurePreferences parent, String name) { List names = Arrays.asList(parent.childrenNames()); if (names.contains(name)) return parent.node(name); return null; } private void addAssociateFromName(String name, SortedMap results) { try { // Get index of first : int index = name.indexOf(DELIMITER); // If not found then the name is not well-formed if (index == -1) throw new IDStoreException("Associate ID not well-formed"); //$NON-NLS-1$ // Get the index string String indexStr = name.substring(0, index); Integer resultIndex = null; // Create resultIndex from indexStr try { resultIndex = Integer.valueOf(indexStr); } catch (NumberFormatException e) { throw new IDStoreException("Associate ID not well-formed", e); //$NON-NLS-1$ } // get remainder string name = name.substring(index + 1); // Get index of second : index = name.indexOf(DELIMITER); if (index == -1) throw new IDStoreException("Associate ID not well-formed"); //$NON-NLS-1$ // Get namespace name before index String namespaceName = name.substring(0, index); ISecurePreferences namespacePrefs = getPreferences( getNamespaceRoot(), namespaceName); if (namespacePrefs == null) throw new IDStoreException( "Cannot find Namespace=" + namespaceName); //$NON-NLS-1$ // Get ID name after index String idName = name.substring(index + 1); ISecurePreferences idPrefs = getPreferences(namespacePrefs, idName); if (idPrefs == null) throw new IDStoreException( "ID=" + idName + " not found in Namespace=" + namespaceName); //$NON-NLS-1$ //$NON-NLS-2$ // Put new IDEntry in sorted collection ordered by resultIndex results.put(resultIndex, new IDEntry(idPrefs)); } catch (IDStoreException e) { Activator.getDefault().log( new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, "Unable to create associate ID", e)); //$NON-NLS-1$ } } /* * (non-Javadoc) * * @see org.eclipse.ecf.storage.IIDEntry#createID() */ public ID createID() throws IDCreateException { return IDFactory.getDefault().createID(prefs.parent().name(), EncodingUtils.decodeSlashes(prefs.name())); } /* * (non-Javadoc) * * @see org.eclipse.ecf.storage.IIDEntry#delete() */ public void delete() { prefs.removeNode(); } public IIDEntry[] getAssociates(String key) { if (key == null) return new IIDEntry[0]; ISecurePreferences associateNode = prefs.node(key); String[] childrenNames = associateNode.childrenNames(); SortedMap results = new TreeMap(); for (int i = 0; i < childrenNames.length; i++) { addAssociateFromName(childrenNames[i], results); } return (IIDEntry[]) results.values().toArray(new IIDEntry[] {}); } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ public String toString() { StringBuffer sb = new StringBuffer("IDEntry["); //$NON-NLS-1$ sb.append(prefs.name()).append("]"); //$NON-NLS-1$ return sb.toString(); } }