/*
* 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;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import com.mandelsoft.io.AbstractFile;
import com.mandelsoft.mand.scan.FilteredMandelScanner;
import com.mandelsoft.mand.scan.MandelHandle;
import com.mandelsoft.mand.scan.MandelScanner;
import com.mandelsoft.mand.scan.PathMandelScanner;
import com.mandelsoft.mand.scan.MandelScannerCache;
import com.mandelsoft.mand.util.ColorList;
import com.mandelsoft.mand.util.FileColorList;
import com.mandelsoft.mand.util.FileMandelList;
import com.mandelsoft.mand.util.FileMandelListFolderTree;
import com.mandelsoft.mand.util.FileTagList;
import com.mandelsoft.mand.util.MandUtils;
import com.mandelsoft.mand.util.MandelList;
import com.mandelsoft.mand.util.MandelListFolderTree;
import com.mandelsoft.mand.util.TagList;
import com.mandelsoft.util.Utils;
/**
*
* @author Uwe Krueger
*/
public class MandelImageDB implements MandelConstants {
static public boolean debug=false;
private boolean readonly;
private Settings settings;
private String copyright;
private PathMandelScanner all;
private MandelScanner imagedata;
private MandelScanner raster;
private MandelScanner info;
private MandelScanner prioinfo;
private MandelScanner meta;
private MandelScanner rasterimage;
private MandelScanner areacolmap;
private MandelScanner colormaps;
private MandelScanner newraster;
private MandelScanner incomplete;
private ColorList colors;
private TagList tags;
private MandelListFolderTree tfavorites;
private MandelListFolderTree ttodos;
private MandelListFolderTree tlinks;
private MandelList favorites;
private MandelList todos;
private MandelList areas;
private MandelList seenrasters;
private MandelList refinements;
private List<MandelListFolderTree> userlists;
private Proxy proxy=null;
private MandelScannerCache scannercache;
public MandelImageDB(MandelImageDBFactory fac)
{ this(fac,new File("."));
}
public MandelImageDB(MandelImageDBFactory fac, File dir)
{
this(fac,AbstractFile.Factory.create(dir));
}
public MandelImageDB(MandelImageDBFactory fac, AbstractFile dir)
{
String p;
try {
settings=Settings.getSettings(dir);
}
catch (IOException ex) {
System.err.println("cannot read mandel settings: "+ex);
// TODO: exception
}
if (dir.isFile()) {
p=settings.getProperty(Settings.PROXY);
if (p!=null) {
int ix=p.indexOf(":");
if (ix>0) {
String host=p.substring(0, ix);
int port=Integer.parseInt(p.substring(ix+1));
proxy=new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
}
}
}
else {
this.readonly=true;
this.proxy=dir.getProxy();
}
commonSetup(fac.getTool());
if (!this.readonly) {
ttodos=createMandelListFolderTree(Settings.TODO);
todos=ttodos.getRoot().getMandelList();
seenrasters=createMandelList(Settings.SEEN);
}
}
protected final void commonSetup(String tool)
{
String path=null;
String cpath=null;
String npath=null;
String ipath=null;
String p;
path=settings.getProperty(Settings.PATH);
cpath=settings.getProperty(Settings.COLORMAP_PATH);
npath=settings.getProperty(Settings.RASTER_SAVE_PATH);
ipath=settings.getProperty(Settings.INCOMPLETE_SAVE_PATH);
if (tool!=null) {
p=settings.getProperty(tool+"."+Settings.PATH);
if (p!=null) path+=";"+p;
p=settings.getProperty(tool+"."+Settings.COLORMAP_PATH);
if (p!=null) cpath+=";"+p;
p=settings.getProperty(tool+"."+Settings.RASTER_SAVE_PATH);
if (p!=null) npath=p;
p=settings.getProperty(tool+"."+Settings.INCOMPLETE_SAVE_PATH);
if (p!=null) ipath=p;
}
scannercache=new MandelScannerCache(proxy);
all=new PathMandelScanner(path, MandelScanner.ALL, settings.isLocal(),
scannercache);
areacolmap=new FilteredMandelScanner(all, MandelScanner.HAS_AREACOLMAP);
imagedata=new FilteredMandelScanner(all, MandelScanner.HAS_IMAGEDATA);
raster=new FilteredMandelScanner(all, MandelScanner.RASTER);
info=new FilteredMandelScanner(all, MandelScanner.INFO);
meta=new FilteredMandelScanner(all, MandelScanner.HAS_INFO);
rasterimage=new FilteredMandelScanner(all, MandelScanner.RASTERIMAGE);
colormaps=new PathMandelScanner(cpath, MandelScanner.COLORMAP,
settings.isLocal(),scannercache);
prioinfo=new PathMandelScanner(
settings.getProperty(Settings.INFO_PRIO_PATH),
MandelScanner.INFO, settings.isLocal(), scannercache);
if (!this.readonly) {
newraster=new PathMandelScanner(npath, MandelScanner.RASTER,
settings.isLocal(), scannercache);
incomplete=new PathMandelScanner(ipath, MandelScanner.INCOMPLETERASTER,
settings.isLocal(), scannercache);
}
copyright=settings.getProperty(Settings.COPYRIGHT);
if (copyright!=null) {
if (copyright.equals("")) {
copyright=getCopyright(settings.getProperty(Settings.USER),
settings.getProperty(Settings.SITE));
}
}
areas=createMandelList(Settings.AREAS);
refinements=createMandelList(Settings.REFINEMENTS);
colors=createColorList(Settings.COLORS);
tags=createTagList(Settings.TAGS);
tfavorites=createMandelListFolderTree(Settings.FAVORITES);
favorites=tfavorites.getRoot().getMandelList();
try {
String fp=settings.getProperty(Settings.LINKS);
if (!Utils.isEmpty(fp)) {
AbstractFile mf=createAbstractFile(fp);
//tlinks=new FileMandelListListMandelListFolderTree(mf);
tlinks=new LinkTree(mf);
}
}
catch (Exception ex) {
System.err.println("cannot get folder tree "+path+": "+ex);
}
userlists=new ArrayList<MandelListFolderTree>();
addUserLists(settings.getProperty(Settings.USERLIST_PATH));
if (debug) {
System.out.println("**** lookup area colormaps: "+path);
for (MandelHandle h:areacolmap.getMandelHandles()) {
if (h.getHeader().isAreaColormap()) {
System.out.println("areacm: "+h.getFile());
}
}
}
}
private void addUserLists(String path)
{
if (path!=null) {
Set<Object> elements=new HashSet<Object>();
System.out.println("found userlists: "+path);
StringTokenizer t=new StringTokenizer(path, ";");
while (t.hasMoreTokens()) {
String p=t.nextToken().trim();
if (!p.equals("")) {
if (!elements.contains(p)) {
elements.add(p);
userlists.add(createMandelListFolderTreeFor(p));
}
}
}
}
else {
System.out.println("no userlists found");
}
}
public AbstractFile createAbstractFile(String path)
{
return AbstractFile.Factory.create(path, proxy, settings.isLocal());
}
public final MandelList createMandelList(String prop)
{ String path=settings.getProperty(prop);
if (Utils.isEmpty(path)) return null;
AbstractFile mf=createAbstractFile(path);
return new FileMandelList(mf);
}
public final MandelListFolderTree createMandelListFolderTree(String prop)
{ String path=settings.getProperty(prop);
if (Utils.isEmpty(path)) return null;
return createMandelListFolderTreeFor(path);
}
public final MandelListFolderTree createMandelListFolderTreeFor(String path)
{
try {
AbstractFile mf=createAbstractFile(path);
return new FileMandelListFolderTree(mf);
}
catch (Exception ex) {
System.err.println("cannot get folder tree "+path+": "+ex);
return null;
}
}
public final ColorList createColorList(String prop)
{ String path=settings.getProperty(prop);
ColorList list=null;
if (Utils.isEmpty(path)) return null;
AbstractFile f=AbstractFile.Factory.create(path, proxy, settings.isLocal());
return new FileColorList(f);
}
public final TagList createTagList(String prop)
{ String path=settings.getProperty(prop);
ColorList list=null;
if (Utils.isEmpty(path)) return null;
AbstractFile f=AbstractFile.Factory.create(path, proxy, settings.isLocal());
return new FileTagList(f);
}
public boolean isReadonly()
{
return readonly;
}
public Proxy getProxy()
{
return proxy;
}
public void rescan()
{ rescan(false);
}
public void rescan(boolean verbose)
{
System.out.println("RESCAN FileSystem");
all.rescan(verbose);
if (incomplete!=null) incomplete.rescan(verbose);
}
public String getCopyright(MandelInfo info)
{
return getCopyright(info.getCreator(), info.getSite());
}
public String getCopyright(String creator, String site)
{
String copyright=creator;
if (Utils.isEmpty(copyright)) {
copyright=site;
}
if (Utils.isEmpty(copyright)) copyright=this.copyright;
else copyright="by "+copyright;
return copyright;
}
public String getCopyright()
{
return copyright;
}
public ColorList getColors()
{
return colors;
}
public TagList getTags()
{
return tags;
}
//////////////////////////////////////////////////////////////////////////
public MandelListFolderTree getFavorites()
{ return tfavorites;
}
public MandelList getMainFavorites()
{ return favorites;
}
public MandelListFolderTree getTodos()
{ return ttodos;
}
public MandelList getMainTodos()
{ return todos;
}
public MandelListFolderTree getLinks()
{ return tlinks;
}
public MandelList getAreas()
{ return areas;
}
public MandelList getSeenRasters()
{ return seenrasters;
}
public MandelList getRefinements()
{ return refinements;
}
public List<MandelListFolderTree> getUserLists()
{
return Collections.unmodifiableList(userlists);
}
//////////////////////////////////////////////////////////////////////////
public MandelScanner getAllScanner()
{
return all;
}
public MandelScanner getColormapScanner()
{
return colormaps;
}
public MandelScanner getNewRasterScanner()
{
return newraster;
}
public MandelScanner getInfoScanner()
{
return info;
}
public MandelScanner getPrioInfoScanner()
{
return prioinfo;
}
public MandelScanner getMetaScanner()
{
return meta;
}
public MandelScanner getAreaColormapScanner()
{
return areacolmap;
}
public MandelScanner getImageDataScanner()
{
return imagedata;
}
public MandelScanner getRasterImageScanner()
{
return rasterimage;
}
public MandelScanner getRasterScanner()
{
return raster;
}
public MandelScanner getIncompleteScanner()
{
return incomplete;
}
//////////////////////////////////////////////////////////////////////////
public Settings getSettings()
{
return settings;
}
public String getProperty(String name)
{
return settings.getProperty(name);
}
public boolean getSwitch(String name, boolean def)
{
return settings.getSwitch(name,def);
}
public boolean isCleanupInfo()
{
return Utils.parseBoolean(getProperty(Settings.INFO_CLEANUP),true);
}
public boolean isCleanupRaster()
{
return Utils.parseBoolean(getProperty(Settings.RASTER_CLEANUP),true);
}
public boolean isCleanupRasterImage()
{
return Utils.parseBoolean(getProperty(Settings.RASTERIMAGE_CLEANUP),false);
}
protected File getFolder(AbstractFile mf, String prop)
{ File d=(mf!=null&&mf.isFile())?mf.getFile():null;
if (d!=null && d.exists() && d.isFile()) d=d.getParentFile();
String v=getProperty(prop);
if (Utils.isEmpty(v)) v=getProperty(Settings.SAVE_PATH);
if (Utils.isEmpty(v)) return d;
d=new File(v);
d.mkdirs();
return d;
}
public File getInfoFolder(AbstractFile d)
{
return getFolder(d, Settings.INFO_SAVE_PATH);
}
public File getAreaColormapFolder(AbstractFile d)
{
return getFolder(d, Settings.AREACOLMAP_SAVE_PATH);
}
public File getRasterFolder(AbstractFile d)
{
return getFolder(d,Settings.RASTER_SAVE_PATH);
}
public File getIncompleteFolder(AbstractFile d)
{
return getFolder(d,Settings.INCOMPLETE_SAVE_PATH);
}
public File getRasterImageFolder(AbstractFile d)
{
QualifiedMandelName mn=QualifiedMandelName.create(d);
if (!Utils.isEmpty(mn.getQualifier()) &&
!Utils.isEmpty(settings.getProperty(Settings.VARIANT_SAVE_PATH))) {
return getFolder(d,Settings.VARIANT_SAVE_PATH);
}
return getFolder(d,Settings.RASTERIMAGE_SAVE_PATH);
}
public File getImageFolder(AbstractFile d)
{
return getFolder(d,Settings.IMAGE_SAVE_PATH);
}
//////////////////////////////////////////////////////////////////////////
public File mapToIncompleteFile(AbstractFile f)
{ return MandUtils.mapFile(f,INCOMPLETE_SUFFIX,getIncompleteFolder(f));
}
public File mapToRasterFile(AbstractFile f)
{ return MandUtils.mapFile(f,RASTER_SUFFIX,getRasterFolder(f));
}
public File mapToAreaColormapFile(AbstractFile f)
{ return MandUtils.mapFile(f,AREACOLMAP_SUFFIX,getRasterFolder(f));
}
public File mapToInfoFile(AbstractFile f)
{ return MandUtils.mapFile(f,INFO_SUFFIX,getInfoFolder(f));
}
public File mapToRasterImageFile(AbstractFile f)
{ return MandUtils.mapFile(f,RASTERIMAGE_SUFFIX,getRasterImageFolder(f));
}
public File mapToImageFile(AbstractFile f)
{ return MandUtils.mapFile(f,IMAGE_SUFFIX,getImageFolder(f));
}
protected void seenModified()
{
}
}