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