package com.c2kernel.persistency; import java.util.ArrayList; import java.util.StringTokenizer; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.C2KLocalObject; import com.c2kernel.lookup.InvalidItemPathException; import com.c2kernel.lookup.ItemPath; import com.c2kernel.lookup.Lookup; import com.c2kernel.lookup.ldap.LDAPLookup; import com.c2kernel.lookup.ldap.LDAPPropertyManager; import com.c2kernel.process.Gateway; import com.c2kernel.property.Property; import com.c2kernel.utils.Logger; public class LDAPClusterStorage extends ClusterStorage { LDAPPropertyManager ldapStore; @Override public void open() throws ClusterStorageException { Lookup lookup = Gateway.getLookup(); if (lookup instanceof LDAPLookup) ldapStore = ((LDAPLookup)lookup).getPropManager(); else throw new ClusterStorageException("Cannot use LDAP cluster storage without LDAP Lookup"); } @Override public void close() throws ClusterStorageException { } // introspection @Override public short queryClusterSupport(String clusterType) { if (clusterType.equals(PROPERTY)) return READWRITE; else return NONE; } @Override public String getName() { return "LDAP Cluster Storage"; } @Override public String getId() { return "LDAP"; } // retrieve object by path @Override public C2KLocalObject get(Integer sysKey, String path) throws ClusterStorageException { Logger.msg(6, "LDAPClusterStorage.get() - "+sysKey+"/"+path); StringTokenizer tok = new StringTokenizer(path, "/"); int pathLength = tok.countTokens(); if (pathLength != 2) throw new ClusterStorageException("Path length was invalid: "+path); String type = tok.nextToken(); ItemPath thisEntity; try { thisEntity = new ItemPath(sysKey.intValue()); } catch (InvalidItemPathException e) { throw new ClusterStorageException("Invalid Syskey:"+sysKey); } String objName = tok.nextToken(); C2KLocalObject newObj; if (type.equals(PROPERTY)) { try { Property newProperty = ldapStore.getProperty(thisEntity, objName); newObj = newProperty; } catch (ObjectNotFoundException ex) { throw new ClusterStorageException("Property "+objName+" not found in "+sysKey); } } else throw new ClusterStorageException("Cluster type "+type+" not supported."); return newObj; } // store object by path @Override public void put(Integer sysKey, C2KLocalObject obj) throws ClusterStorageException { Logger.msg(6, "LDAPClusterStorage.put() - "+sysKey+"/"+ClusterStorage.getPath(obj)); String type = obj.getClusterType(); ItemPath thisEntity; try { thisEntity = new ItemPath(sysKey.intValue()); } catch (InvalidItemPathException e) { throw new ClusterStorageException("Invalid Syskey:"+sysKey); } if (type.equals(PROPERTY)) { try { ldapStore.setProperty(thisEntity, (Property)obj); } catch (Exception e1) { Logger.error(e1); throw new ClusterStorageException("LDAPClusterStorage - could not write property"); } } else throw new ClusterStorageException("Cluster type "+type+" not supported."); } // delete cluster @Override public void delete(Integer sysKey, String path) throws ClusterStorageException { StringTokenizer tok = new StringTokenizer(path, "/"); int pathLength = tok.countTokens(); if (pathLength != 2) throw new ClusterStorageException("Path length was invalid: "+path); String type = tok.nextToken(); ItemPath thisEntity; try { thisEntity = new ItemPath(sysKey.intValue()); } catch (InvalidItemPathException e) { throw new ClusterStorageException("Invalid Syskey:"+sysKey); } if (type.equals(PROPERTY)) { try { ldapStore.deleteProperty(thisEntity, tok.nextToken()); } catch (Exception e1) { Logger.error(e1); throw new ClusterStorageException("LDAPClusterStorage - could not delete property"); } } else throw new ClusterStorageException("Cluster type "+type+" not supported."); } /* navigation */ // directory listing @Override public String[] getClusterContents(Integer sysKey, String path) throws ClusterStorageException { Logger.msg(6, "LDAPClusterStorage.getClusterContents() - "+sysKey+"/"+path); StringTokenizer tok = new StringTokenizer(path, "/"); int pathLength = tok.countTokens(); if (pathLength > 1) return new String[0]; String type = getClusterType(path); try { ItemPath thisEntity = new ItemPath(sysKey.intValue()); if (type.equals(PROPERTY)) return ldapStore.getPropertyNames(thisEntity); else if (type.equals("")) { // root query String[] allClusters = new String[0]; ArrayList clusterList = new ArrayList(); if (ldapStore.hasProperties(thisEntity)) clusterList.add(PROPERTY); allClusters = clusterList.toArray(allClusters); return allClusters; } else throw new ClusterStorageException("Cluster type "+type+" not supported."); } catch (InvalidItemPathException e) { throw new ClusterStorageException("Invalid Syskey:"+sysKey); } catch (ObjectNotFoundException e) { throw new ClusterStorageException("Entity "+sysKey+" does not exist"); } } }