package com.c2kernel.lookup.ldap; import com.c2kernel.common.ObjectCannotBeUpdated; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.lookup.AgentPath; import com.c2kernel.lookup.InvalidItemPathException; import com.c2kernel.lookup.ItemPath; import com.c2kernel.persistency.ClusterStorageException; import com.c2kernel.persistency.NextKeyManager; import com.c2kernel.process.Gateway; import com.c2kernel.utils.Logger; import com.novell.ldap.LDAPEntry; /************************************************************************** * * $Revision: 1.2 $ * $Date: 2005/04/27 13:47:24 $ * * Copyright (C) 2003 CERN - European Organization for Nuclear Research * All rights reserved. **************************************************************************/ // public static final String codeRevision = "$Revision: 1.2 $ $Date: 2005/04/27 13:47:24 $ $Author: abranson $"; public class LDAPNextKeyManager implements NextKeyManager { LDAPAuthManager ldap; String lastKeyPath; public LDAPNextKeyManager(LDAPAuthManager ldap, String lastKeyPath) { super(); this.ldap = ldap; this.lastKeyPath = lastKeyPath; } @Override public synchronized ItemPath generateNextEntityKey() throws ObjectCannotBeUpdated, ObjectNotFoundException { ItemPath lastKey = getLastEntityPath(); try { lastKey.setSysKey(lastKey.getSysKey()+1); } catch (InvalidItemPathException ex) { throw new ObjectCannotBeUpdated("Invalid syskey "+(lastKey.getSysKey()+1)+". Maybe centre is full."); } //test that storage is empty for that key try { if (Gateway.getStorage().getClusterContents(lastKey.getSysKey(), "").length > 0) throw new ObjectCannotBeUpdated("NextKeyManager: Storage already contains data for syskey "+lastKey.getSysKey()+ ". Storage is out of sync with nextkey. Please contact an administrator", ""); } catch (ClusterStorageException e) { Logger.error(e); throw new ObjectCannotBeUpdated("Could not check storage for prior data for the next generated systemKey: "+e.getMessage()); } //set the last key writeLastEntityKey(lastKey.getSysKey()); return lastKey; } @Override public synchronized AgentPath generateNextAgentKey() throws ObjectCannotBeUpdated, ObjectNotFoundException { ItemPath newEntity = generateNextEntityKey(); return new AgentPath(newEntity); } @Override public void writeLastEntityKey(int sysKey) throws ObjectCannotBeUpdated, ObjectNotFoundException { LDAPEntry lastKeyEntry = LDAPLookupUtils.getEntry(ldap.getAuthObject(),lastKeyPath); LDAPLookupUtils.setAttributeValue(ldap.getAuthObject(), lastKeyEntry,"intsyskey",Integer.toString(sysKey)); } @Override public ItemPath getLastEntityPath() throws ObjectNotFoundException { LDAPEntry lastKeyEntry = LDAPLookupUtils.getEntry(ldap.getAuthObject(),lastKeyPath); String lastKey = LDAPLookupUtils.getFirstAttributeValue(lastKeyEntry,"intsyskey"); try { int sysKey = Integer.parseInt(lastKey); ItemPath sysPath = new ItemPath(sysKey); return sysPath; } catch (InvalidItemPathException ex) { throw new ObjectNotFoundException("Invalid syskey. Maybe centre is full."); } catch (NumberFormatException ex) { throw new ObjectNotFoundException("Invalid syskey in lastkey."); } } }