Author: jvanzyl
Date: Mon May 28 10:57:47 2007
New Revision: 542283
URL: http://svn.apache.org/viewvc?view=rev&rev=542283
Log:
DOXIA-91: Make Doxia Decoration model to actually work in reactor build
Submitted by: Henning Schmiedehausen
Modified:
maven/doxia/doxia-sitetools/trunk/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
Modified:
maven/doxia/doxia-sitetools/trunk/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java?view=diff&rev=542283&r1=542282&r2=542283
==============================================================================
---
maven/doxia/doxia-sitetools/trunk/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
(original)
+++
maven/doxia/doxia-sitetools/trunk/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
Mon May 28 10:57:47 2007
@@ -19,6 +19,11 @@
* under the License.
*/
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
import org.apache.maven.doxia.site.decoration.Banner;
import org.apache.maven.doxia.site.decoration.Body;
import org.apache.maven.doxia.site.decoration.DecorationModel;
@@ -26,32 +31,21 @@
import org.apache.maven.doxia.site.decoration.Logo;
import org.apache.maven.doxia.site.decoration.Menu;
import org.apache.maven.doxia.site.decoration.MenuItem;
-import org.codehaus.plexus.util.PathTool;
import org.codehaus.plexus.util.xml.Xpp3Dom;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
/**
* Manage inheritance of the decoration model.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Brett Porter</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Henning P. Schmiedehausen</a>
* @plexus.component
role="org.apache.maven.doxia.site.decoration.inheritance.DecorationModelInheritanceAssembler"
*/
-public class DefaultDecorationModelInheritanceAssembler
- implements DecorationModelInheritanceAssembler
+public class DefaultDecorationModelInheritanceAssembler implements
DecorationModelInheritanceAssembler
{
public void assembleModelInheritance( String name, DecorationModel child,
DecorationModel parent,
String childBaseUrl, String
parentBaseUrl )
{
- String prefix = getParentPrefix( parentBaseUrl, childBaseUrl );
-
- if ( !prefix.endsWith( "/" ) )
- {
- prefix += "/";
- }
+ URLContainer urlContainer = new URLContainer( parentBaseUrl,
childBaseUrl );
// cannot inherit from null parent.
if ( parent != null )
@@ -59,15 +53,14 @@
if ( child.getBannerLeft() == null )
{
child.setBannerLeft( parent.getBannerLeft() );
-
- resolveBannerPaths( child.getBannerLeft(), prefix,
parentBaseUrl );
+ resolveBannerPaths( child.getBannerLeft(), urlContainer );
}
if ( child.getBannerRight() == null )
{
child.setBannerRight( parent.getBannerRight() );
- resolveBannerPaths( child.getBannerRight(), prefix,
parentBaseUrl );
+ resolveBannerPaths( child.getBannerRight(), urlContainer );
}
if ( child.getPublishDate() == null )
@@ -85,34 +78,33 @@
child.setSkin( parent.getSkin() );
}
- child.setPoweredBy(
- mergePoweredByLists( child.getPoweredBy(),
parent.getPoweredBy(), prefix, parentBaseUrl ) );
+ child.setPoweredBy( mergePoweredByLists( child.getPoweredBy(),
parent.getPoweredBy(), urlContainer ) );
- assembleBodyInheritance( name, childBaseUrl, child, parent,
prefix, parentBaseUrl );
+ assembleBodyInheritance( name, child, parent, urlContainer );
assembleCustomInheritance( child, parent );
}
}
- public void resolvePaths( DecorationModel decoration, String baseUrl )
+ public void resolvePaths( final DecorationModel decoration, final String
childBaseUrl )
{
- String prefix = ".";
+ URLContainer urlContainer = new URLContainer( null, childBaseUrl );
if ( decoration.getBannerLeft() != null )
{
- resolveBannerPaths( decoration.getBannerLeft(), prefix, baseUrl );
+ resolveBannerPaths( decoration.getBannerLeft(), urlContainer );
}
if ( decoration.getBannerRight() != null )
{
- resolveBannerPaths( decoration.getBannerRight(), prefix, baseUrl );
+ resolveBannerPaths( decoration.getBannerRight(), urlContainer );
}
for ( Iterator i = decoration.getPoweredBy().iterator(); i.hasNext(); )
{
Logo logo = (Logo) i.next();
- resolveLogoPaths( logo, prefix, baseUrl );
+ resolveLogoPaths( logo, urlContainer );
}
if ( decoration.getBody() != null )
@@ -121,48 +113,40 @@
{
LinkItem linkItem = (LinkItem) i.next();
- resolveLinkItemPaths( linkItem, prefix, baseUrl );
+ resolveLinkItemPaths( linkItem, urlContainer );
}
for ( Iterator i =
decoration.getBody().getBreadcrumbs().iterator(); i.hasNext(); )
{
LinkItem linkItem = (LinkItem) i.next();
- resolveLinkItemPaths( linkItem, prefix, baseUrl );
+ resolveLinkItemPaths( linkItem, urlContainer );
}
for ( Iterator i = decoration.getBody().getMenus().iterator();
i.hasNext(); )
{
Menu menu = (Menu) i.next();
- resolveMenuPaths( menu.getItems(), prefix, baseUrl );
+ resolveMenuPaths( menu.getItems(), urlContainer );
}
}
}
- private void resolveBannerPaths( Banner banner, String prefix, String
baseUrl )
+ /**
+ * Resolves all relative pathes between the elements in a banner. The
banner element might contain relative pathes
+ * to the oldBaseUrl, these are changed to the newBannerUrl.
+ *
+ * @param banner
+ * @param prefix
+ * @param baseUrl
+ */
+ private void resolveBannerPaths( final Banner banner, final URLContainer
urlContainer )
{
if ( banner != null )
{
- banner.setHref( resolvePath( banner.getHref(), prefix, baseUrl ) );
- banner.setSrc( resolvePath( banner.getSrc(), prefix, baseUrl ) );
- }
- }
-
- private String resolvePath( String href, String prefix, String baseUrl )
- {
- String path = null;
- if ( href != null )
- {
- String relativePath = getParentPrefix( href, baseUrl );
-
- if ( relativePath.startsWith( "/" ) )
- {
- relativePath = relativePath.substring( 1 );
- }
- path = PathTool.calculateLink( relativePath, prefix );
+ banner.setHref( convertPath( banner.getHref(), urlContainer ) );
+ banner.setSrc( convertPath( banner.getSrc(), urlContainer ) );
}
- return path;
}
private void assembleCustomInheritance( DecorationModel child,
DecorationModel parent )
@@ -177,8 +161,8 @@
}
}
- private void assembleBodyInheritance( String name, String childUrl,
DecorationModel child, DecorationModel parent,
- String prefix, String baseUrl )
+ private void assembleBodyInheritance( final String name, final
DecorationModel child, final DecorationModel parent,
+ final URLContainer urlContainer )
{
Body cBody = child.getBody();
Body pBody = parent.getBody();
@@ -205,27 +189,26 @@
cBody.setHead( Xpp3Dom.mergeXpp3Dom( (Xpp3Dom)
cBody.getHead(), (Xpp3Dom) pBody.getHead() ) );
}
- cBody.setLinks( mergeLinkItemLists( cBody.getLinks(),
pBody.getLinks(), prefix, baseUrl ) );
+ cBody.setLinks( mergeLinkItemLists( cBody.getLinks(),
pBody.getLinks(), urlContainer ) );
if ( cBody.getBreadcrumbs().isEmpty() &&
!pBody.getBreadcrumbs().isEmpty() )
{
LinkItem breadcrumb = new LinkItem();
breadcrumb.setName( name );
- breadcrumb.setHref( childUrl );
+ breadcrumb.setHref( urlContainer.getNewPath() );
cBody.getBreadcrumbs().add( breadcrumb );
}
- cBody.setBreadcrumbs(
- mergeLinkItemLists( cBody.getBreadcrumbs(),
pBody.getBreadcrumbs(), prefix, baseUrl ) );
+ cBody.setBreadcrumbs( mergeLinkItemLists( cBody.getBreadcrumbs(),
pBody.getBreadcrumbs(), urlContainer ) );
- cBody.setMenus( mergeMenus( cBody.getMenus(), pBody.getMenus(),
prefix, baseUrl ) );
+ cBody.setMenus( mergeMenus( cBody.getMenus(), pBody.getMenus(),
urlContainer ) );
}
}
- private List mergeMenus( List dominant, List recessive, String prefix,
String baseUrl )
+ private List mergeMenus( final List childMenus, final List parentMenus,
final URLContainer urlContainer )
{
List menus = new ArrayList();
- for ( Iterator it = dominant.iterator(); it.hasNext(); )
+ for ( Iterator it = childMenus.iterator(); it.hasNext(); )
{
Menu menu = (Menu) it.next();
@@ -233,7 +216,7 @@
}
int topCounter = 0;
- for ( Iterator it = recessive.iterator(); it.hasNext(); )
+ for ( Iterator it = parentMenus.iterator(); it.hasNext(); )
{
Menu menu = (Menu) it.next();
@@ -242,48 +225,48 @@
menus.add( topCounter, menu );
topCounter++;
- resolveMenuPaths( menu.getItems(), prefix, baseUrl );
+ resolveMenuPaths( menu.getItems(), urlContainer );
}
else if ( "bottom".equals( menu.getInherit() ) )
{
menus.add( menu );
- resolveMenuPaths( menu.getItems(), prefix, baseUrl );
+ resolveMenuPaths( menu.getItems(), urlContainer );
}
}
return menus;
}
- private void resolveMenuPaths( List items, String prefix, String baseUrl )
+ private void resolveMenuPaths( final List items, final URLContainer
urlContainer )
{
for ( Iterator i = items.iterator(); i.hasNext(); )
{
MenuItem item = (MenuItem) i.next();
- resolveLinkItemPaths( item, prefix, baseUrl );
- resolveMenuPaths( item.getItems(), prefix, baseUrl );
+ resolveLinkItemPaths( item, urlContainer );
+ resolveMenuPaths( item.getItems(), urlContainer );
}
}
- private void resolveLinkItemPaths( LinkItem item, String prefix, String
baseUrl )
+ private void resolveLinkItemPaths( LinkItem item, final URLContainer
urlContainer )
{
if ( item.getHref() != null )
{
- item.setHref( resolvePath( item.getHref(), prefix, baseUrl ) );
+ item.setHref( convertPath( item.getHref(), urlContainer ) );
}
else
{
- item.setHref( "" );
+ item.setHref( convertPath( "", urlContainer ) );
}
}
- private void resolveLogoPaths( Logo logo, String prefix, String baseUrl )
+ private void resolveLogoPaths( final Logo logo, final URLContainer
urlContainer )
{
- logo.setImg( resolvePath( logo.getImg(), prefix, baseUrl ) );
- resolveLinkItemPaths( logo, prefix, baseUrl );
+ logo.setImg( convertPath( logo.getImg(), urlContainer ) );
+ resolveLinkItemPaths( logo, urlContainer );
}
- private List mergeLinkItemLists( List childList, List parentList, String
prefix, String baseUrl )
+ private List mergeLinkItemLists( final List childList, final List
parentList, final URLContainer urlContainer )
{
List items = new ArrayList();
@@ -291,7 +274,7 @@
{
LinkItem item = (LinkItem) it.next();
- resolveLinkItemPaths( item, prefix, baseUrl );
+ resolveLinkItemPaths( item, urlContainer );
if ( !items.contains( item ) )
{
@@ -312,7 +295,7 @@
return items;
}
- private List mergePoweredByLists( List childList, List parentList, String
prefix, String baseUrl )
+ private List mergePoweredByLists( final List childList, final List
parentList, final URLContainer urlContainer )
{
List logos = new ArrayList();
@@ -325,7 +308,7 @@
logos.add( logo );
}
- resolveLogoPaths( logo, prefix, baseUrl );
+ resolveLogoPaths( logo, urlContainer );
}
for ( Iterator it = childList.iterator(); it.hasNext(); )
@@ -341,105 +324,44 @@
return logos;
}
- private static String getParentPrefix( String parentUrl, String childUrl )
+ private String convertPath( final String relativePath, final URLContainer
urlContainer )
{
- String prefix = parentUrl;
-
- if ( childUrl.startsWith( parentUrl ) )
+ try
{
- prefix = getRelativePath( childUrl, parentUrl );
+ PathDescriptor oldPathDescriptor = new PathDescriptor(
urlContainer.getOldPath(), relativePath );
+ PathDescriptor newPathDescriptor = new PathDescriptor(
urlContainer.getNewPath(), "" );
- String parentPath = "";
- for ( StringTokenizer tok = new StringTokenizer( prefix, "/" );
tok.hasMoreTokens(); tok.nextToken() )
- {
- parentPath += "../";
- }
- prefix = parentPath;
+ PathDescriptor relativePathDescriptor = PathUtils.convertPath(
oldPathDescriptor, newPathDescriptor );
+
+ return relativePathDescriptor.getLocation();
}
- else if ( parentUrl.startsWith( childUrl ) )
+ catch ( MalformedURLException mue )
{
- prefix = getRelativePath( parentUrl, childUrl );
+ throw new RuntimeException( "While converting Pathes:", mue );
}
-/*
- // [MSITE-62] This is to test the ../ relative paths, which I am
inclined not to use
- else
- {
- String[] parentSplit = splitUrl( parentUrl );
- String[] childSplit = splitUrl( childUrl );
-
- if ( parentSplit != null && childSplit != null )
- {
- if ( parentSplit[0].equals( childSplit[0] ) &&
parentSplit[1].equals( childSplit[1] ) )
- {
- prefix = "";
- boolean mismatched = false;
- String parentPath = parentSplit[2].substring( 1 );
- String childPath = childSplit[2].substring( 1 );
- StringTokenizer tok = new StringTokenizer( childPath, "/"
);
- while ( tok.hasMoreTokens() )
- {
- String part = tok.nextToken();
-
- if ( !mismatched && parentPath.startsWith( part ) )
- {
- parentPath = parentPath.substring( part.length() +
1 );
- }
- else
- {
- mismatched = true;
- prefix += "../";
- }
- }
- prefix += parentPath;
- }
- }
- }
-*/
-
- return prefix;
}
-/* [MSITE-62] This is to test the ../ relative paths, which I am inclined not
to use
- private static String[] splitUrl( String url )
+ public final class URLContainer
{
- String[] retValue = null;
- int protocolIndex = url.indexOf( "://" );
+ private final String oldPath;
- if ( protocolIndex >= 0 )
- {
- String protocol = url.substring( 0, protocolIndex );
-
- String host = url.substring( protocolIndex + 3 );
-
- int pathIndex = host.indexOf( '/' );
+ private final String newPath;
- if ( pathIndex >= 0 )
- {
- String path = host.substring( pathIndex );
- host = host.substring( 0, pathIndex );
- if ( host.length() == 0 && "file".equals( protocol ) )
- {
- host = "localhost";
- }
+ public URLContainer( final String oldPath, final String newPath )
+ {
+ this.oldPath = oldPath;
+ this.newPath = newPath;
+ }
- retValue = new String[3];
- retValue[0] = protocol;
- retValue[1] = host;
- retValue[2] = path;
- }
+ public String getNewPath()
+ {
+ return this.newPath;
}
- return retValue;
- }
-*/
- private static String getRelativePath( String childUrl, String parentUrl )
- {
- String relative = childUrl.substring( parentUrl.length() );
- if ( relative.startsWith( "/" ) )
+ public String getOldPath()
{
- relative = relative.substring( 1 );
+ return this.oldPath;
}
- return relative;
}
}