c649d98cf03da05f3a49ec189366df1c5bf6347d
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / WebIndexer.java
1 package eu.svjatoslav.meviz.htmlindexer;
2
3 import eu.svjatoslav.meviz.htmlindexer.layouts.MixedLayout;
4 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
5 import eu.svjatoslav.meviz.htmlindexer.metadata.DirectoryMetadata;
6 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.AbstractFile;
7 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture;
8
9 import java.io.BufferedInputStream;
10 import java.io.IOException;
11 import java.io.ObjectInputStream;
12 import java.io.UnsupportedEncodingException;
13 import java.net.URL;
14 import java.net.URLEncoder;
15 import java.util.List;
16
17 public class WebIndexer extends AbstractIndexer {
18
19     private static final int METADATA_LOAD_TRY_COUNT = 10;
20     private final String globalPrefix;
21     private final String jspPath;
22
23     public WebIndexer(final String globalPrefix, final String jspPath) {
24         this.globalPrefix = globalPrefix;
25         this.jspPath = jspPath;
26     }
27
28     @Override
29     public void compileHtml(final Layout layout,
30                             final DirectoryMetadata directory)
31             throws UnsupportedEncodingException {
32         super.compileHtml(layout, directory);
33     }
34
35     @Override
36     public String getDirectoryUrl(final AbstractFile directory,
37                                   final IndexingContext context) {
38
39         try {
40             return jspPath + context.getLocalUrl() + "/"
41                     + URLEncoder.encode(directory.fileName, "UTF-8");
42         } catch (final UnsupportedEncodingException e) {
43             throw new RuntimeException(e);
44         }
45     }
46
47     public String getHtml(String requestPath) throws
48             IOException, ClassNotFoundException {
49
50         if (requestPath == null)
51             requestPath = "";
52
53         if (requestPath.equals("/"))
54             requestPath = "";
55
56         final MixedLayout layout = new MixedLayout();
57         final IndexingContext context = new IndexingContext(globalPrefix,
58                 requestPath);
59         layout.init("Photos", context.getLocalPathComponents(), this, context);
60
61         final DirectoryMetadata directory = getMetadataForPath(requestPath);
62
63         compileHtml(layout, directory);
64
65         return layout.getHtml(false, false, directory);
66     }
67
68     private DirectoryMetadata getMetadataForPath(final String requestPath)
69             throws ClassNotFoundException, IOException {
70
71         final String urlString = globalPrefix + Utils.urlEncode(requestPath) +"/.thumbnails/metadata_6.dat";
72
73         for (int i = 0; true; i++)
74             try {
75                 return attemptDirectoryMetadataDownload(urlString);
76             } catch (final IOException e) {
77                 if (i > METADATA_LOAD_TRY_COUNT) throw e;
78             }
79     }
80
81     private DirectoryMetadata attemptDirectoryMetadataDownload(String urlString) throws IOException, ClassNotFoundException {
82         final BufferedInputStream inputStream = new BufferedInputStream(new URL(
83                 urlString).openStream());
84
85         final ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
86         final DirectoryMetadata directory = (DirectoryMetadata) objectInputStream
87                 .readObject();
88         inputStream.close();
89
90         return directory;
91     }
92
93     @Override
94     public String getParentDirectoryUrl(final IndexingContext context) {
95         final StringBuilder result = new StringBuilder();
96
97         result.append(jspPath);
98
99         final List<String> components = context.getLocalPathComponents();
100
101         for (final String pathComponent : components.subList(0,
102                 components.size() - 1)) {
103             result.append("/");
104             result.append(pathComponent);
105         }
106
107         return result.toString();
108     }
109
110     @Override
111     public String getThumbnailUrl(final Picture picture,
112                                   final Dimension desiredDimension, final IndexingContext context) {
113
114         // in case thumbnail size was equal to original, then return original
115         // file path
116         if (picture.getDimensions().equals(desiredDimension))
117             return context.getGlobalUrl() + context.getLocalUrl() + "/"
118                     + picture.fileName;
119
120         final String thumbnailFileName = picture
121                 .getRelativeThumbnailFileName(desiredDimension);
122
123         return context.getGlobalUrl() + context.getLocalUrl() + "/"
124                 + Constants.THUMBNAILS_DIRECTORY_NAME + "/"
125                 + Utils.urlEncode(thumbnailFileName);
126     }
127
128 }