blob: 5752e321108df5adc1a6fc52093235267c575802 [file] [log] [blame]
package org.apache.maven.doxia.site.decoration.inheritance;
/*
* 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.
*/
import java.net.MalformedURLException;
import java.net.URL;
import org.codehaus.plexus.util.PathTool;
/**
* Utilities that allow conversion of old and new pathes and URLs relative to each other.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @author <a href="mailto:henning@apache.org">Henning P. Schmiedehausen</a>
* @version $Id$
*/
public abstract class PathUtils
{
/**
* Private constructor.
*/
private PathUtils()
{
// do not instantiate
}
/**
* <p>convertPath</p>
*
* @param oldPath not null
* @param newPath not null
* @return a PathDescriptor converted by the new path
* @throws java.net.MalformedURLException if any
*/
public static final PathDescriptor convertPath( final PathDescriptor oldPath, final PathDescriptor newPath )
throws MalformedURLException
{
String relative = getRelativePath( oldPath, newPath );
if ( relative == null )
{
return oldPath;
}
return new PathDescriptor( relative );
}
/**
* <p>getRelativePath</p>
*
* @param oldPathDescriptor not null
* @param newPathDescriptor not null
* @return a relative path depending if PathDescriptor is a file or a web url.
* @see PathTool#getRelativeFilePath(String, String)
* @see PathTool#getRelativeWebPath(String, String)
*/
public static final String getRelativePath( final PathDescriptor oldPathDescriptor,
final PathDescriptor newPathDescriptor )
{
// Cannot convert from URL to file.
if ( oldPathDescriptor.isFile() )
{
if ( !newPathDescriptor.isFile() )
{
// We want to convert from a file to an URL. This is normally not possible...
if ( oldPathDescriptor.isRelative() )
{
// unless the old path is a relative path. Then we might convert an existing
// site into a new URL using resolvePaths()...
return oldPathDescriptor.getPath();
}
// The old path is not relative. Bail out.
return null;
}
}
// Don't optimize to else. This might also be old.isFile && new.isFile ...
if ( !oldPathDescriptor.isFile() )
{
// URLs, determine if they share protocol and domain info
URL oldUrl = oldPathDescriptor.getPathUrl();
URL newUrl = newPathDescriptor.getPathUrl();
if ( oldUrl == null || newUrl == null )
{
// One of the sites has a strange URL. no relative path possible, bail out.
return null;
}
if ( ( newUrl.getProtocol().equalsIgnoreCase( oldUrl.getProtocol() ) )
&& ( newUrl.getHost().equalsIgnoreCase( oldUrl.getHost() ) )
&& ( newUrl.getPort() == oldUrl.getPort() ) )
{
// Both paths point to the same site. So we can use relative paths.
String oldPath = oldPathDescriptor.getPath();
String newPath = newPathDescriptor.getPath();
return PathTool.getRelativeWebPath( newPath, oldPath );
}
// Different sites. No relative Path possible.
return null;
}
// Both Descriptors point to a path. We can build a relative path.
String oldPath = oldPathDescriptor.getPath();
String newPath = newPathDescriptor.getPath();
if ( oldPath == null || newPath == null )
{
// One of the sites has a strange URL. no relative path possible, bail out.
return null;
}
return PathTool.getRelativeFilePath( oldPath, newPath );
}
}