Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1251 → Rev 1250

/PhotoAlbum/trunk/src/ak/photoalbum/logic/Logic.java
3,6 → 3,7
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;
19,6 → 20,8
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;
43,33 → 46,47
 
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.addBeanPropertySetter("photos/default-branch", "defaultBranch");
digester.addObjectCreate("photos", ConfigRoot.class);
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");
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/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");
// FIXME images-mask
 
digester.addSetNext( "photos/branch", "addBranch");
 
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");
*/
return digester;
}
 
107,24 → 124,12
}
 
public Branch getBranch(String uri)
throws LogicException
{
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;
return (Branch)branches.get(uri);
}
 
public void buildCache(String uri)
throws IOException, LogicException
throws IOException
{
getBranch(uri).getThumbnailer().buildCache();
}
204,7 → 209,6
}
 
public String getThumbnailMime(String uri)
throws LogicException
{
return getBranch(uri).getThumbnailer().getMime();
}
399,6 → 403,54
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()
/PhotoAlbum/trunk/src/ak/photoalbum/logic/Branch.java
2,8 → 2,6
 
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;
32,7 → 30,6
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
{
48,7 → 45,7
 
if(config.getThumbnailFormat() != null)
this.thumbnailer.setFormat(config.getThumbnailFormat());
/* FIXME
/*
if(smallWidth != null)
this.thumbnailer.setSmallWidth(smallWidth.intValue());
if(smallHeight != null)
60,53 → 57,13
*/
thumbnailer.setResizer(new ak.photoalbum.images.jiu.JiuResizer());
thumbnailer.setImagesFilter(this.imagesFilter);
thumbnailer.setDirTemplate(new File(config.getDirTemplate()));
/* thumbnailer.setDirTemplate(new File(dirTemplate));
thumbnailer.setDirThumbnailPositions(
parseThumbnailPositions(config.getDirThumbnails()));
parseThumbnailPositions(dirThumbnailPositions));*/
 
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/config/ConfigRoot.java
8,32 → 8,21
{
private static final Logger logger = Logger.getLogger(ConfigRoot.class);
 
private String defaultBranch;
private List branches = new ArrayList();
private List branches = new ArrayList();
 
public ConfigRoot()
{
}
 
public String getDefaultBranch()
public void addBranch(ConfigBranch branch)
{
return defaultBranch;
logger.info("add branch " + branch.getUri());
branches.add(branch);
}
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 = null;
Map cache = null;
File origin;
Map cache;
 
if(file.getName().endsWith(SMALL_SUFFIX + "." + format)) {
origin = getOriginFile(file, SMALL_SUFFIX);
332,18 → 332,15
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;
}
 
if(origin != null && cache != null)
loadCacheInfo(file, origin, cache);
loadCacheInfo(file, origin, cache);
}
 
protected void loadCacheInfo(File file, File origin, Map cache)
/PhotoAlbum/trunk/todo.txt
21,9 → 21,9
 
Use the meta mime information.
 
Good caching strategy at HTTP level.
Config to separate file.
 
Branches list browseable, but configurable.
Multiple roots.
 
Relative pathes in config.
Good caching strategy at HTTP level.