/* * Copyright 2011 Uwe Krueger. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mandelsoft.mand.scan; import com.mandelsoft.mand.ColormapName; import com.mandelsoft.mand.MandelImageDB; import com.mandelsoft.mand.MandelImageDBContext; import com.mandelsoft.mand.MandelImageDBContext.ContextMapping; import com.mandelsoft.mand.MandelName; import com.mandelsoft.mand.QualifiedMandelName; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * * @author Uwe Krueger */ public class DistributedMandelScanner extends CompoundMandelScannerSupport implements ContextMandelScanner { public interface ScannerAccess { MandelScanner getScanner(MandelImageDB db); } /////////////////////////////////////////////////////////////////////////// // Scanner /////////////////////////////////////////////////////////////////////////// private MandelImageDBContext root; private MandelScanner scanner; private Map<MandelImageDB,MandelScanner> nested; private Map<String,List<MandelScanner>> scanners; private ScannerAccess access; public DistributedMandelScanner(MandelImageDBContext ctx, ScannerAccess acc) { this.root=ctx; this.access=acc; this.scanner=access.getScanner(ctx.getDatabase()); if (scanner!=null) addScanner(scanner); nested=new HashMap<MandelImageDB,MandelScanner>(); scanners=new HashMap<String,List<MandelScanner>>(); for (ContextMapping m:root.mappings()) { MandelImageDBContext sctx=m.getContext(); MandelImageDB sdb=sctx.getDatabase(); MandelScanner s=access.getScanner(sdb); if (s!=null) { s=new MappedMandelScanner(s,ctx.getContextMapping(sctx)); nested.put(sdb, s); addScanner(s); } } for (ContextMapping m:root.mappings()) { String label=m.getLabel(); MandelImageDBContext sub=m.getContext(); List<MandelScanner> subs=new ArrayList<MandelScanner>(); if (scanner!=null) subs.add(scanner); for (MandelImageDBContext c:sub.containers()) { if (sub!=ctx) { MandelScanner s=nested.get(sub.getDatabase()); if (s!=null) subs.add(s); } } scanners.put(label, subs); } } ////////////////////////////////////////////////////////////////////////// // basic methods to be implemented for support class @Override protected Set<MandelHandle> _getMandelHandles(MandelName name) { String label=name.getLabel(); if (label==null) return scanner.getMandelHandles(name); return _getMandelHandles(scanners.get(label),name); } ////////////////////////////////////////////////////////////////////////// @Override protected Set<ColormapHandle> _getColormapHandles(ColormapName name) { String label=name.getLabel(); if (label==null) return scanner.getColormapHandles(name); return _getColormapHandles(scanners.get(label),name); } ////////////////////////////////////////////////////////////////////////// // optimized access ////////////////////////////////////////////////////////////////////////// @Override public MandelHandle getMandelData(MandelName name) { String label=name.getLabel(); if (label==null) return scanner.getMandelData(name); return _getMandelData(scanners.get(label),name); } @Override public MandelHandle getMandelData(QualifiedMandelName name) { String label=name.getLabel(); if (label==null) return scanner.getMandelData(name); return _getMandelData(scanners.get(label),name); } @Override public MandelHandle getMandelHandle(QualifiedMandelName name) { String label=name.getLabel(); if (label==null) return scanner.getMandelHandle(name); return _getMandelHandle(scanners.get(label),name); } @Override public synchronized Set<MandelHandle> getMandelHandles(MandelName name) { String label=name.getLabel(); if (label==null) return scanner.getMandelHandles(name); return _getMandelHandles(scanners.get(label),name); } @Override public Set<MandelHandle> getMandelHandles(QualifiedMandelName name) { return super.getMandelHandles(name); } @Override public MandelHandle getMandelInfo(MandelName name) { String label=name.getLabel(); if (label==null) return scanner.getMandelInfo(name); return _getMandelInfo(scanners.get(label),name); } @Override public MandelHandle getMandelInfo(QualifiedMandelName name) { String label=name.getLabel(); if (label==null) return scanner.getMandelInfo(name); return _getMandelInfo(scanners.get(label),name); } /////////////////////////////////////////////////////////////////////////// @Override public synchronized Set<ColormapHandle> getColormapHandles(ColormapName name) { String label=name.getLabel(); if (label==null) return scanner.getColormapHandles(name); MandelImageDBContext ctx=root.getContext(label); if (ctx!=null) { return nested.get(ctx.getDatabase()).getColormapHandles(name); } return new HashSet<ColormapHandle>(); } @Override public synchronized boolean hasColormap(ColormapName name) { String label=name.getLabel(); if (label==null) return scanner.hasColormap(name); MandelImageDBContext ctx=root.getContext(label); if (ctx!=null) { return nested.get(ctx.getDatabase()).hasColormap(name); } return false; } /////////////////////////////////////////////////////////////////////////// // EnvScanner /////////////////////////////////////////////////////////////////////////// public MandelImageDBContext getContext() { return root; } public Set<MandelName> getSubNames(MandelName n) { return MandelScannerUtils.getSubNames(n, root, this); } public Set<MandelName> getSubNames(MandelName n, Filter f) { return MandelScannerUtils.getSubNames(n, root, this, f); } public boolean hasSubNames(MandelName n) { return MandelScannerUtils.hasSubNames(n, root, this); } public boolean hasSubNames(MandelName n, Filter f) { return MandelScannerUtils.hasSubNames(n, root, this, f); } }