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;
     }
 }


Reply via email to