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    }