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