Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1250 → Rev 1251

/PhotoAlbum/trunk/todo.txt
21,9 → 21,9
 
Use the meta mime information.
 
Config to separate file.
Good caching strategy at HTTP level.
 
Multiple roots.
Branches list browseable, but configurable.
 
Good caching strategy at HTTP level.
Relative pathes in config.
 
/PhotoAlbum/trunk/src/ak/photoalbum/config/ConfigRoot.java
8,21 → 8,32
{
private static final Logger logger = Logger.getLogger(ConfigRoot.class);
 
private List branches = new ArrayList();
private String defaultBranch;
private List branches = new ArrayList();
 
public ConfigRoot()
{
}
 
public void addBranch(ConfigBranch branch)
public String getDefaultBranch()
{
logger.info("add branch " + branch.getUri());
branches.add(branch);
return defaultBranch;
}
public void setDefaultBranch(String defaultBranch)
{
this.defaultBranch = defaultBranch;
}
 
public List getBranches()
{
return branches;
}
public void addBranch(ConfigBranch branch)
{
logger.info("add branch " + branch.getUri());
branches.add(branch);
}
}
 
/PhotoAlbum/trunk/src/ak/photoalbum/images/Thumbnailer.java
305,8 → 305,8
String mediumEnd = MEDIUM_SUFFIX + "." + format;
*/
 
File origin;
Map cache;
File origin = null;
Map cache = null;
 
if(file.getName().endsWith(SMALL_SUFFIX + "." + format)) {
origin = getOriginFile(file, SMALL_SUFFIX);
332,15 → 332,18
logger.debug("load cached dir " + file.getCanonicalPath()
+ " for " + origin.getCanonicalPath());
}
else if(file.getName().endsWith(DIR_PART_SUFFIX + "." + format)) {
if(logger.isDebugEnabled())
logger.debug("skip cached dir part " + file.getCanonicalPath());
}
else {
if(logger.isInfoEnabled())
logger.warn(
"unknown type of cached " + file.getCanonicalPath());
 
return;
}
 
loadCacheInfo(file, origin, cache);
if(origin != null && cache != null)
loadCacheInfo(file, origin, cache);
}
 
protected void loadCacheInfo(File file, File origin, Map cache)
/PhotoAlbum/trunk/src/ak/photoalbum/logic/Branch.java
2,6 → 2,8
 
import java.util.Comparator;
import java.util.Map;
import java.util.List;
import java.util.Iterator;
import java.util.Hashtable;
import java.io.File;
import java.io.IOException;
30,6 → 32,7
private Comparator fileNameComparator = new FileNameComparator(true);
private Map metaInfos = new Hashtable(); // <File, MetaInfo>
 
// FIXME use branch template
public Branch(ResourceFactory resourceFactory, ConfigBranch config)
throws IOException, LogicException
{
45,7 → 48,7
 
if(config.getThumbnailFormat() != null)
this.thumbnailer.setFormat(config.getThumbnailFormat());
/*
/* FIXME
if(smallWidth != null)
this.thumbnailer.setSmallWidth(smallWidth.intValue());
if(smallHeight != null)
57,13 → 60,53
*/
thumbnailer.setResizer(new ak.photoalbum.images.jiu.JiuResizer());
thumbnailer.setImagesFilter(this.imagesFilter);
/* thumbnailer.setDirTemplate(new File(dirTemplate));
thumbnailer.setDirTemplate(new File(config.getDirTemplate()));
thumbnailer.setDirThumbnailPositions(
parseThumbnailPositions(dirThumbnailPositions));*/
parseThumbnailPositions(config.getDirThumbnails()));
 
thumbnailer.startup();
}
 
