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