/**
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* This file is part of the LDP4j Project:
* http://www.ldp4j.org/
*
* Center for Open Middleware
* http://www.centeropenmiddleware.com/
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Copyright (C) 2014-2016 Center for Open Middleware.
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Artifact : org.ldp4j.tutorial.client:eswc-2015-client:1.0.0
* Bundle : eswc-2015-client-1.0.0.jar
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
*/
package org.ldp4j.tutorial.client;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
final class CachedRepresentationManager {
private final class ContentEntry {
private String resource;
private File file;
String resource() {
return this.resource;
}
File file() {
return this.file;
}
ContentEntry withResource(String resource) {
this.resource=resource;
return this;
}
ContentEntry withFile(File file) {
this.file=file;
return this;
}
}
private static Logger LOGGER=LoggerFactory.getLogger(CachedRepresentationManager.class);
private final Map<String,ContentEntry> loadedResources;
private File cacheDirectory;
private boolean created;
private CachedRepresentationManager(File cacheDirectory) {
this.cacheDirectory=cacheDirectory;
this.loadedResources=Maps.newLinkedHashMap();
}
private void init() {
if(!this.cacheDirectory.exists()) {
this.created=this.cacheDirectory.mkdirs();
}
if(!this.created && !this.cacheDirectory.isDirectory()) {
LOGGER.debug("Path {} cannot be used as cache directory. Resorting to default temp directory {}",this.cacheDirectory.getAbsolutePath(),FileUtils.getTempDirectoryPath());
this.cacheDirectory=FileUtils.getTempDirectory();
}
if(this.created){
LOGGER.debug("Created cache directory {}",this.cacheDirectory.getAbsolutePath());
}
}
private ContentEntry getOrCreateEntry(String resource) {
ContentEntry entry = this.loadedResources.get(resource);
if(entry==null) {
entry=
new ContentEntry().
withResource(resource).
withFile(createFile(resource));
this.loadedResources.put(resource, entry);
}
return entry;
}
private File createFile(String resource) {
URI uri = URI.create(resource);
StringBuilder builder=new StringBuilder();
builder.append(uri.getScheme()).append("_");
String userInfo = uri.getUserInfo();
if(userInfo!=null) {
builder.append(userInfo).append("@");
}
builder.append(uri.getHost());
if(uri.getPort()>=0) {
builder.append("_").append(uri.getPort());
}
if(uri.getPath()!=null) {
builder.append(uri.getRawPath().replace("/","_"));
}
if(uri.getQuery()!=null) {
builder.append("?").append(uri.getRawQuery());
}
if(uri.getFragment()!=null) {
builder.append("#").append(uri.getRawFragment());
}
builder.append(".dat");
File file = new File(this.cacheDirectory,builder.toString());
return file;
}
void persist(String resource, String contents) throws IOException {
ContentEntry entry = getOrCreateEntry(resource);
LOGGER.debug("Persisting resource {} contents to {}...",entry.resource(),entry.file());
FileUtils.write(entry.file(),contents);
}
File file(String resource) {
File result=null;
ContentEntry entry = this.loadedResources.get(resource);
if(entry!=null) {
result=entry.file();
}
return result;
}
String get(String resource) throws IOException {
String result=null;
File file = file(resource);
if(file!=null) {
result = FileUtils.readFileToString(file);
}
return result;
}
void dispose() {
LOGGER.debug("Disposing representations cached at {}...",this.cacheDirectory);
for(ContentEntry entry:this.loadedResources.values()) {
if(entry.file().exists()) {
LOGGER.debug("- Deleting representation for resource {} ({})...",entry.resource(),entry.file());
if(!entry.file().delete()) {
entry.file().deleteOnExit();
LOGGER.debug(" + Could not delete {}. Scheduling for deletion on exit.",entry.resource());
}
}
}
if(this.created) {
LOGGER.debug("- Deleting cache directory...");
try {
FileUtils.deleteDirectory(this.cacheDirectory);
LOGGER.debug(" + Cache directory deleted.");
} catch (IOException e) {
LOGGER.debug(" + Could not delete cache directory: {}",e.getMessage());
}
}
LOGGER.debug("Representations cached at {} deleted.",this.cacheDirectory);
}
static CachedRepresentationManager create(File cacheDirectory) {
CachedRepresentationManager manager = new CachedRepresentationManager(cacheDirectory);
manager.init();
return manager;
}
}