flex2.compiler.common.ConfigurationPathResolver Maven / Gradle / Ivy
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 flex2.compiler.common;
import flex2.compiler.config.ConfigurationException;
import flex2.compiler.config.ConfigurationValue;
import flex2.compiler.io.FileUtil;
import flex2.compiler.io.LocalFile;
import flex2.compiler.io.VirtualFile;
import java.io.File;
/**
* Resolves files in a way specific to configuration files. Or, as
* Roger, points out, this could be renamed RelativePathResolver or
* something, since it just resolves things relative to a root
* directory.
*
* @author Brian Deitte
*/
public class ConfigurationPathResolver implements SinglePathResolver
{
private String root;
/**
* Set default root file. For mxmlc, we only want the root to ever be the context of
* a ConfigurationValue. For example, if a ConfigurationValue comes from
* "C:/flex/royale-config.xml", the root should be "C:/flex". If a ConfigurationValue
* comes from the command line, the root should be null.
*
* This method is public, because it's used by Flex Builder.
*/
public void setRoot( String root )
{
this.root = root;
}
/**
* Resolve the path as an absolute file or relative to the root or relative to the
* current working directory if the root is null.
*/
public VirtualFile resolve( String path )
{
VirtualFile resolved = null;
File absoluteOrRelativeFile = FileUtil.openFile(path);
if ((absoluteOrRelativeFile != null) &&
absoluteOrRelativeFile.exists() &&
absoluteOrRelativeFile.isAbsolute())
{
resolved = new LocalFile(absoluteOrRelativeFile);
}
else if (root != null)
{
String rootRelativePath = root + File.separator + path;
File rootRelativeFile = FileUtil.openFile(rootRelativePath);
if ((rootRelativeFile != null) && rootRelativeFile.exists())
{
resolved = new LocalFile(rootRelativeFile);
}
}
else
{
if(absoluteOrRelativeFile != null) {
// C: must convert 'absoluteOrRelativeFile' into absolute before calling exists().
absoluteOrRelativeFile = absoluteOrRelativeFile.getAbsoluteFile();
if (absoluteOrRelativeFile.exists())
// && !FileUtils.isAbsolute(absoluteOrRelativeFile)
{
resolved = new LocalFile(absoluteOrRelativeFile);
}
}
}
/*
if ((resolved != null) && Trace.pathResolver)
{
Trace.trace("ConfigurationPathResolver.resolve: resolved " + path + " to " + resolved.getName());
}
*/
return resolved;
}
// This should be moved, simplified, destroyed, something.
public static VirtualFile getVirtualFile(String file,
ConfigurationPathResolver configResolver,
ConfigurationValue cfgval)
throws ConfigurationException
{
ConfigurationPathResolver relative = null;
String cfgContext = cfgval != null ? cfgval.getContext() : null;
if (cfgContext != null)
{
relative = new ConfigurationPathResolver();
relative.setRoot( cfgContext );
}
// check the PathResolver first and if nothing is found, then check the config
// resolver. This is done so that Zorn/WebTier can resolve these files as they
// wish
VirtualFile vFile = new PathResolver().resolve(relative, file);
if (vFile == null)
{
String oldRoot = null;
boolean rootChanged = false;
try
{
// If there is a configuration context for the configResolver, then use it.
// If there is no context, then let the configResolver use its own root.
if (cfgContext != null)
{
oldRoot = configResolver.root;
rootChanged = true;
configResolver.setRoot(cfgContext);
}
vFile = configResolver.resolve(file);
}
finally
{
if (rootChanged)
{
configResolver.setRoot(oldRoot);
}
}
}
if (vFile == null)
{
if (cfgval == null)
{
throw new ConfigurationException.CannotOpen( file, null, null, -1 );
}
else
{
throw new ConfigurationException.CannotOpen( file, cfgval.getVar(), cfgval.getSource(), cfgval.getLine() );
}
}
return vFile;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy