On Sat, Feb 19, 2011 at 10:38, vmassol <[email protected]> wrote:
> Author: vmassol
> Date: 2011-02-19 10:38:37 +0100 (Sat, 19 Feb 2011)
> New Revision: 34808
>
> Added:
>   
> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/block/match/CompositeBlockMatcher.java
> Modified:
>   
> platform/core/trunk/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-include/src/main/java/org/xwiki/rendering/internal/macro/include/IncludeMacro.java
> Log:
> XWIKI-1776: Support Include of Section Content
>
> * Added javadoc
> * Introduced CompositeBlockMatcher
>
> Added: 
> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/block/match/CompositeBlockMatcher.java
> ===================================================================
> --- 
> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/block/match/CompositeBlockMatcher.java
>                             (rev 0)
> +++ 
> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/block/match/CompositeBlockMatcher.java
>     2011-02-19 09:38:37 UTC (rev 34808)
> @@ -0,0 +1,72 @@
> +/*
> + * See the NOTICE file distributed with this work for additional
> + * information regarding copyright ownership.
> + *
> + * This is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as
> + * published by the Free Software Foundation; either version 2.1 of
> + * the License, or (at your option) any later version.
> + *
> + * This software is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this software; if not, write to the Free
> + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
> + * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
> + */
> +package org.xwiki.rendering.block.match;
> +
> +import java.util.ArrayList;
> +import java.util.List;
> +
> +import org.xwiki.rendering.block.Block;
> +
> +/**
> + * Implementation of {@link BlockMatcher} which matches blocks using passed 
> matchers in series.
> + *
> + * @version $Id$
> + * @since 3.0M3
> + */
> +public class CompositeBlockMatcher implements BlockMatcher
> +{
> +    /**
> +     * The matchers to match in series.
> +     */
> +    private List<BlockMatcher> matchers = new ArrayList<BlockMatcher>();
> +
> +    /**
> +     * @param matchers list of matchers to add
> +     */
> +    public CompositeBlockMatcher(List<BlockMatcher> matchers)
> +    {
> +        this.matchers.addAll(matchers);
> +    }
> +
> +    /**
> +     * @param matchers vararg list of matchers to add
> +     */
> +    public CompositeBlockMatcher(BlockMatcher... matchers)
> +    {
> +        for (BlockMatcher matcher : matchers) {
> +            this.matchers.add(matcher);
> +        }
> +    }
> +
> +    /**
> +     * {@inheritDoc}
> +     *
> +     * @see 
> org.xwiki.rendering.block.match.BlockMatcher#match(org.xwiki.rendering.block.Block)
> +     */
> +    public boolean match(Block block)
> +    {
> +        for (BlockMatcher matcher : this.matchers) {
> +            if (!matcher.match(block)) {
> +                return false;
> +            }
> +        }
> +        return true;
> +    }
> +}
>
> Modified: 
> platform/core/trunk/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-include/src/main/java/org/xwiki/rendering/internal/macro/include/IncludeMacro.java
> ===================================================================
> --- 
> platform/core/trunk/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-include/src/main/java/org/xwiki/rendering/internal/macro/include/IncludeMacro.java
>  2011-02-18 22:26:41 UTC (rev 34807)
> +++ 
> platform/core/trunk/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-include/src/main/java/org/xwiki/rendering/internal/macro/include/IncludeMacro.java
>  2011-02-19 09:38:37 UTC (rev 34808)
> @@ -41,6 +41,8 @@
>  import org.xwiki.rendering.block.MetaDataBlock;
>  import org.xwiki.rendering.block.XDOM;
>  import org.xwiki.rendering.block.match.BlockMatcher;
> +import org.xwiki.rendering.block.match.ClassBlockMatcher;
> +import org.xwiki.rendering.block.match.CompositeBlockMatcher;
>  import org.xwiki.rendering.internal.macro.MacroContentParser;
>  import org.xwiki.rendering.listener.MetaData;
>  import org.xwiki.rendering.macro.AbstractMacro;
> @@ -207,24 +209,33 @@
>         return result;
>     }
>
> +    /**
> +     * Get the content to include (either full target document or a specific 
> section's content).
> +     *
> +     * @param document the reference to the document from which to get the 
> content
> +     * @param section the id of the section from which to get the content in 
> that document or null to take the whole
> +     *        content
> +     * @param includedReference the resolved absolute reference of the 
> included document
> +     * @return the content as an XDOM tree
> +     * @throws MacroExecutionException if no section of the passed if exists 
> in the included document
> +     */
>     private XDOM getContent(DocumentModelBridge document, final String 
> section, DocumentReference includedReference)
>         throws MacroExecutionException
>     {
>         XDOM includedContent = document.getXDOM();
>
>         if (section != null) {
> -            HeaderBlock headerBlock = (HeaderBlock) 
> includedContent.getFirstBlock(new BlockMatcher() {
> -                public boolean match(Block block)
> -                {
> -                    if (block instanceof HeaderBlock) {
> +            HeaderBlock headerBlock = (HeaderBlock) 
> includedContent.getFirstBlock(
> +                new CompositeBlockMatcher(new 
> ClassBlockMatcher(HeaderBlock.class), new BlockMatcher() {
> +                    public boolean match(Block block)
> +                    {
>                         HeaderBlock headerBlock = (HeaderBlock) block;
>                         if (headerBlock.getId().equals(section)) {
>                             return true;
>                         }
> +                        return false;

What about

return headerBlock.getId().equals(section);

?

>                     }
> -                    return false;
> -                }
> -            }, Block.Axes.DESCENDANT);
> +                }),Block.Axes.DESCENDANT);
>             if (headerBlock == null) {
>                 throw new MacroExecutionException("Cannot find section [" + 
> section
>                     + "] in document [" + 
> this.defaultEntityReferenceSerializer.serialize(includedReference) + "]");
> @@ -291,19 +302,26 @@
>     {
>         DocumentReference result;
>
> -        String sourceMetadata = null;
> -        MetaDataBlock metadataBlock = 
> block.getPreviousBlockByType(MetaDataBlock.class, true);
> -        while (sourceMetadata == null && metadataBlock != null) {
> -            sourceMetadata = (String) 
> metadataBlock.getMetaData().getMetaData(MetaData.SOURCE);
> -            metadataBlock = 
> metadataBlock.getPreviousBlockByType(MetaDataBlock.class, true);
> -        }
> +        MetaDataBlock metaDataBlock = (MetaDataBlock) block.getFirstBlock(
> +            new CompositeBlockMatcher(new 
> ClassBlockMatcher(MetaDataBlock.class), new BlockMatcher() {
> +                public boolean match(Block block)
> +                {
> +                    MetaDataBlock metaDataBlock = (MetaDataBlock) block;
> +                    String sourceMetaData = (String) 
> metaDataBlock.getMetaData().getMetaData(MetaData.SOURCE);
> +                    if (sourceMetaData != null) {
> +                        return true;
> +                    }
> +                    return false;

Maybe we should add something like MetaDataBlock#contains(String key) method.

> +                }
> +            }), Block.Axes.ANCESTOR);
>
>         // If no Source MetaData was found resolve against the current 
> document as a failsafe solution.
> -        if (sourceMetadata == null) {
> +        if (metaDataBlock == null) {
>             result = 
> this.currentDocumentReferenceResolver.resolve(documentName);
>         } else {
> +            String sourceMetaData = (String) 
> metaDataBlock.getMetaData().getMetaData(MetaData.SOURCE);
>             result = 
> this.currentDocumentReferenceResolver.resolve(documentName,
> -                
> this.currentDocumentReferenceResolver.resolve(sourceMetadata));
> +                
> this.currentDocumentReferenceResolver.resolve(sourceMetaData));
>         }
>
>         return result;
>
> _______________________________________________
> notifications mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/notifications
>



-- 
Thomas Mortagne
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to