1 package be
.nikiroo
.fanfix
.library
;
3 import java
.awt
.image
.BufferedImage
;
5 import java
.io
.IOException
;
9 import be
.nikiroo
.fanfix
.Instance
;
10 import be
.nikiroo
.fanfix
.bundles
.UiConfig
;
11 import be
.nikiroo
.fanfix
.data
.MetaData
;
12 import be
.nikiroo
.fanfix
.data
.Story
;
13 import be
.nikiroo
.utils
.Progress
;
16 * This library will cache another pre-existing {@link BasicLibrary}.
20 public class CacheLibrary
extends BasicLibrary
{
21 private List
<MetaData
> metas
;
22 private BasicLibrary lib
;
23 private LocalLibrary cacheLib
;
26 * Create a cache library around the given one.
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.
32 * the cache directory where to save the files to disk
34 * the original library to wrap
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
),
45 public String
getLibraryName() {
46 return lib
.getLibraryName();
50 public Status
getStatus() {
51 return lib
.getStatus();
55 protected List
<MetaData
> getMetas(Progress pg
) {
61 metas
= lib
.getMetas(pg
);
69 public synchronized File
getFile(final String luid
, Progress pg
) {
74 Progress pgImport
= new Progress();
75 Progress pgGet
= new Progress();
76 Progress pgRecall
= new Progress();
79 pg
.addProgress(pgImport
, 3);
80 pg
.addProgress(pgGet
, 1);
81 pg
.addProgress(pgRecall
, 1);
83 if (!isCached(luid
)) {
85 cacheLib
.imprt(lib
, luid
, pgImport
);
88 } catch (IOException e
) {
89 Instance
.getTraceHandler().error(e
);
96 File file
= cacheLib
.getFile(luid
, pgRecall
);
104 public BufferedImage
getCover(final String luid
) {
105 if (isCached(luid
)) {
106 return cacheLib
.getCover(luid
);
109 // We could update the cache here, but it's not easy
110 return lib
.getCover(luid
);
114 public BufferedImage
getSourceCover(String source
) {
115 // no cache for the source cover
116 return lib
.getSourceCover(source
);
120 public void setSourceCover(String source
, String luid
) {
121 lib
.setSourceCover(source
, luid
);
122 cacheLib
.setSourceCover(source
, getSourceCover(source
));
126 protected void invalidateInfo(String luid
) {
127 List
<MetaData
> metas
= this.metas
;
131 } else if (metas
!= null) {
132 MetaData meta
= lib
.getInfo(luid
);
133 for (int i
= 0; i
< metas
.size(); i
++) {
134 if (metas
.get(i
).getLuid().equals(luid
)) {
149 cacheLib
.invalidateInfo(luid
);
150 lib
.invalidateInfo(luid
);
154 public synchronized Story
save(Story story
, String luid
, Progress pg
)
156 Progress pgLib
= new Progress();
157 Progress pgCacheLib
= new Progress();
164 pg
.addProgress(pgLib
, 1);
165 pg
.addProgress(pgCacheLib
, 1);
167 story
= lib
.save(story
, luid
, pgLib
);
168 story
= cacheLib
.save(story
, story
.getMeta().getLuid(), pgCacheLib
);
170 invalidateInfo(story
.getMeta().getLuid());
176 public synchronized void delete(String luid
) throws IOException
{
177 if (isCached(luid
)) {
178 cacheLib
.delete(luid
);
182 List
<MetaData
> metas
= this.metas
;
184 for (int i
= 0; i
< metas
.size(); i
++) {
185 if (metas
.get(i
).getLuid().equals(luid
)) {
186 metas
.set(i
, lib
.getInfo(luid
));
193 public synchronized void changeSource(String luid
, String newSource
,
194 Progress pg
) throws IOException
{
199 Progress pgCache
= new Progress();
200 Progress pgOrig
= new Progress();
202 pg
.addProgress(pgCache
, 1);
203 pg
.addProgress(pgOrig
, 1);
205 MetaData meta
= getInfo(luid
);
207 throw new IOException("Story not found: " + luid
);
210 if (isCached(luid
)) {
211 cacheLib
.changeSource(luid
, newSource
, pgCache
);
215 lib
.changeSource(luid
, newSource
, pgOrig
);
218 meta
.setSource(newSource
);
223 * Check if the {@link Story} denoted by this Library UID is present in the
229 * @return TRUE if it is
231 public boolean isCached(String luid
) {
232 return cacheLib
.getInfo(luid
) != null;
236 * Clear the {@link Story} from the cache.
241 * @throws IOException
242 * in case of I/O error
244 public void clearFromCache(String luid
) throws IOException
{
245 if (isCached(luid
)) {
246 cacheLib
.delete(luid
);
247 invalidateInfo(luid
);
252 public Story
imprt(URL url
, Progress pg
) throws IOException
{
257 Progress pgImprt
= new Progress();
258 Progress pgCache
= new Progress();
260 pg
.addProgress(pgImprt
, 7);
261 pg
.addProgress(pgCache
, 3);
263 Story story
= lib
.imprt(url
, pgImprt
);
264 cacheLib
.save(story
, story
.getMeta().getLuid(), pgCache
);
270 // All the following methods are only used by Save and Delete in
274 protected int getNextId() {
275 throw new java
.lang
.InternalError("Should not have been called");
279 protected void doDelete(String luid
) throws IOException
{
280 throw new java
.lang
.InternalError("Should not have been called");
284 protected Story
doSave(Story story
, Progress pg
) throws IOException
{
285 throw new java
.lang
.InternalError("Should not have been called");