001package com.hammurapi.common;
002
003import java.util.ArrayList;
004import java.util.Iterator;
005import java.util.List;
006
007import com.hammurapi.extract.Predicate;
008
009/**
010 * Context delegating to other contexts "parts".
011 * @author Pavel Vlasov
012 *
013 */
014public class CompositeContext implements MutableContext {
015        
016        private Context[] parts;
017        
018        public CompositeContext() {
019                // 
020        }
021
022        public CompositeContext(Context...parts) {
023                this.parts = parts;
024        }
025        
026        public void setParts(Context...parts) {
027                this.parts = parts;
028        }
029        
030        public <T> Iterator<T> lookupAll(Class<T> serviceClass, Predicate<T, Context>... selectors) {
031                List<T> all = new ArrayList<T>();
032                for (Context part: parts) {
033                        if (part!=null) {
034                                Iterator<T> cit = part.lookupAll(serviceClass, selectors);
035                                while (cit.hasNext()) {
036                                        all.add(cit.next());
037                                }
038                        }
039                }
040                return all.iterator();
041        }
042        
043        public <T> T lookup(Class<T> serviceClass, Predicate<T, Context>... selectors) {
044                for (Context part: parts) {
045                        if (part!=null) {
046                                T ret = part.lookup(serviceClass, selectors);
047                                if (ret!=null) {
048                                        return ret;
049                                }
050                        }
051                }
052                return null;
053        }
054        
055        public Object lookup(String name) {
056                for (Context part: parts) {
057                        if (part!=null) {
058                                Object ret = part.lookup(name);
059                                if (ret!=null) {
060                                        return ret;
061                                }
062                        }
063                }
064                return null;
065        }
066
067        public void bind(String name, Object obj) {
068                for (Context part: parts) {
069                        if (part instanceof MutableContext) {
070                                ((MutableContext) part).bind(name, obj);
071                                return;
072                        }
073                }
074                throw new IllegalStateException("Composite context doesn't contain mutable parts.");
075        }
076
077        public <T> void register(Class<? super T> type, T service) {
078                for (Context part: parts) {
079                        if (part instanceof MutableContext) {
080                                ((MutableContext) part).register(type, service);
081                                return;
082                        }
083                }
084                throw new IllegalStateException("Composite context doesn't contain mutable parts.");
085        }
086
087        public Object unbind(String name) {
088                for (Context part: parts) {
089                        if (part instanceof MutableContext) {
090                                return ((MutableContext) part).unbind(name);
091                        }
092                }
093                throw new IllegalStateException("Composite context doesn't contain mutable parts.");
094        }
095
096        public <T> void unregister(Class<? super T> type, T service) {
097                for (Context part: parts) {
098                        if (part instanceof MutableContext) {
099                                ((MutableContext) part).unregister(type, service);
100                                return;
101                        }
102                }
103                throw new IllegalStateException("Composite context doesn't contain mutable parts.");
104        }
105}
106