| /**************************************************************************** |
| * 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(); |
| } |
| } |