private ThumbnailPosition[] parseThumbnailPositions(List configs)
{
ThumbnailPosition[] res = new ThumbnailPosition[configs.size()];
int count = 0;
 
for(Iterator i = configs.iterator(); i.hasNext(); ) {
ConfigDirThumbnail c = (ConfigDirThumbnail)i.next();
 
String horAlignStr = c.getAlign();
String vertAlignStr = c.getValign();
int horAlign;
int vertAlign;
 
if("lelf".equals(horAlignStr))
horAlign = ThumbnailPosition.ALIGN_HOR_LEFT;
else if("right".equals(horAlignStr))
horAlign = ThumbnailPosition.ALIGN_HOR_RIGHT;
else if("center".equals(horAlignStr))
horAlign = ThumbnailPosition.ALIGN_HOR_CENTER;
else
throw new RuntimeException(
"Cannot parse " + horAlignStr + " as horizontal alignment");
 
if("top".equals(vertAlignStr))
vertAlign = ThumbnailPosition.ALIGN_VERT_TOP;
else if("bottom".equals(vertAlignStr))
vertAlign = ThumbnailPosition.ALIGN_VERT_BOTTOM;
else if("center".equals(vertAlignStr))
vertAlign = ThumbnailPosition.ALIGN_VERT_CENTER;
else
throw new RuntimeException(
"Cannot parse " + vertAlignStr + " as vertical alignment");
 
res[count++] = new ThumbnailPosition(c.getLeft(), c.getTop(),
c.getWidth(), c.getHeight(), horAlign, vertAlign);
}
 
return res;
}
 
public String getUri()
{
return config.getUri();
/PhotoAlbum/trunk/src/ak/photoalbum/logic/Logic.java
3,7 → 3,6
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.Map;
import java.util.Hashtable;
import java.util.Iterator;
20,8 → 19,6
import org.apache.commons.digester.Digester;
import org.apache.log4j.Logger;
 
import ak.photoalbum.images.Thumbnailer;
import ak.photoalbum.images.ThumbnailPosition;
import ak.photoalbum.util.FileUtils;
import ak.photoalbum.util.ResourceFactory;
import ak.photoalbum.config.ConfigRoot;
46,47 → 43,33
 
protected Digester createConfigDigester()
{
/*
4 <uri>children</uri>
5 <images-root>/home/data/photos</images-root>
6 <cache-dir>/home/data/photos/.cache</cache-dir>
7 <thumbnail-format>jpg</thumbnail-format>
8 <columns>6</columns>
9 <rows>5</rows>
10 <images-mask>*.jpeg</images-mask>
11 <images-mask>*.jpg</images-mask>
12 <dir-thumbnail>
13 <template>images/dir_template.gif</template>
14 <thumbnail>
15 <left>5</left>
16 <top>9</top>
17 <width>40</width>
18 <height>40</height>
19 <align>center</align>
20 <valign>center</valign>
*/
Digester digester = new Digester();
digester.setValidating(false);
 
digester.addObjectCreate("photos", ConfigRoot.class);
digester.addObjectCreate( "photos", ConfigRoot.class);
digester.addBeanPropertySetter("photos/default-branch", "defaultBranch");
digester.addObjectCreate("photos/branch", ConfigBranch.class);
digester.addBeanPropertySetter("photos/branch/uri", "uri");
digester.addBeanPropertySetter("photos/branch/images-root", "imagesRoot");
digester.addBeanPropertySetter("photos/branch/cache-dir", "cacheDir");
digester.addBeanPropertySetter("photos/branch/thumbnail-format", "thumbnailFormat");
digester.addBeanPropertySetter("photos/branch/columns", "columns");
digester.addBeanPropertySetter("photos/branch/rows", "rows");
digester.addObjectCreate( "photos/branch", ConfigBranch.class);
digester.addBeanPropertySetter("photos/branch/uri");
digester.addBeanPropertySetter("photos/branch/images-root", "imagesRoot");
digester.addBeanPropertySetter("photos/branch/cache-dir", "cacheDir");
digester.addBeanPropertySetter("photos/branch/thumbnail-format", "thumbnailFormat");
digester.addBeanPropertySetter("photos/branch/columns");
digester.addBeanPropertySetter("photos/branch/rows");
digester.addCallMethod( "photos/branch/images-mask", "addImagesMask",
0, new Class[] { String.class });
digester.addBeanPropertySetter("photos/branch/dir-thumbnail/template", "dirTemplate");
 
// FIXME images-mask
digester.addObjectCreate( "photos/branch/dir-thumbnail/thumbnail", ConfigDirThumbnail.class);
digester.addBeanPropertySetter("photos/branch/dir-thumbnail/thumbnail/left");
digester.addBeanPropertySetter("photos/branch/dir-thumbnail/thumbnail/top");
digester.addBeanPropertySetter("photos/branch/dir-thumbnail/thumbnail/width");
digester.addBeanPropertySetter("photos/branch/dir-thumbnail/thumbnail/height");
digester.addBeanPropertySetter("photos/branch/dir-thumbnail/thumbnail/align");
digester.addBeanPropertySetter("photos/branch/dir-thumbnail/thumbnail/valign");
 
digester.addSetNext("photos/branch", "addBranch");
/* digester.addBeanPropertySetter("meta/item/subtitle", "subtitle");
digester.addSetProperties("meta/item/subtitle", "mime", "subtitleMime");
digester.addBeanPropertySetter("meta/item/comment", "comment");
digester.addSetProperties("meta/item/comment", "mime", "commentMime");
digester.addSetNext("photos/branch", "addItem");
*/
digester.addSetNext( "photos/branch", "addBranch");
 
return digester;
}
 
124,12 → 107,24
}
 
