On Fri, Dec 4, 2009 at 16:25, lucaa <contrib-notifications(a)xwiki.org> wrote:
Author: lucaa
Date: 2009-12-04 16:25:46 +0100 (Fri, 04 Dec 2009)
New Revision: 25544
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/WhiteSpaceContentAlterer.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/filter/WhiteSpaceFilter.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/AnnotationGeneratorChainingListener.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationChainingPrintRenderer.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationRenderer.java
XHTMLAnnotationRenderer seems wrong, it's a specialized XHTML renderer
so it should be the other way around: AnnotationXHTMLRenderer
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AbstractAnnotationRenderer.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationChainingPrintRenderer.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationListener.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationPrintRenderer.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/content/
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/content/WhiteSpaceContentAltererTest.java
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/renderer/
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/renderer/XHTMLAnnotationRendererTest.java
Modified:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/pom.xml
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/resources/META-INF/components.txt
Log:
First prototype for the annotations renderer API with the default XHTML renderer.
Modified: contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/pom.xml
===================================================================
--- contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/pom.xml
2009-12-04 15:18:58 UTC (rev 25543)
+++ contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/pom.xml
2009-12-04 15:25:46 UTC (rev 25544)
@@ -21,11 +21,17 @@
</dependency>
<dependency>
<groupId>org.xwiki.platform</groupId>
- <artifactId>xwiki-core-observation-local</artifactId>
+ <artifactId>xwiki-core-rendering-api</artifactId>
<version>${platform.core.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.xwiki.platform</groupId>
+ <artifactId>xwiki-core-rendering-syntax-wikimodel</artifactId>
+ <version>${platform.core.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>org.xwiki.platform</groupId>
<artifactId>xwiki-core-shared-tests</artifactId>
<version>${platform.core.version}</version>
@@ -52,7 +58,8 @@
<configuration>
<excludes>
org/xwiki/annotation/Annotation.java,
- org/xwiki/annotation/internal/target/DefaultDocumentContentTarget.java
+ org/xwiki/annotation/internal/target/DefaultDocumentContentTarget.java,
+
org/xwiki/annotation/internal/renderer/AnnotationGeneratorChainingListener.java
</excludes>
</configuration>
</plugin>
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/WhiteSpaceContentAlterer.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/WhiteSpaceContentAlterer.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/WhiteSpaceContentAlterer.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,51 @@
+/*
+ * 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.annotation.internal.content;
+
+import org.xwiki.annotation.content.filter.Filter;
+import org.xwiki.component.annotation.Component;
+import org.xwiki.component.annotation.Requirement;
+
+/**
+ * Content alterer that filters out all spaces.
+ *
+ * @version $Id$
+ */
+@Component("whitespace")
+public class WhiteSpaceContentAlterer extends AbstractFilterContentAlterer
+{
+ /**
+ * Whitespace filter used by this alterer.
+ */
+ @Requirement("whitespace")
+ private Filter whiteSpaceFilter;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.annotation.internal.content.AbstractFilterContentAlterer#getFilter()
+ */
+ @Override
+ protected Filter getFilter()
+ {
+ return whiteSpaceFilter;
+ }
+
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/WhiteSpaceContentAlterer.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/filter/WhiteSpaceFilter.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/filter/WhiteSpaceFilter.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/filter/WhiteSpaceFilter.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,43 @@
+/*
+ * 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.annotation.internal.content.filter;
+
+import org.xwiki.annotation.content.filter.Filter;
+import org.xwiki.component.annotation.Component;
+
+/**
+ * Filters white spaces out of a text.
+ *
+ * @version $Id$
+ */
+@Component("whitespace")
+public class WhiteSpaceFilter implements Filter
+{
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.annotation.content.filter.Filter#accept(java.lang.Character)
+ */
+ public boolean accept(Character c)
+ {
+ // check it not to be a whitespace but also not a space (should cover all
whitespaces + unbreakable spaces)
+ return !Character.isWhitespace(c) && !Character.isSpaceChar(c);
+ }
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/content/filter/WhiteSpaceFilter.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/AnnotationGeneratorChainingListener.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/AnnotationGeneratorChainingListener.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/AnnotationGeneratorChainingListener.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,372 @@
+/*
+ * 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.annotation.internal.renderer;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.xwiki.annotation.Annotation;
+import org.xwiki.annotation.content.AlteredContent;
+import org.xwiki.annotation.content.ContentAlterer;
+import org.xwiki.annotation.renderer.AnnotationListener;
+import org.xwiki.rendering.internal.renderer.BasicLinkRenderer;
+import org.xwiki.rendering.listener.Link;
+import org.xwiki.rendering.listener.LinkType;
+import org.xwiki.rendering.listener.Listener;
+import org.xwiki.rendering.listener.QueueListener;
+import org.xwiki.rendering.listener.chaining.ChainingListener;
+import org.xwiki.rendering.listener.chaining.EmptyBlockChainingListener;
+import org.xwiki.rendering.listener.chaining.ListenerChain;
+import org.xwiki.rendering.renderer.LinkLabelGenerator;
+import org.xwiki.rendering.syntax.Syntax;
+
+/**
+ * Generates annotation events (as per the {@link AnnotationListener} specification) in
a chain, to the next listener in
+ * the chain. <br />
+ * It operates by buffering all events, creating the plain text representation of the
listened content, mapping the
+ * annotations on this content and identifying the events in the stream that hold the
start and end of the annotations.
+ * On sending the buffered events, the events containing annotations will be split and
annotation events will be sent
+ * for them.
+ *
+ * @version $Id$
+ */
+public class AnnotationGeneratorChainingListener extends QueueListener implements
ChainingListener
+{
+ /**
+ * Version number of this class.
+ */
+ private static final long serialVersionUID = -2790330640900288463L;
+
+ /**
+ * To generate a string representation of a link that we output when no link label
generator exist or when the link
+ * is an external link (ie not a document link).
+ */
+ private BasicLinkRenderer linkRenderer = new BasicLinkRenderer();
+
+ /**
+ * Generate link label.
+ */
+ private LinkLabelGenerator linkLabelGenerator;
+
+ /**
+ * The chain listener from which this listener is part of.
+ */
+ private ListenerChain chain;
+
+ /**
+ * Buffer to store the plain text version of the content to be rendered, so that
annotations are mapped on it.
+ */
+ private StringBuffer plainTextContent = new StringBuffer();
+
+ /**
+ * Map to store the ranges in the plainTextContent and their corresponding events.
The ranges will be stored by
+ * their end index (inclusive) and ordered from smallest to biggest.
+ */
+ private SortedMap<Integer, Event> eventsMapping = new TreeMap<Integer,
Event>();
+
+ /**
+ * The collection of annotations to generate annotation events for, by default the
empty list.
+ */
+ private Collection<Annotation> annotations = Collections.<Annotation>
emptyList();
+
+ /**
+ * Cleaner for the annotation selection text, so that it can be mapped on the
content.
+ */
+ private ContentAlterer selectionAlterer;
+
+ /**
+ * Map holding the collection of annotations starting in the specified event. Used
to send annotation events in the
+ * events stream when consuming queued events.
+ */
+ private Map<Event, Collection<Annotation>> startEvents = new
HashMap<Event, Collection<Annotation>>();
+
+ /**
+ * Map holding the collection of annotations ending in the specified event. Used to
send annotation events in the
+ * events stream when consuming queued events.
+ */
+ private Map<Event, Collection<Annotation>> endEvents = new
HashMap<Event, Collection<Annotation>>();
+
+ /**
+ * Builds an annotation generator listener from the passed link generator in the
passed chain.
+ *
+ * @param linkLabelGenerator the generator for link labels so that the annotation
text can be recognized.
+ * @param selectionAlterer cleaner for the annotation selection text, so that it can
be mapped on the content
+ * @param listenerChain the chain in which this listener is part of
+ */
+ public AnnotationGeneratorChainingListener(LinkLabelGenerator linkLabelGenerator,
ContentAlterer selectionAlterer,
+ ListenerChain listenerChain)
+ {
+ this.linkLabelGenerator = linkLabelGenerator;
+ this.chain = listenerChain;
+ this.selectionAlterer = selectionAlterer;
+ }
+
+ /**
+ * @return the state of the current empty block.
+ */
+ protected EmptyBlockChainingListener getEmptyBlockState()
+ {
+ return (EmptyBlockChainingListener)
getListenerChain().getListener(EmptyBlockChainingListener.class);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.rendering.listener.QueueListener#onWord(java.lang.String)
+ */
+ @Override
+ public void onWord(String word)
+ {
+ // queue this event
+ super.onWord(word);
+ // put it in the buffer
+ plainTextContent.append(word);
+ // store the mapping of the range to the just added event
+ eventsMapping.put(plainTextContent.length() - 1, getLast());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.rendering.listener.QueueListener#onSpecialSymbol(char)
+ */
+ @Override
+ public void onSpecialSymbol(char symbol)
+ {
+ super.onSpecialSymbol(symbol);
+ plainTextContent.append("" + symbol);
+ eventsMapping.put(plainTextContent.length() - 1, getLast());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.rendering.listener.QueueListener#onVerbatim(java.lang.String,
boolean, java.util.Map)
+ */
+ @Override
+ public void onVerbatim(String protectedString, boolean isInline, Map<String,
String> parameters)
+ {
+ super.onVerbatim(protectedString, isInline, parameters);
+ plainTextContent.append(protectedString);
+ eventsMapping.put(plainTextContent.length() - 1, getLast());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.rendering.listener.QueueListener#onRawText(java.lang.String,
org.xwiki.rendering.syntax.Syntax)
+ */
+ @Override
+ public void onRawText(String text, Syntax syntax)
+ {
+ // Store the raw text as it is ftm. Should handle syntax in the future
+ super.onRawText(text, syntax);
+ plainTextContent.append(text);
+ eventsMapping.put(plainTextContent.length() - 1, getLast());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.rendering.listener.chaining.AbstractChainingListener#endLink(org.xwiki.rendering.listener.Link,
+ * boolean, java.util.Map)
+ */
+ @Override
+ public void endLink(Link link, boolean isFreeStandingURI, Map<String, String>
parameters)
+ {
+ super.endLink(link, isFreeStandingURI, parameters);
+ // special handling only if the link is empty
+ if (getEmptyBlockState().isCurrentContainerBlockEmpty()) {
+ String linkPlainText = "";
+ if (link.getType() == LinkType.DOCUMENT && this.linkLabelGenerator
!= null) {
+ linkPlainText = this.linkLabelGenerator.generate(link);
+ } else {
+ linkPlainText = this.linkRenderer.renderLinkReference(link);
+ }
+ // TODO: should clean spaces out of the linkPlainText (but then the event
offset inside this event wouldn't
+ // work anymore)
+ plainTextContent.append(linkPlainText);
+ // TODO: maybe should store the begin link event...
+ eventsMapping.put(plainTextContent.length() - 1, getLast());
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void endDocument(Map<String, String> parameters)
+ {
+ super.endDocument(parameters);
+
+ mapAnnotations();
+
+ // now get the next listener in the chain and consume all events to it
+ ChainingListener renderer = chain.getNextListener(getClass());
+
+ // consumeEvents should check if the listener is annotation listener or not and
send annotation events
+ consumeEvents(renderer);
+ }
+
+ /**
+ * Helper method to map the annotations on the plainTextContent and identify the
events where annotations start and
+ * end.
+ */
+ private void mapAnnotations()
+ {
+ for (Annotation ann : annotations) {
+ // clean it up and its context
+ AlteredContent cleanedContext =
selectionAlterer.alter(ann.getSelectionContext());
+ // find it in the plaintextContent
+ int contextIndex =
plainTextContent.indexOf(cleanedContext.getContent().toString());
+ // find the selection inside the context in the plainTextContent
+ // assume at this point that the selection appears only once in the context
+ String alteredSelection =
selectionAlterer.alter(ann.getInitialSelection()).getContent().toString();
+ int selectionIndexInContext =
cleanedContext.getContent().toString().indexOf(alteredSelection);
+ // check that the context is in the plainText representation and selection
was found inside it
+ if (contextIndex >= 0 && selectionIndexInContext >= 0) {
+ // compute annotation index in the plain text repr
+ int annotationIndex = contextIndex + selectionIndexInContext;
+ // get the start and end events for the annotation
+ // TODO: should also store the offsets of the start and end annotation
in the event
+ Event startEvt = getEventForIndex(annotationIndex).getValue();
+ Event endEvt = getEventForIndex(annotationIndex +
alteredSelection.length() - 1).getValue();
+ if (startEvt != null & endEvt != null) {
+ // store them in the maps
+ addEventMapping(startEvt, ann, startEvents);
+ addEventMapping(endEvt, ann, endEvents);
+ } else {
+ // cannot find the events for the start and / or end of annotation,
ignore it
+ // TODO: mark it somehow...
+ continue;
+ }
+ } else {
+ // cannot find the context of the annotation or the annotation selection
cannot be found in the
+ // annotation context, ignore it
+ // TODO: mark it somehow...
+ continue;
+ }
+ }
+ }
+
+ /**
+ * Adds a mapping for the passed event and annotation in the specified map.
+ *
+ * @param event the event to add mapping for
+ * @param annotation the annotation to add mapping for
+ * @param map the map in which to add mapping
+ */
+ private void addEventMapping(Event event, Annotation annotation, Map<Event,
Collection<Annotation>> map)
+ {
+ Collection<Annotation> mappedCollection = endEvents.get(event);
+ if (mappedCollection == null) {
+ mappedCollection = new ArrayList<Annotation>();
+ map.put(event, mappedCollection);
+ }
+ mappedCollection.add(annotation);
+ }
+
+ /**
+ * Finds and returns the event in whose range (generated text in the
plainTextRepresentation) the passed index is
+ * falling.
+ *
+ * @param index the index to find event for
+ * @return the pair of startIndex, Event in whose range index falls
+ */
+ private Map.Entry<Integer, Event> getEventForIndex(int index)
+ {
+ // iterate through all the mappings, for start index and event
+ Iterator<Map.Entry<Integer, Event>> rangeIt =
eventsMapping.entrySet().iterator();
+ Map.Entry<Integer, Event> range = rangeIt.next();
+ while (rangeIt.hasNext() && range.getKey() < index) {
+ // while there is a next event and the index to find is after behind the end
position, try the next range
+ range = rangeIt.next();
+ }
+ return range;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.rendering.listener.QueueListener#consumeEvents(org.xwiki.rendering.listener.Listener)
+ */
+ @Override
+ public void consumeEvents(Listener listener)
+ {
+ if (listener instanceof AnnotationListener) {
+ consumeAnnotationEvents((AnnotationListener) listener);
+ } else {
+ super.consumeEvents(listener);
+ }
+ }
+
+ /**
+ * Helper function to consume the events queued in this listener with annotation
awareness, i.e. send annotation
+ * events to the passed listener.
+ *
+ * @param listener the annotation listener to send the annotation events to
+ */
+ private void consumeAnnotationEvents(AnnotationListener listener)
+ {
+ // FIXME: take annotation offsets into account and split events
+ while (!isEmpty()) {
+ Event event = remove();
+ // annotations starting before
+ if (startEvents.get(event) != null) {
+ for (Annotation startAnn : startEvents.get(event)) {
+ listener.beginAnnotation(startAnn);
+ }
+ }
+ event.eventType.fireEvent(listener, event.eventParameters);
+ // annotations ending after
+ if (endEvents.get(event) != null) {
+ for (Annotation endAnn : endEvents.get(event)) {
+ listener.endAnnotation(endAnn);
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.rendering.listener.chaining.ChainingListener#getListenerChain()
+ */
+ public ListenerChain getListenerChain()
+ {
+ return chain;
+ }
+
+ /**
+ * Sets the collections of annotations to identify on the listened content and send
notifications for.
+ *
+ * @param annotations the collection of annotations to generate events for
+ */
+ public void setAnnotations(Collection<Annotation> annotations)
+ {
+ this.annotations = annotations;
+ }
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/AnnotationGeneratorChainingListener.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationChainingPrintRenderer.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationChainingPrintRenderer.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationChainingPrintRenderer.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,94 @@
+/*
+ * 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.annotation.internal.renderer;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.xwiki.annotation.Annotation;
+import org.xwiki.annotation.renderer.AnnotationChainingPrintRenderer;
+import org.xwiki.rendering.internal.renderer.xhtml.XHTMLChainingRenderer;
+import org.xwiki.rendering.listener.chaining.ListenerChain;
+import org.xwiki.rendering.renderer.xhtml.XHTMLImageRenderer;
+import org.xwiki.rendering.renderer.xhtml.XHTMLLinkRenderer;
+
+/**
+ * Extends the default XHTML renderer to add handling of annotations.<br />
+ * FIXME: this implementation is a very simple handling of annotation events, it should
handle annotation markers
+ * splitting & nesting in other elements.
+ *
+ * @version $Id$
+ */
+public class XHTMLAnnotationChainingPrintRenderer extends XHTMLChainingRenderer
implements
+ AnnotationChainingPrintRenderer
+{
+ /**
+ * The annotation marker element in HTML.
+ */
+ private static final String ANNOTATION_MARKER = "span";
+
+ /**
+ * Constructor from super class.
+ *
+ * @param linkRenderer the renderer for links
+ * @param imageRenderer the renderer for images
+ * @param listenerChain the listener chain in which to add this listener
+ */
+ public XHTMLAnnotationChainingPrintRenderer(XHTMLLinkRenderer linkRenderer,
XHTMLImageRenderer imageRenderer,
+ ListenerChain listenerChain)
+ {
+ super(linkRenderer, imageRenderer, listenerChain);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.annotation.renderer.AnnotationListener#beginAnnotation(Annotation)
+ */
+ public void beginAnnotation(Annotation annotation)
+ {
+ Map<String, String> attributes = new LinkedHashMap<String,
String>();
+
+ attributes.put("class", createAnnotationClass(annotation.getId()));
why don't you put the annotationId as an id instead of class if it's a
unique id ?
+ attributes.put("title",
annotation.getAnnotation().toString());
I generally try to avoid as much as possible using Object#toString()
for anything else that debugging. If Annotation officially has a title
it should have a getTitle() method or something like that.
+
getXHTMLWikiPrinter().printXMLStartElement(ANNOTATION_MARKER, attributes);
+ }
+
+ /**
+ * Creates the class value of the annotation.
+ *
+ * @param annotationId the id of the annotation
+ * @return the class value for the passed annotation
+ */
+ private String createAnnotationClass(int annotationId)
+ {
+ return "annotation ID" + annotationId;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.annotation.renderer.AnnotationListener#endAnnotation(Annotation)
+ */
+ public void endAnnotation(Annotation annotation)
+ {
+ getXHTMLWikiPrinter().printXMLEndElement(ANNOTATION_MARKER);
+ }
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationChainingPrintRenderer.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationRenderer.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationRenderer.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationRenderer.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,68 @@
+/*
+ * 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.annotation.internal.renderer;
+
+import org.xwiki.annotation.renderer.AbstractAnnotationRenderer;
+import org.xwiki.annotation.renderer.AnnotationChainingPrintRenderer;
+import org.xwiki.component.annotation.Component;
+import org.xwiki.component.annotation.InstantiationStrategy;
+import org.xwiki.component.annotation.Requirement;
+import org.xwiki.component.descriptor.ComponentInstantiationStrategy;
+import org.xwiki.rendering.listener.chaining.ListenerChain;
+import org.xwiki.rendering.renderer.xhtml.XHTMLImageRenderer;
+import org.xwiki.rendering.renderer.xhtml.XHTMLLinkRenderer;
+
+/**
+ * Renders annotations in the XHTML format.
+ *
+ * @version $Id$
+ */
+(a)Component("annotations/xhtml/1.0")
You should not use / in the syntax name since it's the syntax
name/syntax version separator also AnnotatedXHTMLBlockRenderer use
"annotatedxhtml/1.0" so it's not consistant
+(a)InstantiationStrategy(ComponentInstantiationStrategy.PER_LOOKUP)
+public class XHTMLAnnotationRenderer extends AbstractAnnotationRenderer
+{
+ /**
+ * To render link events into XHTML. This is done so that it's pluggable because
link rendering depends on how the
+ * underlying system wants to handle it. For example for XWiki we check if the
document exists, we get the document
+ * URL, etc.
+ */
+ @Requirement
+ private XHTMLLinkRenderer linkRenderer;
+
+ /**
+ * To render image events into XHTML. This is done so that it's pluggable
because image rendering depends on how the
+ * underlying system wants to handle it. For example for XWiki we check if the image
exists as a document
+ * attachments, we get its URL, etc.
+ */
+ @Requirement
+ private XHTMLImageRenderer imageRenderer;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.annotation.renderer.AbstractAnnotationRenderer#getAnnotationPrintRenderer(ListenerChain)
+ */
+ @Override
+ public AnnotationChainingPrintRenderer getAnnotationPrintRenderer(ListenerChain
chain)
+ {
+ return new XHTMLAnnotationChainingPrintRenderer(linkRenderer, imageRenderer,
chain);
+ }
+
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/internal/renderer/XHTMLAnnotationRenderer.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AbstractAnnotationRenderer.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AbstractAnnotationRenderer.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AbstractAnnotationRenderer.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,107 @@
+/*
+ * 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.annotation.renderer;
+
+import java.util.Collection;
+
+import org.xwiki.annotation.Annotation;
+import org.xwiki.annotation.content.ContentAlterer;
+import org.xwiki.annotation.internal.renderer.AnnotationGeneratorChainingListener;
+import org.xwiki.component.annotation.Requirement;
+import org.xwiki.component.phase.Initializable;
+import org.xwiki.component.phase.InitializationException;
+import org.xwiki.rendering.listener.chaining.EmptyBlockChainingListener;
+import org.xwiki.rendering.listener.chaining.ListenerChain;
+import org.xwiki.rendering.renderer.AbstractChainingPrintRenderer;
+import org.xwiki.rendering.renderer.LinkLabelGenerator;
+
+/**
+ * Abstract class for annotation renderer, any specific syntax renderer should implement
this class and provide the
+ * specific annotation listener.
+ *
+ * @version $Id$
+ */
+public abstract class AbstractAnnotationRenderer extends AbstractChainingPrintRenderer
implements Initializable,
+ AnnotationPrintRenderer
+{
+ /**
+ * The link label generator for this renderer.
+ */
+ @Requirement
+ protected LinkLabelGenerator linkLabelGenerator;
+
+ /**
+ * Selection cleaner so that the selection can be mapped on the content. <br
/>
+ * TODO: not really sure if this is the right place for this pull, but the
annotations generator is not a component
+ * so it cannot 'require' it.
+ */
+ @Requirement("whitespace")
+ protected ContentAlterer selectionAlterer;
+
+ /**
+ * The annotations generator listener to use in this renderer.
+ */
+ private AnnotationGeneratorChainingListener annotationsGenerator;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.component.phase.Initializable#initialize()
+ */
+ public void initialize() throws InitializationException
+ {
+ ListenerChain chain = new ListenerChain();
+ setListenerChain(chain);
+
+ // Construct the listener chain in the right order. Listeners early in the chain
are called before listeners
+ // placed later in the chain.
+ chain.addListener(this);
+ chain.addListener(new EmptyBlockChainingListener(chain));
+ // will generate annotation events to the next listener in chain
+
+ // TODO: could also have the annotation listener passed to the
annotationgenerator chaininglistener (which would
+ // become a print renderer and delegate all printing functions to the aggregated
annotation print renderer).
+ // All buffered events will be consumed to this aggregated listener. This way
the next element in chain is
+ // better coupled in the listener that knows how to send such events and we
don't need to test in the annotation
+ // generator that the next listener in the chain can receive annotation events.
However I like the chaining idea
+ // more (because one could add any number of other annotation listeners after
this generator in the chain).
+ annotationsGenerator = new
AnnotationGeneratorChainingListener(linkLabelGenerator, selectionAlterer, chain);
+ chain.addListener(annotationsGenerator);
+ // the actual annotations renderer
+ chain.addListener(getAnnotationPrintRenderer(chain));
+ }
+
+ /**
+ * @param chain the chain in which the renderer needs to be added.
+ * @return the annotation listener to which the annotation events generated by this
renderer should be sent (the
+ * actual renderer of annotated content)
+ */
+ public abstract AnnotationChainingPrintRenderer
getAnnotationPrintRenderer(ListenerChain chain);
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.annotation.renderer.AnnotationPrintRenderer#setAnnotations(java.util.Collection)
+ */
+ public void setAnnotations(Collection<Annotation> annotations)
+ {
+ this.annotationsGenerator.setAnnotations(annotations);
+ }
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AbstractAnnotationRenderer.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationChainingPrintRenderer.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationChainingPrintRenderer.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationChainingPrintRenderer.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,34 @@
+/*
+ * 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.annotation.renderer;
+
+import org.xwiki.rendering.listener.chaining.ChainingListener;
+import org.xwiki.rendering.renderer.PrintRenderer;
+
+/**
+ * Define the chaining annotation print renderer. To be implemented by extending a
ChainingPrintRenderer and
+ * implementing the functions in the {@link AnnotationListener} interface.
+ *
+ * @version $Id$
+ */
+public interface AnnotationChainingPrintRenderer extends AnnotationListener,
ChainingListener, PrintRenderer
+{
+
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationChainingPrintRenderer.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationListener.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationListener.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationListener.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,49 @@
+/*
+ * 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.annotation.renderer;
+
+import org.xwiki.annotation.Annotation;
+import org.xwiki.rendering.listener.Listener;
+
+/**
+ * Extends the standard XWiki events listener by adding a set of events for start and
end of an annotation.
+ *
+ * @version $Id$
+ */
+public interface AnnotationListener extends Listener
+{
+ /**
+ * Signals the start of an annotation. Note that this event will only be fired once,
splitting the annotation
+ * markers in multiple pieces and correctly imbricating them in the rendered syntax
(such as multiple spans across
+ * multiple block elements in the XHTML renderer) is the responsibility of the
renderer.
+ *
+ * @param annotation the annotation whose selected text starts
+ */
+ void beginAnnotation(Annotation annotation);
+
+ /**
+ * Signals the end of an annotation. Note that this event will only be fired once,
splitting the annotation markers
+ * in multiple pieces and correctly imbricating them in the rendered syntax (such as
multiple spans across multiple
+ * block elements in the XHTML renderer) is the responsibility of the renderer.
+ *
+ * @param annotation the annotation whose selected text ends
+ */
+ void endAnnotation(Annotation annotation);
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationListener.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationPrintRenderer.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationPrintRenderer.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationPrintRenderer.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,42 @@
+/*
+ * 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.annotation.renderer;
+
+import java.util.Collection;
+
+import org.xwiki.annotation.Annotation;
+import org.xwiki.component.annotation.ComponentRole;
+import org.xwiki.rendering.renderer.PrintRenderer;
+
+/**
+ * An annotations print renderer is a {@link PrintRenderer} that also renders
annotations on the content.
+ *
+ * @version $Id$
+ */
+@ComponentRole
+public interface AnnotationPrintRenderer extends PrintRenderer
+{
+ /**
+ * Sets the annotations to render on the content.
+ *
+ * @param annotations the collection of annotations to render
+ */
+ void setAnnotations(Collection<Annotation> annotations);
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/java/org/xwiki/annotation/renderer/AnnotationPrintRenderer.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Modified:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/resources/META-INF/components.txt
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/resources/META-INF/components.txt
2009-12-04 15:18:58 UTC (rev 25543)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/main/resources/META-INF/components.txt
2009-12-04 15:25:46 UTC (rev 25544)
@@ -1,5 +1,8 @@
org.xwiki.annotation.internal.DefaultAnnotationService
org.xwiki.annotation.internal.content.XWiki20SyntaxContentAlterer
+org.xwiki.annotation.internal.content.WhiteSpaceContentAlterer
org.xwiki.annotation.internal.content.filter.XWiki20SyntaxFilter
+org.xwiki.annotation.internal.content.filter.WhiteSpaceFilter
org.xwiki.annotation.internal.target.DefaultDocumentContentTarget
-org.xwiki.annotation.internal.selection.DefaultSelectionService
\ No newline at end of file
+org.xwiki.annotation.internal.selection.DefaultSelectionService
+org.xwiki.annotation.internal.renderer.XHTMLAnnotationRenderer
\ No newline at end of file
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/content/WhiteSpaceContentAltererTest.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/content/WhiteSpaceContentAltererTest.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/content/WhiteSpaceContentAltererTest.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,105 @@
+/*
+ * 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.annotation.content;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.xwiki.test.AbstractComponentTestCase;
+
+/**
+ * @version $Id$
+ */
+(a)RunWith(Parameterized.class)
+public class WhiteSpaceContentAltererTest extends AbstractComponentTestCase
+{
+ /**
+ * The initial String to alter.
+ */
+ private String initial;
+
+ /**
+ * The expected altered string.
+ */
+ private String altered;
+
+ /**
+ * The content alterer to test.
+ */
+ private ContentAlterer alterer;
+
+ /**
+ * @param initial the original string
+ * @param altered the altered string after being whitespace filtered
+ */
+ public WhiteSpaceContentAltererTest(String initial, String altered)
+ {
+ this.initial = initial;
+ this.altered = altered;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.test.AbstractComponentTestCase#setUp()
+ */
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ alterer = getComponentManager().lookup(ContentAlterer.class,
"whitespace");
+ }
+
+ /**
+ * @return list of corpus files to instantiate tests for
+ */
+ @Parameters
+ public static Collection<String[]> data()
+ {
+ Collection<String[]> params = new ArrayList<String[]>();
+ // unbreakable space
+ params.add(new String[] {"not to be", "nottobe"});
+ // tabs
+ params.add(new String[] {"to be or not\tto be",
"tobeornottobe"});
+ // commas, signs with regular spaces
+ params.add(new String[] {"roses, see I in her cheeks;",
"roses,seeIinhercheeks;"});
+ // new lines
+ params.add(new String[] {"eyes nothing\nlike the sun",
"eyesnothinglikethesun"});
+ // new line carriage return
+ params.add(new String[] {"eyes\n\rnothing",
"eyesnothing"});
+ return params;
+ }
+
+ /**
+ * Tests that the content alterer filters correctly the characters out of the
Strings.
+ */
+ @Test
+ public void testFiltering()
+ {
+ AlteredContent alteredContent = alterer.alter(initial);
+ assertEquals(altered, alteredContent.getContent().toString());
+ }
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/content/WhiteSpaceContentAltererTest.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
Added:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/renderer/XHTMLAnnotationRendererTest.java
===================================================================
---
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/renderer/XHTMLAnnotationRendererTest.java
(rev 0)
+++
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/renderer/XHTMLAnnotationRendererTest.java
2009-12-04 15:25:46 UTC (rev 25544)
@@ -0,0 +1,166 @@
+/*
+ * 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.annotation.renderer;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.xwiki.annotation.TestDocumentFactory;
+import org.xwiki.rendering.block.XDOM;
+import org.xwiki.rendering.parser.Parser;
+import org.xwiki.rendering.renderer.printer.DefaultWikiPrinter;
+import org.xwiki.rendering.renderer.printer.WikiPrinter;
+import org.xwiki.rendering.syntax.Syntax;
+import org.xwiki.rendering.transformation.TransformationManager;
+import org.xwiki.test.AbstractComponentTestCase;
+
+/**
+ * Renderer tests for the XHTML annotations renderer, from the test files.
+ *
+ * @version $Id$
+ */
+(a)RunWith(Parameterized.class)
+public class XHTMLAnnotationRendererTest extends AbstractComponentTestCase
+{
+ /**
+ * Document description files to run this test for.
+ */
+ private static Collection<String[]> files = new ArrayList<String[]>();
+
+ /**
+ * The annotations renderer hint.
+ */
+ private static final String ANNOTATIONS_RENDERER_HINT =
"annotations/xhtml/1.0";
+
+ /**
+ * Mock document to run tests for.
+ */
+ protected String docName;
+
+ static {
+ // FIXME: checkstyle is so gonna shout when this will be longer than 30 files
+ addFileToTest("Document1");
+ addFileToTest("Document2");
+ addFileToTest("Document3");
+ addFileToTest("Document4");
+ addFileToTest("Document5");
+ addFileToTest("Document6");
+ addFileToTest("Document7");
+ addFileToTest("Document8");
+ addFileToTest("Document9");
+ addFileToTest("Document10");
+ addFileToTest("Document11");
+ addFileToTest("Document12");
+ addFileToTest("Document13");
+ addFileToTest("Document14");
+ addFileToTest("Document15");
+ addFileToTest("Document16");
+ addFileToTest("Document17");
+ addFileToTest("Document18");
+ }
+
+ /**
+ * Creates a test for the passed document. Will be instantiated by the parameterized
runner for all the parameters.
+ *
+ * @param docName the document (and corpus filename) to run tests for
+ */
+ public XHTMLAnnotationRendererTest(String docName)
+ {
+ this.docName = docName;
+ }
+
+ /**
+ * Adds a file to the list of files to run tests for.
+ *
+ * @param docName the name of the document / file to test
+ */
+ private static void addFileToTest(String docName)
+ {
+ files.add(new String[] {docName});
+ }
+
+ /**
+ * @return list of corpus files to instantiate tests for
+ */
+ @Parameters
+ public static Collection<String[]> data()
+ {
+ return files;
+ }
+
+ /**
+ * Test rendering the annotations in the document description file results in the
annotated html.
+ *
+ * @throws Exception in case something goes wrong looking up components and
rendering
+ */
+ @Test
+ public void getAnnotatedHTML() throws Exception
+ {
+ Parser parser = getComponentManager().lookup(Parser.class,
Syntax.XWIKI_2_0.toIdString());
+ XDOM xdom = parser.parse(new
StringReader(TestDocumentFactory.getDocument(docName).getSource()));
+
+ // run transformations
+ TransformationManager transformationManager =
getComponentManager().lookup(TransformationManager.class);
+ transformationManager.performTransformations(xdom, Syntax.XWIKI_2_0);
+
+ AnnotationPrintRenderer renderer =
+ getComponentManager().lookup(AnnotationPrintRenderer.class,
ANNOTATIONS_RENDERER_HINT);
+ WikiPrinter printer = new DefaultWikiPrinter();
+ renderer.setPrinter(printer);
+ // set the annotations for this renderer
+
renderer.setAnnotations(TestDocumentFactory.getDocument(docName).getSafeAnnotations());
+
+ xdom.traverse(renderer);
+
+ assertEquals(TestDocumentFactory.getDocument(docName).getAnnotatedContent(),
printer.toString());
+ }
+
+ /**
+ * Test rendering with the annotations renderer but without annotations doesn't
alter the content.
+ *
+ * @throws Exception in case something goes wrong looking up components and
rendering
+ */
+ @Test
+ public void getAnnotatedHTMLWithoutAnnotations() throws Exception
+ {
+ Parser parser = getComponentManager().lookup(Parser.class,
Syntax.XWIKI_2_0.toIdString());
+ XDOM xdom = parser.parse(new
StringReader(TestDocumentFactory.getDocument(docName).getSource()));
+
+ // run transformations
+ TransformationManager transformationManager =
getComponentManager().lookup(TransformationManager.class);
+ transformationManager.performTransformations(xdom, Syntax.XWIKI_2_0);
+
+ AnnotationPrintRenderer renderer =
+ getComponentManager().lookup(AnnotationPrintRenderer.class,
ANNOTATIONS_RENDERER_HINT);
+ WikiPrinter printer = new DefaultWikiPrinter();
+ renderer.setPrinter(printer);
+
+ xdom.traverse(renderer);
+
+ assertEquals(TestDocumentFactory.getDocument(docName).getRenderedContent(),
printer.toString());
+ }
+}
Property changes on:
contrib/sandbox/xwiki-annotation-parent/xwiki-annotation-core/src/test/java/org/xwiki/annotation/renderer/XHTMLAnnotationRendererTest.java
___________________________________________________________________
Name: svn:keywords
+ Author Id Revision HeadURL
Name: svn:eol-style
+ native
_______________________________________________
notifications mailing list
notifications(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/notifications
--
Thomas Mortagne