On Sep 13, 2010, at 10:09 AM, Vincent Massol wrote:
>
> On Sep 12, 2010, at 1:30 PM, mflorea (SVN) wrote:
>
>> Author: mflorea
>> Date: 2010-09-12 13:30:15 +0200 (Sun, 12 Sep 2010)
>> New Revision: 31053
>>
>> Modified:
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/configuration/RenderingConfiguration.java
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/configuration/DefaultRenderingConfiguration.java
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/renderer/xhtml/DefaultXHTMLImageRenderer.java
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/wiki/WikiModel.java
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/pom.xml
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfiguration.java
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfigurationTest.java
>>
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/wiki/XWikiWikiModelTest.java
>> Log:
>> XWIKI-5479: Include image dimensions in the image URL for server side image
>> resizing
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/configuration/RenderingConfiguration.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/configuration/RenderingConfiguration.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/configuration/RenderingConfiguration.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -50,7 +50,7 @@
>> * </ul>
>> * Note that if the page title is empty or not defined then it defaults
>> to %p. This is also the case
>> * if the title cannot be retrieved for the document.
>> - *
>> + *
>> * The default is "%p". Some examples: "%s.%p", "%w:%s.%p".
>> *
>> * @return the format to use to display link labels when the user hasn't
>> specified a label
>> @@ -63,4 +63,42 @@
>> * descriptor (ie defined by the macro author) will be used
>> */
>> Properties getMacroCategories();
>> +
>> + /**
>> + * @return {...@code true} to include the image dimensions extracted
>> from the image parameters in the image URL,
>> + * {...@code false} otherwise; when image dimensions are
>> included in the image URL the image can be resized
>> + * on the server side before being downloaded.
>> + * @since 2.5M2
>> + */
>> + boolean isIncludeImageDimensionsInImageURL();
>
> I think is should be better named:
>
> isImageDimensionsIncludedInImageURL()
>
> I haven't followed too much but why do we need a flag for this? Why not
> always have the dimensions in the URL?
BTW how do I render an image that I want to resize in the browser but without
resizing it on the server?
For ex, if I want the image to be displayed in the page but I also want to be
able to give a URL to the full size image?
Thanks
-Vincent
>
> Also, I agree with Thomas that this config should be internal to the xwiki
> implementation and not generic to all implementations.
>
> Thanks
> -Vincent
>
>> +
>> + /**
>> + * One way to improve page load speed is to resize images on the server
>> side just before rendering the page. The
>> + * rendering module can use the image width provided by the user to
>> scale the image. When the user doesn't specify
>> + * the image width the rendering module can limit the width of the
>> image based on this configuration parameter.
>> + * <p>
>> + * The default value is {...@code -1} which means image width is not
>> limited by default. Use a value greater than 0 to
>> + * limit the image width (pixels). Note that the aspect ratio is kept
>> even when both the width and the height of the
>> + * image are limited.
>> + *
>> + * @return the maximum image width when there's no user supplied width
>> + * @see #isIncludeImageDimensionsInImageURL()
>> + * @since 2.5M2
>> + */
>> + int getImageWidthLimit();
>> +
>> + /**
>> + * One way to improve page load speed is to resize images on the server
>> side just before rendering the page. The
>> + * rendering module can use the image height provided by the user to
>> scale the image. When the user doesn't specify
>> + * the image height the rendering module can limit the height of the
>> image based on this configuration parameter.
>> + * <p>
>> + * The default value is {...@code -1} which means image height is not
>> limited by default. Use a value greater than 0 to
>> + * limit the image height (pixels). Note that the aspect ratio is kept
>> even when both the width and the height of
>> + * the image are limited.
>> + *
>> + * @return the maximum image height when there's no user supplied height
>> + * @see #isIncludeImageDimensionsInImageURL()
>> + * @since 2.5M2
>> + */
>> + int getImageHeightLimit();
>> }
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/configuration/DefaultRenderingConfiguration.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/configuration/DefaultRenderingConfiguration.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/configuration/DefaultRenderingConfiguration.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -45,6 +45,21 @@
>> private Properties macroCategories = new Properties();
>>
>> /**
>> + * @see #getImageWidthLimit()
>> + */
>> + private int imageWidthLimit = -1;
>> +
>> + /**
>> + * @see #getImageHeightLimit()
>> + */
>> + private int imageHeightLimit = -1;
>> +
>> + /**
>> + * @see #isIncludeImageDimensionsInImageURL()
>> + */
>> + private boolean includeImageDimensionsInImageURL = true;
>> +
>> + /**
>> * {...@inheritdoc}
>> *
>> * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#getLinkLabelFormat()
>> @@ -84,4 +99,66 @@
>> // to work even without a configuration store.
>> this.macroCategories.setProperty(macroId.toString(), category);
>> }
>> +
>> + /**
>> + * {...@inheritdoc}
>> + *
>> + * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#getImageWidthLimit()
>> + */
>> + public int getImageWidthLimit()
>> + {
>> + return this.imageWidthLimit;
>> + }
>> +
>> + /**
>> + * @param imageWidthLimit the maximum image width when there's no user
>> supplied width
>> + */
>> + public void setImageWidthLimit(int imageWidthLimit)
>> + {
>> + // This method is useful for those using the XWiki Rendering in
>> standalone mode since it allows the rendering
>> + // to work even without a configuration store.
>> + this.imageWidthLimit = imageWidthLimit;
>> + }
>> +
>> + /**
>> + * {...@inheritdoc}
>> + *
>> + * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#getImageHeightLimit()
>> + */
>> + public int getImageHeightLimit()
>> + {
>> + return this.imageHeightLimit;
>> + }
>> +
>> + /**
>> + * @param imageHeightLimit the maximum image height when there's no
>> user supplied height
>> + */
>> + public void setImageHeightLimit(int imageHeightLimit)
>> + {
>> + // This method is useful for those using the XWiki Rendering in
>> standalone mode since it allows the rendering
>> + // to work even without a configuration store.
>> + this.imageHeightLimit = imageHeightLimit;
>> + }
>> +
>> + /**
>> + * {...@inheritdoc}
>> + *
>> + * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#isIncludeImageDimensionsInImageURL()
>> + */
>> + public boolean isIncludeImageDimensionsInImageURL()
>> + {
>> + return this.includeImageDimensionsInImageURL;
>> + }
>> +
>> + /**
>> + * @param includeImageDimensionsInImageURL {...@code true} to include
>> image dimensions extracted from the image
>> + * parameters in the image URL so that the image can be
>> resized on the server side before being
>> + * downloaded, {...@code false} otherwise
>> + */
>> + public void setIncludeImageDimensionsInImageURL(boolean
>> includeImageDimensionsInImageURL)
>> + {
>> + // This method is useful for those using the XWiki Rendering in
>> standalone mode since it allows the rendering
>> + // to work even without a configuration store.
>> + this.includeImageDimensionsInImageURL =
>> includeImageDimensionsInImageURL;
>> + }
>> }
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/renderer/xhtml/DefaultXHTMLImageRenderer.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/renderer/xhtml/DefaultXHTMLImageRenderer.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/internal/renderer/xhtml/DefaultXHTMLImageRenderer.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -42,10 +42,9 @@
>> * Default implementation for rendering images as XHTML. We handle both cases:
>> * <ul>
>> * <li>when inside a wiki (ie when an implementation of {...@link WikiModel}
>> is provided.</li>
>> - * <li>when outside of a wiki. In this case we only handle external images
>> and document images don't
>> - * display anything.</li>
>> + * <li>when outside of a wiki. In this case we only handle external images
>> and document images don't display anything.</li>
>> * </ul>
>> - *
>> + *
>> * @version $Id$
>> * @since 2.0M3
>> */
>> @@ -68,6 +67,7 @@
>>
>> /**
>> * {...@inheritdoc}
>> + *
>> * @see Initializable#initialize()
>> */
>> public void initialize() throws InitializationException
>> @@ -83,7 +83,7 @@
>>
>> /**
>> * {...@inheritdoc}
>> - *
>> + *
>> * @see XHTMLImageRenderer#setXHTMLWikiPrinter(XHTMLWikiPrinter)
>> */
>> public void setXHTMLWikiPrinter(XHTMLWikiPrinter printer)
>> @@ -103,7 +103,7 @@
>>
>> /**
>> * {...@inheritdoc}
>> - *
>> + *
>> * @see XHTMLImageRenderer#onImage(Image, boolean, Map)
>> */
>> public void onImage(Image image, boolean isFreeStandingURI, Map<String,
>> String> parameters)
>> @@ -118,8 +118,9 @@
>> // that would not honor this contract.
>> if (this.wikiModel != null) {
>> DocumentImage documentImage = DocumentImage.class.cast(image);
>> - imageURL =
>> this.wikiModel.getAttachmentURL(documentImage.getDocumentName(),
>> - documentImage.getAttachmentName());
>> + imageURL =
>> +
>> this.wikiModel.getImageURL(documentImage.getDocumentName(),
>> documentImage.getAttachmentName(),
>> + parameters);
>> } else {
>> throw new RuntimeException("Invalid Image type. In non wiki
>> mode, all image types must be URL images.");
>> }
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/wiki/WikiModel.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/wiki/WikiModel.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-api/src/main/java/org/xwiki/rendering/wiki/WikiModel.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -19,13 +19,15 @@
>> */
>> package org.xwiki.rendering.wiki;
>>
>> +import java.util.Map;
>> +
>> import org.xwiki.component.annotation.ComponentRole;
>>
>> /**
>> * Bridge between the Rendering module and a Wiki Model. Contains wiki APIs
>> required by Rendering classes such as
>> - * Renderers. For example the XHTML Link Renderer needs to know if a wiki
>> document exists in order to know how to
>> - * generate the HTML (in order to display a question mark for non existing
>> documents) and it also needs to get the
>> - * URL pointing the wiki document.
>> + * Renderers. For example the XHTML Link Renderer needs to know if a wiki
>> document exists in order to know how to
>> + * generate the HTML (in order to display a question mark for non existing
>> documents) and it also needs to get the URL
>> + * pointing the wiki document.
>> *
>> * @version $Id$
>> * @since 2.0M1
>> @@ -34,36 +36,48 @@
>> public interface WikiModel
>> {
>> /**
>> - * @param documentName the document name of the document containing the
>> attachment. The syntax used depends on
>> - * the underlying wiki system used. For example for XWiki a
>> valid documentName would be
>> - * {...@code wiki:Space.Page}
>> + * @param documentName the document name of the document containing the
>> attachment. The syntax used depends on the
>> + * underlying wiki system used. For example for XWiki a
>> valid documentName would be
>> + * {...@code wiki:Space.Page}
>> * @param attachmentName the name of the attachment in the passed
>> document wikip page
>> * @return the URL to the attachment
>> */
>> String getAttachmentURL(String documentName, String attachmentName);
>>
>> /**
>> - * @param documentName the document name as a String. The syntax used
>> depends on
>> - * the underlying wiki system used. For example for XWiki a
>> valid documentName would be
>> - * {...@code wiki:Space.Page}
>> + * Generate image specific URL. The difference with {...@link
>> #getAttachmentURL(String, String)} is that in some
>> + * implementation we want to make a distinction between displayed image
>> and a simple link targeting an attachment
>> + * file.
>> + *
>> + * @param documentName the document name of the document containing the
>> attachment. The syntax used depends on the
>> + * underlying wiki system used. For example for XWiki a
>> valid documentName would be
>> + * {...@code wiki:Space.Page}
>> + * @param attachmentName the name of the attachment in the passed
>> document wiki page
>> + * @param parameters custom parameters
>> + * @return the URL to the image
>> + * @since 2.5M2
>> + */
>> + String getImageURL(String documentName, String attachmentName,
>> Map<String, String> parameters);
>> +
>> + /**
>> + * @param documentName the document name as a String. The syntax used
>> depends on the underlying wiki system used.
>> + * For example for XWiki a valid documentName would be
>> {...@code wiki:Space.Page}
>> * @return true if the document exists and can be viewed or false
>> otherwise
>> */
>> boolean isDocumentAvailable(String documentName);
>>
>> /**
>> - * @param documentName the document name as a String. The syntax used
>> depends on
>> - * the underlying wiki system used. For example for XWiki a
>> valid documentName would be
>> - * {...@code wiki:Space.Page}
>> + * @param documentName the document name as a String. The syntax used
>> depends on the underlying wiki system used.
>> + * For example for XWiki a valid documentName would be
>> {...@code wiki:Space.Page}
>> * @param anchor an anchor pointing to some place inside the document or
>> null
>> * @param queryString a query string specifying some parameters or null
>> * @return the URL to view the specified wiki document
>> */
>> String getDocumentViewURL(String documentName, String anchor, String
>> queryString);
>> -
>> +
>> /**
>> - * @param documentName the document name as a String. The syntax used
>> depends on
>> - * the underlying wiki system used. For example for XWiki a
>> valid documentName would be
>> - * {...@code wiki:Space.Page}
>> + * @param documentName the document name as a String. The syntax used
>> depends on the underlying wiki system used.
>> + * For example for XWiki a valid documentName would be
>> {...@code wiki:Space.Page}
>> * @param anchor an anchor pointing to some place inside the document or
>> null
>> * @param queryString a query string specifying some parameters or null
>> * @return the URL to edit the specified wiki document
>>
>> Modified: platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/pom.xml
>> ===================================================================
>> --- platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/pom.xml
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++ platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/pom.xml
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -54,6 +54,12 @@
>> <artifactId>xwiki-core-script</artifactId>
>> <version>${pom.version}</version>
>> </dependency>
>> + <dependency>
>> + <!-- For parsing the CSS from the style attribute. -->
>> + <groupId>net.sourceforge.cssparser</groupId>
>> + <artifactId>cssparser</artifactId>
>> + <version>0.9.5</version>
>> + </dependency>
>> <!-- Testing dependencies -->
>> <dependency>
>> <groupId>org.xwiki.platform</groupId>
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfiguration.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfiguration.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfiguration.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -19,13 +19,13 @@
>> */
>> package org.xwiki.rendering.internal.configuration;
>>
>> +import java.util.Properties;
>> +
>> import org.xwiki.component.annotation.Component;
>> import org.xwiki.component.annotation.Requirement;
>> import org.xwiki.configuration.ConfigurationSource;
>> import org.xwiki.rendering.configuration.RenderingConfiguration;
>>
>> -import java.util.Properties;
>> -
>> /**
>> * All configuration options for the rendering subsystem.
>> *
>> @@ -46,7 +46,7 @@
>> private static final String DEFAULT_LINK_LABEL_FORMAT = "%p";
>>
>> /**
>> - * Defines from where to read the rendering configuration data.
>> + * Defines from where to read the rendering configuration data.
>> */
>> @Requirement
>> private ConfigurationSource configuration;
>> @@ -58,16 +58,46 @@
>> */
>> public String getLinkLabelFormat()
>> {
>> - return this.configuration.getProperty(PREFIX + "linkLabelFormat",
>> DEFAULT_LINK_LABEL_FORMAT);
>> + return this.configuration.getProperty(PREFIX + "linkLabelFormat",
>> DEFAULT_LINK_LABEL_FORMAT);
>> }
>>
>> /**
>> * {...@inheritdoc}
>> - *
>> + *
>> * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#getMacroCategories()
>> */
>> public Properties getMacroCategories()
>> {
>> return this.configuration.getProperty(PREFIX + "macroCategories",
>> Properties.class);
>> }
>> +
>> + /**
>> + * {...@inheritdoc}
>> + *
>> + * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#getImageWidthLimit()
>> + */
>> + public int getImageWidthLimit()
>> + {
>> + return this.configuration.getProperty(PREFIX + "imageWidthLimit",
>> -1);
>> + }
>> +
>> + /**
>> + * {...@inheritdoc}
>> + *
>> + * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#getImageHeightLimit()
>> + */
>> + public int getImageHeightLimit()
>> + {
>> + return this.configuration.getProperty(PREFIX + "imageHeightLimit",
>> -1);
>> + }
>> +
>> + /**
>> + * {...@inheritdoc}
>> + *
>> + * @see
>> org.xwiki.rendering.configuration.RenderingConfiguration#isIncludeImageDimensionsInImageURL()
>> + */
>> + public boolean isIncludeImageDimensionsInImageURL()
>> + {
>> + return this.configuration.getProperty(PREFIX +
>> "includeImageDimensionsInImageURL", true);
>> + }
>> }
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -19,17 +19,25 @@
>> */
>> package org.xwiki.rendering.internal.wiki;
>>
>> +import java.io.IOException;
>> +import java.io.StringReader;
>> import java.io.UnsupportedEncodingException;
>> import java.net.URLEncoder;
>> +import java.util.Map;
>>
>> import org.apache.commons.lang.StringUtils;
>> +import org.w3c.css.sac.InputSource;
>> +import org.w3c.dom.css.CSSStyleDeclaration;
>> import org.xwiki.bridge.DocumentAccessBridge;
>> -import org.xwiki.model.reference.DocumentReference;
>> import org.xwiki.component.annotation.Component;
>> import org.xwiki.component.annotation.Requirement;
>> +import org.xwiki.model.reference.DocumentReference;
>> import org.xwiki.model.reference.EntityReferenceSerializer;
>> +import org.xwiki.rendering.configuration.RenderingConfiguration;
>> import org.xwiki.rendering.wiki.WikiModel;
>>
>> +import com.steadystate.css.parser.CSSOMParser;
>> +
>> /**
>> * Implementation using the Document Access Bridge ({...@link
>> DocumentAccessBridge}).
>> *
>> @@ -39,14 +47,47 @@
>> @Component
>> public class XWikiWikiModel implements WikiModel
>> {
>> + /**
>> + * The suffix used to mark an amount of pixels.
>> + */
>> + private static final String PIXELS = "px";
>> +
>> + /**
>> + * The name of the {...@code width} image parameter.
>> + */
>> + private static final String WIDTH = "width";
>> +
>> + /**
>> + * The name of the {...@code height} image parameter.
>> + */
>> + private static final String HEIGHT = "height";
>> +
>> + /**
>> + * The component used to access configuration parameters.
>> + */
>> @Requirement
>> + private RenderingConfiguration renderingConfiguration;
>> +
>> + /**
>> + * The component used to access the underlying XWiki model.
>> + */
>> + @Requirement
>> private DocumentAccessBridge documentAccessBridge;
>>
>> + /**
>> + * The component used to serialize entity references to strings.
>> + */
>> @Requirement
>> private EntityReferenceSerializer<String> entityReferenceSerializer;
>>
>> /**
>> + * The object used to parse the CSS from the image style parameter.
>> + */
>> + private final CSSOMParser cssParser = new CSSOMParser();
>> +
>> + /**
>> * {...@inheritdoc}
>> + *
>> * @see WikiModel#getAttachmentURL(String, String)
>> */
>> public String getAttachmentURL(String documentName, String attachmentName)
>> @@ -55,7 +96,112 @@
>> }
>>
>> /**
>> + * Extracts the specified image dimension from the image parameters.
>> + *
>> + * @param dimension either {...@code width} or {...@code height}
>> + * @param imageParameters the image parameters; may include the
>> {...@code width}, {...@code height} and {...@code style}
>> + * parameters
>> + * @return the value of the passed dimension if it is specified in the
>> image parameters, {...@code null} otherwise
>> + */
>> + private String getImageDimension(String dimension, Map<String, String>
>> imageParameters)
>> + {
>> + // Check first if the style parameter contains information about
>> the given dimension. In-line style has priority
>> + // over the dimension parameters.
>> + String value = null;
>> + String style = imageParameters.get("style");
>> + if (StringUtils.isNotBlank(style)) {
>> + try {
>> + CSSStyleDeclaration sd =
>> cssParser.parseStyleDeclaration(new InputSource(new StringReader(style)));
>> + value = sd.getPropertyValue(dimension);
>> + } catch (IOException e) {
>> + // Ignore the style parameter.
>> + }
>> + }
>> + if (StringUtils.isBlank(value)) {
>> + // Fall back on the value of the dimension parameter.
>> + value = imageParameters.get(dimension);
>> + }
>> + return value;
>> + }
>> +
>> + /**
>> + * Creates the query string that can be added to an image URL to resize
>> the image on the server side.
>> + *
>> + * @param imageParameters image parameters, including width and height
>> then they are specified
>> + * @return the query string to be added to an image URL in order to
>> resize the image on the server side
>> + */
>> + private StringBuilder getImageURLQueryString(Map<String, String>
>> imageParameters)
>> + {
>> + String width = StringUtils.chomp(getImageDimension(WIDTH,
>> imageParameters), PIXELS);
>> + String height = StringUtils.chomp(getImageDimension(HEIGHT,
>> imageParameters), PIXELS);
>> + boolean useHeight = StringUtils.isNotEmpty(height) &&
>> StringUtils.isNumeric(height);
>> + StringBuilder queryString = new StringBuilder();
>> + if (StringUtils.isEmpty(width) || !StringUtils.isNumeric(width)) {
>> + // Width is unspecified or is not measured in pixels.
>> + if (useHeight) {
>> + // Height is specified in pixels.
>> +
>> queryString.append('&').append(HEIGHT).append('=').append(height);
>> + } else {
>> + // If image width and height are unspecified or if they are
>> not expressed in pixels then limit the image
>> + // size to best fit the rectangle specified in the
>> configuration (keeping aspect ratio).
>> + int widthLimit =
>> renderingConfiguration.getImageWidthLimit();
>> + if (widthLimit > 0) {
>> +
>> queryString.append('&').append(WIDTH).append('=').append(widthLimit);
>> + }
>> + int heightLimit =
>> renderingConfiguration.getImageHeightLimit();
>> + if (heightLimit > 0) {
>> +
>> queryString.append('&').append(HEIGHT).append('=').append(heightLimit);
>> + }
>> + if (widthLimit > 0 && heightLimit > 0) {
>> + queryString.append("&keepAspectRatio=").append(true);
>> + }
>> + }
>> + } else {
>> + // Width is specified in pixels.
>> + queryString.append('&').append(WIDTH).append('=').append(width);
>> + if (useHeight) {
>> + // Height is specified in pixels.
>> +
>> queryString.append('&').append(HEIGHT).append('=').append(height);
>> + }
>> + }
>> + return queryString;
>> + }
>> +
>> + /**
>> * {...@inheritdoc}
>> + *
>> + * @see
>> org.xwiki.rendering.wiki.WikiModel#getImageURL(java.lang.String,
>> java.lang.String, java.util.Map)
>> + */
>> + public String getImageURL(String documentName, String attachmentName,
>> Map<String, String> parameters)
>> + {
>> + String url = getAttachmentURL(documentName, attachmentName);
>> + if (!renderingConfiguration.isIncludeImageDimensionsInImageURL()) {
>> + return url;
>> + }
>> +
>> + StringBuilder queryString = getImageURLQueryString(parameters);
>> + if (queryString.length() == 0) {
>> + return url;
>> + }
>> +
>> + // Determine the insertion point.
>> + int insertionPoint = url.lastIndexOf('#');
>> + if (insertionPoint < 0) {
>> + // No fragment identifier.
>> + insertionPoint = url.length();
>> + }
>> + if (url.lastIndexOf('?', insertionPoint) < 0) {
>> + // No query string.
>> + queryString.setCharAt(0, '?');
>> + }
>> +
>> + // Insert the query string.
>> + return new StringBuilder(url).insert(insertionPoint,
>> queryString).toString();
>> + }
>> +
>> + /**
>> + * {...@inheritdoc}
>> + *
>> * @see WikiModel#isDocumentAvailable(String)
>> */
>> public boolean isDocumentAvailable(String documentName)
>> @@ -65,6 +211,7 @@
>>
>> /**
>> * {...@inheritdoc}
>> + *
>> * @see WikiModel#getDocumentViewURL(String, String, String)
>> */
>> public String getDocumentViewURL(String documentName, String anchor,
>> String queryString)
>> @@ -74,6 +221,7 @@
>>
>> /**
>> * {...@inheritdoc}
>> + *
>> * @see WikiModel#getDocumentEditURL(String, String, String)
>> */
>> public String getDocumentEditURL(String documentName, String anchor,
>> String queryString)
>> @@ -89,17 +237,17 @@
>> // See
>> http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars
>> // TODO: Once the xwiki-url module is usable, refactor
>> this code to use it and remove the need to
>> // perform explicit encoding here.
>> - modifiedQueryString =
>> + modifiedQueryString =
>> "parent=" +
>> URLEncoder.encode(this.entityReferenceSerializer.serialize(reference),
>> "UTF-8");
>> } catch (UnsupportedEncodingException e) {
>> // Not supporting UTF-8 as a valid encoding for some
>> reasons. We consider XWiki cannot work
>> // without that encoding.
>> - throw new RuntimeException("Failed to URL encode [" +
>> this.entityReferenceSerializer.serialize(
>> - reference) + "] using UTF-8.", e);
>> + throw new RuntimeException("Failed to URL encode ["
>> + +
>> this.entityReferenceSerializer.serialize(reference) + "] using UTF-8.", e);
>> }
>> }
>> }
>> -
>> +
>> return this.documentAccessBridge.getURL(documentName, "create",
>> modifiedQueryString, anchor);
>> }
>> }
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfigurationTest.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfigurationTest.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/configuration/XWikiRenderingConfigurationTest.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -22,9 +22,9 @@
>> import java.util.Properties;
>>
>> import org.jmock.Expectations;
>> -import org.xwiki.configuration.ConfigurationSource;
>> import org.junit.Assert;
>> import org.junit.Test;
>> +import org.xwiki.configuration.ConfigurationSource;
>> import org.xwiki.test.AbstractMockingComponentTestCase;
>> import org.xwiki.test.annotation.MockingRequirement;
>>
>> @@ -43,10 +43,13 @@
>> public void testGetLinkLabelFormat() throws Exception
>> {
>> final ConfigurationSource source =
>> getComponentManager().lookup(ConfigurationSource.class);
>> - getMockery().checking(new Expectations() {{
>> - allowing(source).getProperty("rendering.linkLabelFormat", "%p");
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + allowing(source).getProperty("rendering.linkLabelFormat",
>> "%p");
>> will(returnValue("%p"));
>> - }});
>> + }
>> + });
>>
>> Assert.assertEquals("%p", this.configuration.getLinkLabelFormat());
>> }
>> @@ -55,12 +58,60 @@
>> public void testGetMacroCategories() throws Exception
>> {
>> final ConfigurationSource source =
>> getComponentManager().lookup(ConfigurationSource.class);
>> - getMockery().checking(new Expectations() {{
>> - allowing(source).getProperty("rendering.macroCategories",
>> Properties.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + allowing(source).getProperty("rendering.macroCategories",
>> Properties.class);
>> will(returnValue(new Properties()));
>> - }});
>> + }
>> + });
>>
>> Assert.assertNotNull(this.configuration.getMacroCategories());
>> Assert.assertEquals(0,
>> this.configuration.getMacroCategories().size());
>> }
>> +
>> + @Test
>> + public void testGetImageWidthLimit() throws Exception
>> + {
>> + final ConfigurationSource source =
>> getComponentManager().lookup(ConfigurationSource.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + allowing(source).getProperty("rendering.imageWidthLimit",
>> -1);
>> + will(returnValue(100));
>> + }
>> + });
>> +
>> + Assert.assertEquals(100, this.configuration.getImageWidthLimit());
>> + }
>> +
>> + @Test
>> + public void testGetImageHeightLimit() throws Exception
>> + {
>> + final ConfigurationSource source =
>> getComponentManager().lookup(ConfigurationSource.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + allowing(source).getProperty("rendering.imageHeightLimit",
>> -1);
>> + will(returnValue(150));
>> + }
>> + });
>> +
>> + Assert.assertEquals(150, this.configuration.getImageHeightLimit());
>> + }
>> +
>> + @Test
>> + public void testIsIncludeImageDimensionsInImageURL() throws Exception
>> + {
>> + final ConfigurationSource source =
>> getComponentManager().lookup(ConfigurationSource.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> +
>> allowing(source).getProperty("rendering.includeImageDimensionsInImageURL",
>> true);
>> + will(returnValue(false));
>> + }
>> + });
>> +
>> +
>> Assert.assertFalse(this.configuration.isIncludeImageDimensionsInImageURL());
>> + }
>> }
>>
>> Modified:
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/wiki/XWikiWikiModelTest.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/wiki/XWikiWikiModelTest.java
>> 2010-09-11 17:15:46 UTC (rev 31052)
>> +++
>> platform/core/trunk/xwiki-rendering/xwiki-rendering-xwiki/src/test/java/org/xwiki/rendering/internal/wiki/XWikiWikiModelTest.java
>> 2010-09-12 11:30:15 UTC (rev 31053)
>> @@ -19,12 +19,20 @@
>> */
>> package org.xwiki.rendering.internal.wiki;
>>
>> +import java.util.Collections;
>> +import java.util.HashMap;
>> +import java.util.Map;
>> +
>> +import junit.framework.Assert;
>> +
>> import org.jmock.Expectations;
>> -import org.jmock.Mockery;
>> +import org.junit.Test;
>> import org.xwiki.bridge.DocumentAccessBridge;
>> import org.xwiki.model.reference.DocumentReference;
>> -import org.xwiki.component.util.ReflectionUtils;
>> import org.xwiki.model.reference.EntityReferenceSerializer;
>> +import org.xwiki.rendering.configuration.RenderingConfiguration;
>> +import org.xwiki.test.AbstractMockingComponentTestCase;
>> +import org.xwiki.test.annotation.MockingRequirement;
>>
>> /**
>> * Unit tests for {...@link XWikiWikiModel}.
>> @@ -32,31 +40,321 @@
>> * @version $Id$
>> * @since 2.0M1
>> */
>> -public class XWikiWikiModelTest
>> +public class XWikiWikiModelTest extends AbstractMockingComponentTestCase
>> {
>> - @org.junit.Test
>> + @MockingRequirement
>> + private XWikiWikiModel wikiModel;
>> +
>> + @Test
>> public void testGetDocumentEditURLWhenNoQueryStringSpecified() throws
>> Exception
>> {
>> - Mockery mockery = new Mockery();
>> - XWikiWikiModel wikiModel = new XWikiWikiModel();
>> + final EntityReferenceSerializer< ? > entityReferenceSerializer =
>> + getComponentManager().lookup(EntityReferenceSerializer.class);
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final DocumentReference documentReference = new
>> DocumentReference("wiki", "Space", "Page");
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getCurrentDocumentReference();
>> + will(returnValue(documentReference));
>> +
>> oneOf(entityReferenceSerializer).serialize(documentReference);
>> + will(returnValue("wiki:Space.Page\u20AC"));
>>
>> - final EntityReferenceSerializer mockEntityReferenceSerializer =
>> mockery.mock(EntityReferenceSerializer.class);
>> - ReflectionUtils.setFieldValue(wikiModel,
>> "entityReferenceSerializer", mockEntityReferenceSerializer);
>> + // The test is here: we verify that getURL is called with
>> the query string already encoded since
>> + // getURL() doesn't encode it.
>> + oneOf(documentAccessBridge).getURL("Space.Page\u20AC",
>> "create", "parent=wiki%3ASpace.Page%E2%82%AC",
>> + "anchor");
>> + }
>> + });
>>
>> - final DocumentAccessBridge mockDocumentAccessBridge =
>> mockery.mock(DocumentAccessBridge.class);
>> - ReflectionUtils.setFieldValue(wikiModel, "documentAccessBridge",
>> mockDocumentAccessBridge);
>> + wikiModel.getDocumentEditURL("Space.Page\u20AC", "anchor", null);
>> + }
>>
>> - final DocumentReference docReference = new
>> DocumentReference("wiki", "Space", "Page");
>> - mockery.checking(new Expectations() {{
>> - oneOf(mockDocumentAccessBridge).getCurrentDocumentReference();
>> will(returnValue(docReference));
>> - oneOf(mockEntityReferenceSerializer).serialize(docReference);
>> will(returnValue("wiki:Space.Page\u20AC"));
>> + /**
>> + * Tests that the proper image URL is generated when both the width and
>> the height image parameters are specified.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void
>> testGetImageURLWhenBothWidthAndHeightAttributesAreSpecified() throws
>> Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("width", "100px");
>> + parameters.put("height", "50");
>> + Assert.assertEquals("?width=100&height=50",
>> wikiModel.getImageURL("", "", parameters));
>> + }
>>
>> - // The test is here: we verify that getURL is called with the
>> query string already encoded since getURL()
>> - // doesn't encode it.
>> - oneOf(mockDocumentAccessBridge).getURL("Space.Page\u20AC",
>> "create", "parent=wiki%3ASpace.Page%E2%82%AC",
>> - "anchor");
>> - }});
>> + /**
>> + * Tests that the proper image URL is generated when both the width and
>> the height image parameters are specified
>> + * but including them in the image URL is forbidden from the rendering
>> configuration.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void testGetImageURLWhenIncludingImageDimensionsIsForbidden()
>> throws Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(false));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("width", "101px");
>> + parameters.put("height", "55px");
>> + Assert.assertEquals("", wikiModel.getImageURL("", "", parameters));
>> + }
>>
>> - wikiModel.getDocumentEditURL("Space.Page\u20AC", "anchor", null);
>> + /**
>> + * Tests that the proper image URL is generated when both the width and
>> the height CSS properties are specified.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void
>> testGetImageURLWhenBothWidthAndHeightCSSPropertiesAreSpecified() throws
>> Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("style", "border: 1px; height: 30px; margin-top:
>> 2em; width: 70px");
>> + Assert.assertEquals("?width=70&height=30",
>> wikiModel.getImageURL("", "", parameters));
>> }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when only the width
>> image parameter is specified.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void testGetImageURLWhenOnlyWidthAttributeIsSpecified() throws
>> Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("width", "150");
>> + parameters.put("height", "30%");
>> + Assert.assertEquals("?width=150", wikiModel.getImageURL("", "",
>> parameters));
>> + }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when only the height
>> CSS property is specified.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void testGetImageURLWhenOnlyHeightCSSPropertyIsSpecified()
>> throws Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("style", "width: 5cm; height: 80px");
>> + Assert.assertEquals("?height=80", wikiModel.getImageURL("", "",
>> parameters));
>> + }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when both the width and
>> the height are unspecified and image size is
>> + * limited in the configuration.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void
>> testGetImageURLWhenBothWidthAndHeightAreUnspecifiedAndImageSizeIsLimited()
>> throws Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + oneOf(configuration).getImageWidthLimit();
>> + will(returnValue(200));
>> + oneOf(configuration).getImageHeightLimit();
>> + will(returnValue(170));
>> + }
>> + });
>> + Map<String, String> parameters = Collections.emptyMap();
>> + Assert.assertEquals("?width=200&height=170&keepAspectRatio=true",
>> wikiModel.getImageURL("", "", parameters));
>> + }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when both the width and
>> the height are unspecified and only the
>> + * image width is limited in the configuration.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void
>> testGetImageURLWhenBothWidthAndHeightAreUnspecifiedAndOnlyImageWidthIsLimited()
>> throws Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + oneOf(configuration).getImageWidthLimit();
>> + will(returnValue(25));
>> + oneOf(configuration).getImageHeightLimit();
>> + will(returnValue(-1));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("width", "45%");
>> + parameters.put("style", "height:10em");
>> + Assert.assertEquals("?width=25", wikiModel.getImageURL("", "",
>> parameters));
>> + }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when both the width and
>> the height are unspecified and the image
>> + * size is not limited in the configuration.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void
>> testGetImageURLWhenBothWidthAndHeightAreUnspecifiedAndImageSizeIsNotLimited()
>> throws Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + oneOf(configuration).getImageWidthLimit();
>> + will(returnValue(-1));
>> + oneOf(configuration).getImageHeightLimit();
>> + will(returnValue(-1));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("style", "bad CSS declaration");
>> + Assert.assertEquals("", wikiModel.getImageURL("", "", parameters));
>> + }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when the attachment URL
>> has a fragment identifier.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void testGetImageURLWhenAttachmentURLHasFragmentIdentifier()
>> throws Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue("test#fragment"));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("width", "23");
>> + Assert.assertEquals("test?width=23#fragment",
>> wikiModel.getImageURL("", "", parameters));
>> + }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when the attachment URL
>> has a query string and a fragment
>> + * identifier.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void
>> testGetImageURLWhenAttachmentURLHasQueryStringAndFragmentIdentifier() throws
>> Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue("test?param=value#fragment"));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("height", "17");
>> + Assert.assertEquals("test?param=value&height=17#fragment",
>> wikiModel.getImageURL("", "", parameters));
>> + }
>> +
>> + /**
>> + * Tests that the proper image URL is generated when both the style and
>> the dimension parameters are specified.
>> + *
>> + * @throws Exception if an exception occurs while running the test
>> + */
>> + @Test
>> + public void
>> testGetImageURLWhenBothStyleAndDimensionParametersAreSpecified() throws
>> Exception
>> + {
>> + final DocumentAccessBridge documentAccessBridge =
>> getComponentManager().lookup(DocumentAccessBridge.class);
>> + final RenderingConfiguration configuration =
>> getComponentManager().lookup(RenderingConfiguration.class);
>> + getMockery().checking(new Expectations()
>> + {
>> + {
>> + oneOf(documentAccessBridge).getAttachmentURL("", "");
>> + will(returnValue(""));
>> + oneOf(configuration).isIncludeImageDimensionsInImageURL();
>> + will(returnValue(true));
>> + }
>> + });
>> + Map<String, String> parameters = new HashMap<String, String>();
>> + parameters.put("height", "46");
>> + parameters.put("width", "101px");
>> + parameters.put("style", "width: 20%; height:75px");
>> + // Note that the style parameter take precedence over the dimension
>> parameters and the width is actually 20% but
>> + // we can't use it for resizing the image on the server side so
>> it's omitted from the query string.
>> + Assert.assertEquals("?height=75", wikiModel.getImageURL("", "",
>> parameters));
>> + }
>> }
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs