001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.legacy.persistence; 005 006 import java.util.ArrayList; 007 import java.util.Iterator; 008 import java.util.List; 009 010 /** 011 * 012 * @author Pavel Vlasov 013 * @version $Revision: 1.1 $ 014 */ 015 public class CompositeStorage implements Storage { 016 private List storages=new ArrayList(); 017 018 private class StorageEntry { 019 String key; 020 Storage storage; 021 022 public boolean equals(Object obj) { 023 return obj instanceof StorageEntry && ((StorageEntry) obj).key.equals(key); 024 } 025 } 026 027 public void addStorage(String key, Storage storage) { 028 if (key==null) { 029 throw new NullPointerException("key==null"); 030 } 031 032 if (storage==null) { 033 throw new NullPointerException("storage==null"); 034 } 035 036 StorageEntry se=new StorageEntry(); 037 se.key=key; 038 se.storage=storage; 039 storages.remove(se); 040 storages.add(se); 041 } 042 043 public String put(Object o) throws PersistenceException { 044 Iterator it=storages.iterator(); 045 while (it.hasNext()) { 046 StorageEntry se=(StorageEntry) it.next(); 047 String key=se.storage.put(o); 048 if (key!=null) { 049 return se.key+":"+key; 050 } 051 } 052 return null; 053 } 054 055 public Object get(String key) throws PersistenceException { 056 int idx=key.indexOf(':'); 057 if (idx==-1) { 058 throw new PersistenceException("Invalid key format"); 059 } else { 060 String skey=key.substring(0, idx); 061 Iterator it=storages.iterator(); 062 while (it.hasNext()) { 063 StorageEntry se=(StorageEntry) it.next(); 064 if (skey.equals(se.key)) { 065 return se.storage.get(key.substring(idx+1)); 066 } 067 } 068 } 069 return null; 070 } 071 072 public void remove(String key) throws PersistenceException { 073 int idx=key.indexOf(':'); 074 if (idx==-1) { 075 throw new PersistenceException("Invalid key format"); 076 } else { 077 String skey=key.substring(0, idx); 078 Iterator it=storages.iterator(); 079 while (it.hasNext()) { 080 StorageEntry se=(StorageEntry) it.next(); 081 if (skey.equals(se.key)) { 082 se.storage.remove(key.substring(idx+1)); 083 return; 084 } 085 } 086 } 087 } 088 089 public Storage getStorage(Class storageClass) { 090 Iterator it=storages.iterator(); 091 while (it.hasNext()) { 092 StorageEntry se=(StorageEntry) it.next(); 093 if (storageClass.isInstance(se.storage)) { 094 return se.storage; 095 } 096 } 097 return null; 098 } 099 100 public Storage getStorage(String storageKey) { 101 Iterator it=storages.iterator(); 102 while (it.hasNext()) { 103 StorageEntry se=(StorageEntry) it.next(); 104 if (storageKey.equals(se.key)) { 105 return se.storage; 106 } 107 } 108 return null; 109 } 110 }