Java tutorial
/** * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# * 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; } }