Fix change source update
[nikiroo-utils.git] / src / be / nikiroo / fanfix / library / CacheLibrary.java
CommitLineData
ff05b828
NR
1package be.nikiroo.fanfix.library;
2
3import java.awt.image.BufferedImage;
4import java.io.File;
5import java.io.IOException;
edf79e5e 6import java.net.URL;
ff05b828
NR
7import java.util.List;
8
9import be.nikiroo.fanfix.Instance;
10import be.nikiroo.fanfix.bundles.UiConfig;
11import be.nikiroo.fanfix.data.MetaData;
12import be.nikiroo.fanfix.data.Story;
13import be.nikiroo.utils.Progress;
14
15/**
16 * This library will cache another pre-existing {@link BasicLibrary}.
17 *
18 * @author niki
19 */
20public class CacheLibrary extends BasicLibrary {
21 private List<MetaData> metas;
22 private BasicLibrary lib;
23 private LocalLibrary cacheLib;
24
25 /**
26 * Create a cache library around the given one.
27 * <p>
28 * It will return the same result, but those will be saved to disk at the
29 * same time to be fetched quicker the next time.
30 *
31 * @param cacheDir
32 * the cache directory where to save the files to disk
33 * @param lib
34 * the original library to wrap
35 */
36 public CacheLibrary(File cacheDir, BasicLibrary lib) {
37 this.cacheLib = new LocalLibrary(cacheDir, Instance.getUiConfig()
38 .getString(UiConfig.GUI_NON_IMAGES_DOCUMENT_TYPE), Instance
39 .getUiConfig().getString(UiConfig.GUI_IMAGES_DOCUMENT_TYPE),
40 true);
41 this.lib = lib;
42 }
43
44 @Override
45 public String getLibraryName() {
46 return lib.getLibraryName();
47 }
48
e6249b0f
NR
49 @Override
50 public Status getStatus() {
51 return lib.getStatus();
52 }
53
ff05b828
NR
54 @Override
55 protected List<MetaData> getMetas(Progress pg) {
56 if (pg == null) {
57 pg = new Progress();
58 }
59
60 if (metas == null) {
61 metas = lib.getMetas(pg);
62 }
63
64 pg.done();
65 return metas;
66 }
67
68 @Override
69 public synchronized File getFile(final String luid, Progress pg) {
70 if (pg == null) {
71 pg = new Progress();
72 }
73
74 Progress pgImport = new Progress();
75 Progress pgGet = new Progress();
76 Progress pgRecall = new Progress();
77
78 pg.setMinMax(0, 5);
79 pg.addProgress(pgImport, 3);
80 pg.addProgress(pgGet, 1);
81 pg.addProgress(pgRecall, 1);
82
83 if (!isCached(luid)) {
84 try {
85 cacheLib.imprt(lib, luid, pgImport);
86 pgImport.done();
085a2f9a 87 clearCache();
ff05b828 88 } catch (IOException e) {
62c63b07 89 Instance.getTraceHandler().error(e);
ff05b828
NR
90 }
91
92 pgImport.done();
93 pgGet.done();
94 }
95
96 File file = cacheLib.getFile(luid, pgRecall);
97 pgRecall.done();
98
99 pg.done();
100 return file;
101 }
102
103 @Override
104 public BufferedImage getCover(final String luid) {
ff05b828
NR
105 if (isCached(luid)) {
106 return cacheLib.getCover(luid);
107 }
108
085a2f9a 109 // We could update the cache here, but it's not easy
ff05b828
NR
110 return lib.getCover(luid);
111 }
112
085a2f9a
NR
113 @Override
114 public BufferedImage getSourceCover(String source) {
115 // no cache for the source cover
116 return lib.getSourceCover(source);
117 }
118
119 @Override
120 public void setSourceCover(String source, String luid) {
121 lib.setSourceCover(source, luid);
122 cacheLib.setSourceCover(source, getSourceCover(source));
123 }
124
ff05b828
NR
125 @Override
126 protected void clearCache() {
127 metas = null;
128 cacheLib.clearCache();
129 lib.clearCache();
130 }
131
132 @Override
133 public synchronized Story save(Story story, String luid, Progress pg)
134 throws IOException {
03c1cede
NR
135 Progress pgLib = new Progress();
136 Progress pgCacheLib = new Progress();
137
138 if (pg == null) {
139 pg = new Progress();
140 }
141
142 pg.setMinMax(0, 2);
143 pg.addProgress(pgLib, 1);
144 pg.addProgress(pgCacheLib, 1);
145
146 story = lib.save(story, luid, pgLib);
0fa0fe95 147 story = cacheLib.save(story, story.getMeta().getLuid(), pgCacheLib);
03c1cede 148
ff05b828 149 clearCache();
03c1cede 150
ff05b828
NR
151 return story;
152 }
153
154 @Override
155 public synchronized void delete(String luid) throws IOException {
085a2f9a
NR
156 if (isCached(luid)) {
157 cacheLib.delete(luid);
158 }
ff05b828
NR
159 lib.delete(luid);
160 clearCache();
161 }
162
ff05b828
NR
163 @Override
164 public synchronized void changeSource(String luid, String newSource,
165 Progress pg) throws IOException {
166 if (pg == null) {
167 pg = new Progress();
168 }
169
170 Progress pgCache = new Progress();
171 Progress pgOrig = new Progress();
172 pg.setMinMax(0, 2);
173 pg.addProgress(pgCache, 1);
174 pg.addProgress(pgOrig, 1);
175
e06632ee
NR
176 if (isCached(luid)) {
177 cacheLib.changeSource(luid, newSource, pgCache);
178 }
ff05b828
NR
179 pgCache.done();
180 lib.changeSource(luid, newSource, pgOrig);
181 pgOrig.done();
182
1b9a09a2
NR
183 getInfo(luid).setSource(newSource);
184
ff05b828
NR
185 pg.done();
186 }
187
188 /**
189 * Check if the {@link Story} denoted by this Library UID is present in the
190 * cache.
191 *
192 * @param luid
193 * the Library UID
194 *
195 * @return TRUE if it is
196 */
197 public boolean isCached(String luid) {
198 return cacheLib.getInfo(luid) != null;
199 }
200
201 /**
202 * Clear the {@link Story} from the cache.
203 *
204 * @param luid
205 * the story to clear
206 *
207 * @throws IOException
208 * in case of I/O error
209 */
210 public void clearFromCache(String luid) throws IOException {
e06632ee
NR
211 if (isCached(luid)) {
212 cacheLib.delete(luid);
213 clearCache();
214 }
ff05b828
NR
215 }
216
edf79e5e
NR
217 @Override
218 public Story imprt(URL url, Progress pg) throws IOException {
219 if (pg == null) {
220 pg = new Progress();
221 }
222
223 Progress pgImprt = new Progress();
224 Progress pgCache = new Progress();
225 pg.setMinMax(0, 10);
226 pg.addProgress(pgImprt, 7);
227 pg.addProgress(pgCache, 3);
228
229 Story story = lib.imprt(url, pgImprt);
230 cacheLib.save(story, story.getMeta().getLuid(), pgCache);
231
232 pg.done();
233 return story;
234 }
235
ff05b828
NR
236 // All the following methods are only used by Save and Delete in
237 // BasicLibrary:
238
239 @Override
240 protected int getNextId() {
241 throw new java.lang.InternalError("Should not have been called");
242 }
243
244 @Override
245 protected void doDelete(String luid) throws IOException {
246 throw new java.lang.InternalError("Should not have been called");
247 }
248
249 @Override
250 protected Story doSave(Story story, Progress pg) throws IOException {
251 throw new java.lang.InternalError("Should not have been called");
252 }
253}