Java tutorial
/** * Copyright 2012 Tobias Gierke <tobias.gierke@code-sourcery.de> * * 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. */ package de.codesourcery.jasm16.compiler.io; import java.io.File; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import de.codesourcery.jasm16.compiler.io.IResource.ResourceType; import de.codesourcery.jasm16.exceptions.ResourceNotFoundException; public abstract class FileResourceResolver extends AbstractResourceResolver { private static final Logger LOG = Logger.getLogger(FileResourceResolver.class); private File baseDir; public FileResourceResolver() { } public FileResourceResolver(File baseDir) { if (baseDir == null) { throw new IllegalArgumentException("baseDir must not be NULL."); } if (!baseDir.exists()) { throw new IllegalArgumentException("Directory '" + baseDir.getAbsolutePath() + "' does not exist"); } if (!baseDir.isDirectory()) { throw new IllegalArgumentException("'" + baseDir.getAbsolutePath() + "' is no directory?"); } this.baseDir = baseDir; } protected File getBaseDirectory() { return baseDir; } @Override public IResource resolve(String identifier) throws ResourceNotFoundException { if (StringUtils.isBlank(identifier)) { throw new IllegalArgumentException("identifier must not be NULL/blank."); } final File file = new File(identifier); if (!file.isFile()) { throw new ResourceNotFoundException("File " + file.getAbsolutePath() + " does not exist.", identifier); } if (!file.isFile()) { throw new ResourceNotFoundException(file.getAbsolutePath() + " is not a regular file.", identifier); } try { final File canonicalFile = file.getCanonicalFile(); return new FileResource(canonicalFile, determineResourceType(canonicalFile)); } catch (IOException e) { throw new RuntimeException("While resolving '" + identifier + "'", e); } } protected abstract ResourceType determineResourceType(File file); private boolean isAbsolutePath(String path) { return path.startsWith(File.pathSeparator); } @Override public IResource resolveRelative(String identifier, IResource parent) throws ResourceNotFoundException { if (!(parent instanceof FileResource)) { LOG.error("resolveRelative(): resolveRelative() in " + this + " must not be called with non-file resource " + parent); throw new IllegalArgumentException( "resolveRelative() in " + this + " must not be called with non-file resource " + parent); } if (isAbsolutePath(identifier)) { return resolve(identifier); } final FileResource fr = (FileResource) parent; File parentFile = fr.getAbsoluteFile().getParentFile(); File canonical = resolveCanonical(identifier, parentFile); if (!canonical.exists() && getBaseDirectory() != null) { canonical = resolveCanonical(identifier, getBaseDirectory()); } return new FileResource(canonical, determineResourceType(canonical)); } private File resolveCanonical(String identifier, File parentFile) { File canonical = new File(parentFile, identifier); try { canonical = canonical.getCanonicalFile(); } catch (IOException e) { throw new RuntimeException("While resolving '" + canonical.getAbsolutePath() + "'", e); } return canonical; } }