001    package org.apache.maven.model.path;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *  http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.io.File;
023    
024    import org.codehaus.plexus.component.annotations.Component;
025    
026    /**
027     * Resolves relative paths against a specific base directory.
028     * 
029     * @author Benjamin Bentmann
030     */
031    @Component( role = PathTranslator.class )
032    public class DefaultPathTranslator
033        implements PathTranslator
034    {
035    
036        public String alignToBaseDirectory( String path, File basedir )
037        {
038            String result = path;
039    
040            if ( path != null && basedir != null )
041            {
042                path = path.replace( '\\', File.separatorChar ).replace( '/', File.separatorChar );
043    
044                File file = new File( path );
045                if ( file.isAbsolute() )
046                {
047                    // path was already absolute, just normalize file separator and we're done
048                    result = file.getPath();
049                }
050                else if ( file.getPath().startsWith( File.separator ) )
051                {
052                    // drive-relative Windows path, don't align with project directory but with drive root
053                    result = file.getAbsolutePath();
054                }
055                else
056                {
057                    // an ordinary relative path, align with project directory
058                    result = new File( new File( basedir, path ).toURI().normalize() ).getAbsolutePath();
059                }
060            }
061    
062            return result;
063        }
064    
065    }