/**
* 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;
}
}