blob: 1dc2442ddeb3c06d1e6803104f3a924a89ed2df4 [file] [log] [blame]
/****************************************************************************
* 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();
}
}