public Branch getBranch(String uri)
throws LogicException
{
return (Branch)branches.get(uri);
if(uri == null || uri.equals("")) {
uri = config.getDefaultBranch();
if(uri == null)
throw new LogicException("No default branch configured");
}
 
Branch branch = (Branch)branches.get(uri);
 
if(branch == null)
throw new LogicException("Branch not found");
 
return branch;
}
 
public void buildCache(String uri)
throws IOException
throws IOException, LogicException
{
getBranch(uri).getThumbnailer().buildCache();
}
209,6 → 204,7
}
 
public String getThumbnailMime(String uri)
throws LogicException
{
return getBranch(uri).getThumbnailer().getMime();
}
403,54 → 399,6
return path.substring(rootPath.length());
}
 
protected ThumbnailPosition[] parseThumbnailPositions(String str)
{
List list = new ArrayList();
StringTokenizer tokenizer = new StringTokenizer(str, ";");
 
while(tokenizer.hasMoreTokens()) {
StringTokenizer tokenParser
= new StringTokenizer(tokenizer.nextToken(), ",");
int x = Integer.parseInt(tokenParser.nextToken().trim());
int y = Integer.parseInt(tokenParser.nextToken().trim());
int width = Integer.parseInt(tokenParser.nextToken().trim());
int height = Integer.parseInt(tokenParser.nextToken().trim());
String horAlignStr = tokenParser.nextToken().trim().toLowerCase();
String vertAlignStr = tokenParser.nextToken().trim().toLowerCase();
int horAlign;
int vertAlign;
 
if("l".equals(horAlignStr))
horAlign = ThumbnailPosition.ALIGN_HOR_LEFT;
else if("r".equals(horAlignStr))
horAlign = ThumbnailPosition.ALIGN_HOR_RIGHT;
else if("c".equals(horAlignStr))
horAlign = ThumbnailPosition.ALIGN_HOR_CENTER;
else
throw new RuntimeException(
"Cannot parse " + horAlignStr + " as horizontal alignment");
 
if("t".equals(vertAlignStr))
vertAlign = ThumbnailPosition.ALIGN_VERT_TOP;
else if("b".equals(vertAlignStr))
vertAlign = ThumbnailPosition.ALIGN_VERT_BOTTOM;
else if("c".equals(vertAlignStr))
vertAlign = ThumbnailPosition.ALIGN_VERT_CENTER;
else
throw new RuntimeException(
"Cannot parse " + vertAlignStr + " as vertical alignment");
 
list.add(new ThumbnailPosition(x, y, width, height, horAlign, vertAlign));
}
 
ThumbnailPosition[] res = new ThumbnailPosition[list.size()];
 
for(int i = 0; i < res.length; i++)
res[i] = (ThumbnailPosition)list.get(i);
 
return res;
}
 
protected static final Logic instance = new Logic();
 
public static Logic getLogic()