/* * 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 java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.mandelsoft.mand.MandelName; import com.mandelsoft.mand.QualifiedMandelName; import com.mandelsoft.mand.util.MandUtils; import java.util.Collection; /** * * @author Uwe Krueger */ public abstract class CompoundMandelScannerSupport extends MandelScannerSupport { protected List<MandelScanner> list=new ArrayList<MandelScanner>(); private Listener listener=new Listener(); public CompoundMandelScannerSupport() { } protected void addScanner(MandelScanner s) { if (!list.contains(s)) { startUpdate(true); //System.out.println(" add scanner "+s); list.add(0,s); s.addMandelScannerListener(listener); finishUpdate(); } } protected void removeScanner(MandelScanner s) { if (list.contains(s)) { startUpdate(true); list.remove(s); s.removeMandelScannerListener(listener); } } public boolean hasScanners() { return !list.isEmpty(); } /////////////////////////////////////////////////////////////////////////// // implementation support /////////////////////////////////////////////////////////////////////////// protected Set<MandelName> _getMandelNames(Collection<MandelScanner> scanners) { Set<MandelName> set=new HashSet<MandelName>(); if (scanners==null) return set; if (!isFiltered()) { //System.out.println("unfiltered mandel names"); for (MandelScanner s:scanners) { set.addAll(s.getMandelNames()); } } else { //System.out.println("filtered mandel names"); for (MandelScanner s:scanners) { for (MandelName n:s.getMandelNames()) { if (!set.contains(n)) { Set<MandelHandle> hs=s.getMandelHandles(n); if (hs!=null) for (MandelHandle h:hs) { if (filter(h.getHeader())) { set.add(n); break; } } } } } } return set; } protected Set<MandelHandle> _getMandelHandles(Collection<MandelScanner> scanners, MandelName name) { Set<MandelHandle> set=new HashSet<MandelHandle>(); if (scanners!=null) for (MandelScanner s:scanners) { Set<MandelHandle> sub=s.getMandelHandles(name); //System.out.println("sub: "+s+": "+name+": "+set); add(set,sub); } //System.out.println("CS: "+name+": "+set); return set; } /////////////////////////////////////////////////////////////////////////// protected Set<ColormapName> _getColormapNames(Collection<MandelScanner> scanners) { Set<ColormapName> set=new HashSet<ColormapName>(); if (scanners!=null && providesColormaps()) for (MandelScanner s:scanners) { set.addAll(s.getColormapNames()); } return set; } protected Set<ColormapHandle> _getColormapHandles(Collection<MandelScanner> scanners, ColormapName name) { Set<ColormapHandle> set=new HashSet<ColormapHandle>(); if (scanners!=null && providesColormaps()) for (MandelScanner s:scanners) { Set<ColormapHandle> cm=s.getColormapHandles(name); set.addAll(cm); } return set; } /////////////////////////////////////////////////////////////////////////// protected MandelHandle _getMandelInfo(Collection<MandelScanner> scanners, MandelName name) { MandelHandle best=null; if (scanners!=null) for (MandelScanner s:scanners) { MandelHandle md=s.getMandelInfo(name); best=MandUtils.better(best, md); } return best; } protected MandelHandle _getMandelData(Collection<MandelScanner> scanners, MandelName name) { MandelHandle best=null; if (scanners!=null) for (MandelScanner s:scanners) { MandelHandle md=s.getMandelData(name); best=MandUtils.better(best, md); } return best; } //////////////////////////////////////////////////////////////////////// protected MandelHandle _getMandelHandle(Collection<MandelScanner> scanners, QualifiedMandelName name) { MandelHandle best=null; if (scanners!=null) for (MandelScanner s:scanners) { MandelHandle md=s.getMandelHandle(name); best=MandUtils.better(best, md); } return best; } protected MandelHandle _getMandelInfo(Collection<MandelScanner> scanners, QualifiedMandelName name) { MandelHandle best=null; if (scanners!=null) for (MandelScanner s:scanners) { MandelHandle md=s.getMandelInfo(name); best=MandUtils.better(best, md); } return best; } protected MandelHandle _getMandelData(Collection<MandelScanner> scanners, QualifiedMandelName name) { MandelHandle best=null; if (scanners!=null) for (MandelScanner s:scanners) { MandelHandle md=s.getMandelData(name); best=MandUtils.better(best, md); } return best; } protected boolean _hasColormap(Collection<MandelScanner> scanners, ColormapName name) { if (scanners!=null && providesColormaps()) { for (MandelScanner s:scanners) { if (s.hasColormap(name)) return true; } } return false; } /////////////////////////////////////////////////////////////////////////// // mandel scanner interface /////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // basic methods to be implemented for support class protected Set<MandelName> _getMandelNames() { return _getMandelNames(list); } protected Set<MandelHandle> _getMandelHandles(MandelName name) { return _getMandelHandles(list,name); } ////////////////////////////////////////////////////////////////////////// protected Set<ColormapName> _getColormapNames() { return _getColormapNames(list); } protected Set<ColormapHandle> _getColormapHandles(ColormapName name) { return _getColormapHandles(list,name); } ////////////////////////////////////////////////////////////////////////// // optimized access ////////////////////////////////////////////////////////////////////////// // // avoid unneccessary copy of set // @Override synchronized public Set<MandelName> getMandelNames() { return _getMandelNames(); } @Override synchronized public Set<MandelHandle> getMandelHandles(MandelName name) { return _getMandelHandles(name); } @Override synchronized public Set<ColormapName> getColormapNames() { return _getColormapNames(); } @Override synchronized public Set<ColormapHandle> getColormapHandles(ColormapName name) { return _getColormapHandles(name); } ////////////////////////////////////////////////////////////////////////// // optimized access // // better implementation // @Override public MandelHandle getMandelInfo(MandelName name) { return _getMandelInfo(list,name); } @Override public MandelHandle getMandelData(MandelName name) { return _getMandelData(list,name); } //////////////////////////////////////////////////////////////////////// @Override public MandelHandle getMandelHandle(QualifiedMandelName name) { return _getMandelHandle(list,name); } @Override public MandelHandle getMandelInfo(QualifiedMandelName name) { return _getMandelInfo(list,name); } @Override public MandelHandle getMandelData(QualifiedMandelName name) { return _getMandelData(list,name); } // // required for interface // @Override public boolean hasColormap(ColormapName name) { return _hasColormap(list,name); } ///////////////////////////////////////////////////////////////////////// // general ///////////////////////////////////////////////////////////////////////// synchronized public void rescan(boolean verbose) { if (debug) System.out.println("*** rescan compound scanner"); //new Throwable().printStackTrace(); startUpdate(); for (MandelScanner s:list) { s.rescan(verbose); } finishUpdate(); } ///////////////////////////////////////////////////////////////////////// // utilitiies ///////////////////////////////////////////////////////////////////////// private void add(Set<MandelHandle> set, Set<MandelHandle> a) { if (isFiltered()) { for (MandelHandle h:a) { if (filter(h.getHeader())) set.add(h); } } else set.addAll(a); } }