/* * 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 java.io.IOException; import java.util.HashSet; import java.util.Set; import com.mandelsoft.mand.MandelData; import com.mandelsoft.mand.ColormapName; import com.mandelsoft.mand.MandelHeader; import com.mandelsoft.mand.MandelName; import com.mandelsoft.mand.QualifiedMandelName; import com.mandelsoft.mand.util.MandUtils; import com.mandelsoft.util.Utils; /** * * @author Uwe Krueger */ public abstract class MandelScannerSupport extends MandelScannerListenerSupport { static public boolean debug=false; static final public MandelHeader colmapHeader= new MandelHeader(MandelData.C_COLMAP); private Filter filter; private boolean colmaps=true; protected MandelScannerSupport() { } protected MandelScannerSupport(Filter filter) { this.filter=filter; colmaps=filter(colmapHeader); } synchronized public void setFilter(Filter filter) { this.filter=filter; colmaps=filter(colmapHeader); rescan(false); } synchronized public Filter getFilter() { return filter; } ////////////////////////////////////////////////////////////////////////// // utilities for basic methods ////////////////////////////////////////////////////////////////////////// @Override protected boolean filter(MandelHeader h) { if (filter==null) return true; return filter.filter(h); } protected boolean isFiltered() { return filter!=null; } protected boolean providesColormaps() { return colmaps; } ////////////////////////////////////////////////////////////////////////// // basic methods to be implemented ////////////////////////////////////////////////////////////////////////// // may return internal and/or unsynchronized sets // will be copied for external versions abstract protected Set<MandelName> _getMandelNames(); abstract protected Set<MandelHandle> _getMandelHandles(MandelName name); abstract protected Set<ColormapName> _getColormapNames(); abstract protected Set<ColormapHandle> _getColormapHandles(ColormapName name); abstract public void rescan(boolean verbose); ////////////////////////////////////////////////////////////////////////// // basic methods extenal view public Set<MandelName> getMandelNames() { return new HashSet<MandelName>(_getMandelNames()); } public Set<MandelHandle> getMandelHandles(MandelName name) { return new HashSet<MandelHandle>(_getMandelHandles(name)); } public Set<ColormapName> getColormapNames() { return new HashSet<ColormapName>(_getColormapNames()); } public Set<ColormapHandle> getColormapHandles(ColormapName name) { return new HashSet<ColormapHandle>(_getColormapHandles(name)); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // default implementations of the rest ////////////////////////////////////////////////////////////////////////// synchronized public Set<ElementHandle<?>> getAllHandles() { Set<ElementHandle<?>> set=new HashSet<ElementHandle<?>>(); for (MandelName n:getMandelNames()) { set.addAll(getMandelHandles(n)); } for (ColormapName n:getColormapNames()) { set.addAll(getColormapHandles(n)); } return set; } synchronized public Set<MandelHandle> getMandelHandles() { Set<MandelHandle> set=new HashSet<MandelHandle>(); for (MandelName n:getMandelNames()) { set.addAll(getMandelHandles(n)); } return set; } ////////////////////////////////////////////////////////////////////////// // mandel versions ////////////////////////////////////////////////////////////////////////// synchronized public Set<QualifiedMandelName> getQualifiedMandelNames() { Set<QualifiedMandelName> set=new HashSet<QualifiedMandelName>(); for (MandelName n:getMandelNames()) { for (MandelHandle h:getMandelHandles(n)) { set.add(h.getName()); } } return set; } ////////////////////////////////////////////////////////////////////////// // mandel name versions synchronized public MandelHandle getMandelInfo(MandelName name) { MandelHandle best=null; for (MandelHandle h:getMandelHandles(name)) { if (h.getHeader().hasInfo()&&h==MandUtils.better(best, h)) { try { best=new CachedMandelHandle(h).assertInfo(); } catch (IOException ex) { System.out.println("cannot read "+h.getFile()+": "+ex); } } } return best; } synchronized public MandelHandle getMandelData(MandelName name) { MandelHandle best=null; for (MandelHandle h:getMandelHandles(name)) { if (h==MandUtils.better(best, h)) { try { best=new CachedMandelHandle(h).assertData(); } catch (IOException ex) { System.out.println("cannot read "+h.getFile()+": "+ex); } } } return best; } ///////////////////////////////////////////////////////////////////////// // qualified mandel name versions public Set<QualifiedMandelName> getQualifiedMandelNames(MandelName name) { Set<QualifiedMandelName> set=new HashSet<QualifiedMandelName>(); for (MandelHandle h:_getMandelHandles(name)) { set.add(h.getName()); } return set; } public Set<MandelHandle> getMandelHandles(QualifiedMandelName name) { Set<MandelHandle> set=new HashSet<MandelHandle>(); for (MandelHandle h:_getMandelHandles(name.getMandelName())) { if (Utils.equals(h.getQualifier(), name.getQualifier())) set.add(h); } return set; } synchronized public MandelHandle getMandelHandle(QualifiedMandelName name) { MandelHandle best=null; for (MandelHandle h:getMandelHandles(name)) { if (h.getHeader().hasInfo()) { best=MandUtils.better(best, h); } } return best; } synchronized public MandelHandle getMandelInfo(QualifiedMandelName name) { Set<MandelHandle> set=getMandelHandles(name); while (!set.isEmpty()) { MandelHandle best=null; for (MandelHandle h:set) { if (h.getHeader().hasInfo()) { best=MandUtils.better(best, h); } } if (best!=null) { try { return new CachedMandelHandle(best).assertInfo(); } catch (IOException ex) { // just try next } set.remove(best); } else break; } return null; } synchronized public MandelHandle getMandelData(QualifiedMandelName name) { Set<MandelHandle> set=getMandelHandles(name); while (!set.isEmpty()) { MandelHandle best=null; for (MandelHandle h:set) { best=MandUtils.better(best, h); } if (best!=null) { try { return new CachedMandelHandle(best).assertData(); } catch (IOException ex) { // just try next } set.remove(best); } else break; } return null; } ///////////////////////////////////////////////////////////////////////// // colormap versions ///////////////////////////////////////////////////////////////////////// public ColormapHandle getColormap(ColormapName name) { Set<ColormapHandle> set=getColormapHandles(name); if (!set.isEmpty()) { for (ColormapHandle h:set) { try { return new CachedColormapHandle(h).assertData(); } catch (IOException ex) { // just try next } } } return null; } public boolean hasColormap(ColormapName name) { return !_getColormapHandles(name).isEmpty(); } }