Mercurial > hg > digilib-old
view servlet/src/digilib/io/ImageFileSet.java @ 576:dad720e9b12b stream
try: DocuDirent as interface, ImageFile inherits from ImageInput and implements DocuDirent
author | robcast |
---|---|
date | Wed, 22 Dec 2010 20:19:06 +0100 |
parents | |
children | 50bd3d9759f3 |
line wrap: on
line source
/** * */ package digilib.io; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Map; import digilib.io.FileOps.FileClass; /** * @author casties * */ public class ImageFileSet extends ImageSet implements DocuDirent { /** this is an image file */ protected static FileClass fileClass = FileClass.IMAGE; private Directory parent; private boolean metaChecked; private Map fileMeta; /** * Constructor with a file and hints. * * The hints are expected to contain 'basedirs' and 'scaledfilext' keys. * * @param file * @param hints */ public ImageFileSet(File file, Map<Integer,Object> hints) { Directory[] dirs = (Directory[]) hints.get(FileOps.HINT_BASEDIRS); int nb = dirs.length; list = new ArrayList<ImageInput>(nb); parent = dirs[0]; fill(dirs, file, hints); } /* (non-Javadoc) * @see digilib.io.DocuDirent#getName() */ @Override public String getName() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see digilib.io.DocuDirent#getParent() */ @Override public Directory getParent() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see digilib.io.DocuDirent#setParent(digilib.io.Directory) */ @Override public void setParent(Directory parent) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see digilib.io.DocuDirent#getFileMeta() */ @Override public MetadataMap getFileMeta() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see digilib.io.DocuDirent#setFileMeta(digilib.io.MetadataMap) */ @Override public void setFileMeta(MetadataMap fileMeta) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see digilib.io.DocuDirent#isMetaChecked() */ @Override public boolean isMetaChecked() { // TODO Auto-generated method stub return false; } /* (non-Javadoc) * @see digilib.io.DocuDirent#compareTo(java.lang.Object) */ @Override public int compareTo(Object arg0) { // TODO Auto-generated method stub return 0; } @Override public File getInput() { // TODO Auto-generated method stub return null; } /** * Adds an ImageFile to this Fileset. * * The files should be added in the order of higher to lower resolutions. * The first file is considered the hires "original". * * * @param f * file to add * @return true (always) */ public boolean add(ImageFile f) { f.setParent(this); return list.add(f); } /** * Fill the ImageSet with files from different base directories. * * * @param dirs * list of base directories * @param fl * file (from first base dir) * @param hints * */ void fill(Directory[] dirs, File fl, Map<Integer,Object> hints) { int nb = dirs.length; String fn = fl.getName(); String baseFn = FileOps.basename(fn); // add the first ImageFile to the ImageSet add(new ImageFile(fn, this, parent)); // iterate the remaining base directories for (int dirIdx = 1; dirIdx < nb; dirIdx++) { if (dirs[dirIdx] == null) { continue; } // read the directory if (dirs[dirIdx].getFilenames() == null) { dirs[dirIdx].readDir(); } String[] dirFiles = dirs[dirIdx].getFilenames(); // try the same filename as the original int fileIdx = Arrays.binarySearch(dirFiles, fn); if (fileIdx < 0) { // try closest matches without extension fileIdx = -fileIdx - 1; // try idx if ((fileIdx < dirFiles.length) && (FileOps.basename(dirFiles[fileIdx]).equals(baseFn))) { // idx ok } else if ((fileIdx > 0) && (FileOps.basename(dirFiles[fileIdx - 1]) .equals(baseFn))) { // idx-1 ok fileIdx = fileIdx - 1; } else if ((fileIdx+1 < dirFiles.length) && (FileOps.basename(dirFiles[fileIdx + 1]) .equals(baseFn))) { // idx+1 ok fileIdx = fileIdx + 1; } else { // basename doesn't match continue; } } if (FileOps.classForFilename(dirFiles[fileIdx]) == fileClass) { /* logger.debug("adding file " + dirFiles[fileIdx] + " to Fileset " + this.getName()); */ add(new ImageFile(dirFiles[fileIdx], this, dirs[dirIdx])); } } } /** * Checks metadata and sets resolution in resX and resY. * */ public void checkMeta() { if (metaChecked) { return; } if (fileMeta == null) { // try to read metadata file readMeta(); if (fileMeta == null) { // try directory metadata ((DocuDirectory) parent).checkMeta(); if (((DocuDirectory) parent).getDirMeta() != null) { fileMeta = ((DocuDirectory) parent).getDirMeta(); } else { // try parent directory metadata DocuDirectory gp = (DocuDirectory) parent.getParent(); if (gp != null) { gp.checkMeta(); if (gp.getDirMeta() != null) { fileMeta = gp.getDirMeta(); } } } } } if (fileMeta == null) { // no metadata available metaChecked = true; return; } metaChecked = true; float dpi = 0; float dpix = 0; float dpiy = 0; float sizex = 0; float sizey = 0; float pixx = 0; float pixy = 0; // DPI is valid for X and Y if (fileMeta.containsKey("original-dpi")) { try { dpi = Float.parseFloat((String) fileMeta.get("original-dpi")); } catch (NumberFormatException e) { } if (dpi != 0) { resX = dpi; resY = dpi; return; } } // DPI-X and DPI-Y if (fileMeta.containsKey("original-dpi-x") && fileMeta.containsKey("original-dpi-y")) { try { dpix = Float.parseFloat((String) fileMeta .get("original-dpi-x")); dpiy = Float.parseFloat((String) fileMeta .get("original-dpi-y")); } catch (NumberFormatException e) { } if ((dpix != 0) && (dpiy != 0)) { resX = dpix; resY = dpiy; return; } } // SIZE-X and SIZE-Y and PIXEL-X and PIXEL-Y if (fileMeta.containsKey("original-size-x") && fileMeta.containsKey("original-size-y") && fileMeta.containsKey("original-pixel-x") && fileMeta.containsKey("original-pixel-y")) { try { sizex = Float.parseFloat((String) fileMeta .get("original-size-x")); sizey = Float.parseFloat((String) fileMeta .get("original-size-y")); pixx = Float.parseFloat((String) fileMeta .get("original-pixel-x")); pixy = Float.parseFloat((String) fileMeta .get("original-pixel-y")); } catch (NumberFormatException e) { } if ((sizex != 0) && (sizey != 0) && (pixx != 0) && (pixy != 0)) { resX = pixx / (sizex * 100 / 2.54f); resY = pixy / (sizey * 100 / 2.54f); return; } } } public void readMeta() { // TODO Auto-generated method stub } }