package com.c2kernel.lookup; import com.c2kernel.common.ObjectCannotBeUpdated; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.persistency.ClusterStorageException; 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 NextKeyManager { LDAPLookup ldap; String lastKeyPath; public NextKeyManager(LDAPLookup ldap, String lastKeyPath) { super(); this.ldap = ldap; this.lastKeyPath = lastKeyPath; } public synchronized EntityPath generateNextEntityKey() throws ObjectCannotBeUpdated, ObjectNotFoundException { EntityPath lastKey = getLastEntityPath(); try { lastKey.setSysKey(lastKey.getSysKey()+1); } catch (InvalidEntityPathException 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; } public synchronized AgentPath generateNextAgentKey() throws ObjectCannotBeUpdated, ObjectNotFoundException { EntityPath newEntity = generateNextEntityKey(); return new AgentPath(newEntity); } public void writeLastEntityKey(int sysKey) throws ObjectCannotBeUpdated, ObjectNotFoundException { LDAPEntry lastKeyEntry = LDAPLookupUtils.getEntry(ldap.getConnection(),lastKeyPath); LDAPLookupUtils.setAttributeValue(ldap.getConnection(), lastKeyEntry,"intsyskey",Integer.toString(sysKey)); } public EntityPath getLastEntityPath() throws ObjectNotFoundException { LDAPEntry lastKeyEntry = LDAPLookupUtils.getEntry(ldap.getConnection(),lastKeyPath); String lastKey = LDAPLookupUtils.getFirstAttributeValue(lastKeyEntry,"intsyskey"); try { int sysKey = Integer.parseInt(lastKey); EntityPath sysPath = new EntityPath(sysKey); return sysPath; } catch (InvalidEntityPathException ex) { throw new ObjectNotFoundException("Invalid syskey. Maybe centre is full."); } catch (NumberFormatException ex) { throw new ObjectNotFoundException("Invalid syskey in lastkey."); } } }