All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.jasperreports.engine.export.FlashPrintElement Maven / Gradle / Ivy

There is a newer version: 6.21.2
Show newest version
/*
 * JasperReports - Free Java Reporting Library.
 * Copyright (C) 2001 - 2019 TIBCO Software Inc. All rights reserved.
 * http://www.jaspersoft.com
 *
 * Unless you have purchased a commercial license agreement from Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of JasperReports.
 *
 * JasperReports 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 3 of the License, or
 * (at your option) any later version.
 *
 * JasperReports 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 JasperReports. If not, see .
 */
package net.sf.jasperreports.engine.export;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import net.sf.jasperreports.annotations.properties.Property;
import net.sf.jasperreports.annotations.properties.PropertyScope;
import net.sf.jasperreports.engine.JRGenericElementType;
import net.sf.jasperreports.engine.JRGenericPrintElement;
import net.sf.jasperreports.engine.JRPrintElement;
import net.sf.jasperreports.engine.JRPrintHyperlink;
import net.sf.jasperreports.engine.JRPropertiesUtil;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.base.JRBaseGenericPrintElement;
import net.sf.jasperreports.engine.util.HyperlinkData;
import net.sf.jasperreports.engine.xml.JRXmlConstants;
import net.sf.jasperreports.properties.PropertyConstants;

/**
 * Utility class that creates generic print elements of Flash type.
 * 
 * 

* Such an element has a parameter that provides the URL of the SWF movie, * and a list of parameters that acts a Flash variables. *

* * @author Lucian Chirita ([email protected]) * @see FlashHtmlHandler */ public final class FlashPrintElement { private static final Log log = LogFactory.getLog(FlashPrintElement.class); /** * The name of Flash generic elements. */ public static final String FLASH_ELEMENT_NAME = "flash"; /** * The qualified type of Flash generic elements. */ public static final JRGenericElementType FLASH_ELEMENT_TYPE = new JRGenericElementType(JRXmlConstants.JASPERREPORTS_NAMESPACE, FLASH_ELEMENT_NAME); /** * The name of the parameter that provides the URL of the SWF movie. */ public static final String PARAMETER_SWF_URL = "SWF_URL"; /** * The prefix of parameter names that acts as Flash variables. */ public static final String PARAMETER_FLASH_VAR_PREFIX = "FLASH_VAR_"; /** * Boolean property used to avoid setting the width and height of the SWFLoader control in the Flash report viewer. *

* Defaults to false. */ @Deprecated public static final String PROPERTY_IGNORE_SIZE = JRPropertiesUtil.PROPERTY_PREFIX + "export.swf.ignore.size"; /** * Property that determines the value of the allowScriptAccess parameter for Flash elements. * *

* The property can be set at element, report and system levels. */ @Property( category = PropertyConstants.CATEGORY_EXPORT, defaultValue = PropertyConstants.SAME_DOMAIN, scopes = {PropertyScope.CONTEXT, PropertyScope.REPORT, PropertyScope.GENERIC_ELEMENT}, sinceVersion = PropertyConstants.VERSION_4_1_3 ) public static final String PROPERTY_ALLOW_SCRIPT_ACCESS = JRPropertiesUtil.PROPERTY_PREFIX + "export.flash.element.allow.script.access"; private static final GenericElementHandlerBundle HANDLER_BUNDLE = new GenericElementHandlerBundle() { @Override public String getNamespace() { return JRXmlConstants.JASPERREPORTS_NAMESPACE; } @Override public GenericElementHandler getHandler(String elementName, String exporterKey) { if (FLASH_ELEMENT_NAME.equals(elementName) && HtmlExporter.HTML_EXPORTER_KEY.equals(exporterKey)) { return FlashHtmlHandler.getInstance(); } return null; } }; /** * Returns the bundle of export handlers for Flash elements. * * @return Flash elements export handler bundle */ public static GenericElementHandlerBundle getHandlerBundle() { return HANDLER_BUNDLE; } /** * Creates a Flash generic element by copying all base element attributes * from a template instance. * * @param template the element from which to copy base attributes * @param swfUrl the URL of the SWF movie * @param flashVars a map of Flash variables * @param elementParameters additional parameters to be set on the Flash element. * Hyperlink objects need to be set as element parameters. * @return a Flash generic element */ public static JRGenericPrintElement makeFlashElement(JRPrintElement template, String swfUrl, Map flashVars, Map elementParameters) { // TODO use JRTemplateGenericElement JRBaseGenericPrintElement flashEl = new JRBaseGenericPrintElement( template.getDefaultStyleProvider()); // copy all attribute from the template element flashEl.setUUID(template.getUUID()); flashEl.setX(template.getX()); flashEl.setY(template.getY()); flashEl.setWidth(template.getWidth()); flashEl.setHeight(template.getHeight()); flashEl.setStyle(template.getStyle()); flashEl.setMode(template.getOwnModeValue()); flashEl.setBackcolor(template.getOwnBackcolor()); flashEl.setForecolor(template.getOwnForecolor()); flashEl.setOrigin(template.getOrigin()); flashEl.setKey(template.getKey()); flashEl.setGenericType(FLASH_ELEMENT_TYPE); flashEl.setParameterValue(PARAMETER_SWF_URL, swfUrl); for (Iterator> it = flashVars.entrySet().iterator(); it.hasNext();) { Map.Entry entry = it.next(); String name = entry.getKey(); Object value = entry.getValue(); String paramName = PARAMETER_FLASH_VAR_PREFIX + name; flashEl.setParameterValue(paramName, value); } if (elementParameters != null && !elementParameters.isEmpty()) { for (Iterator> it = elementParameters.entrySet().iterator(); it.hasNext();) { Map.Entry entry = it.next(); String name = entry.getKey(); Object value = entry.getValue(); flashEl.setParameterValue(name, value); } } return flashEl; } /** * Returns the name of the parameter to be used for a hyperlink, as used * by {@link #makeLinkPlaceholder(JRPrintHyperlink)} and * {@link #resolveLinks(String, JRGenericPrintElement, JRHyperlinkProducer, boolean)}. * * @param hyperlink the hyperlink * @return the hyperlink parameter name * @see #makeLinkPlaceholder(JRPrintHyperlink) */ public static String makeLinkParameterName(JRPrintHyperlink hyperlink) { return "link-" + System.identityHashCode(hyperlink); } /** * Returns a placeholder to be used in a Flash variable for a hyperlink. * *

* This method uses System.identityHashCode(hyperlink) as link Id. *

* * @param hyperlink the hyperlink * @return the link placeholder * @see #makeLinkPlaceholder(String) */ public static String makeLinkPlaceholder(JRPrintHyperlink hyperlink) { String id = makeLinkParameterName(hyperlink); return makeLinkPlaceholder(id); } /** * Returns a placeholder to be used in a Flash variable for a hyperlink. * *

* The placeholders will be resolved to links at export time by * {@link #resolveLinks(String, JRGenericPrintElement, JRHyperlinkProducer, boolean)}. *

* * @param linkId the Id of the link, which needs to be used as hyperlink * parameter name * @return the link placeholder */ public static String makeLinkPlaceholder(String linkId) { return "{" + linkId + "}"; } protected static final Pattern LINK_PATTERN = Pattern.compile("\\{(link\\-[\\-\\w]+)\\}"); protected static final int LINK_PARAM_NAME_GROUP = 1; /** * Resolves hyperlink placeholders to URLs in a Flash variable. * * @param text the text in which hyperlink placeholders are to be replaced * @param element the print element where hyperlink parameters will be looked for * @param linkProducer the hyperlink producer which transforms hyperlink * objects to String URLs * @return the text with hyperlink placeholders replaced by URLs * @see #makeLinkPlaceholder(String) */ public static String resolveLinks(String text, JRGenericPrintElement element, JRHyperlinkProducer linkProducer, boolean prepareForSerialization) { Matcher matcher = LINK_PATTERN.matcher(text); StringBuffer xml = new StringBuffer(); List hyperlinksData = new ArrayList(); while (matcher.find()) { String paramName = matcher.group(LINK_PARAM_NAME_GROUP); JRPrintHyperlink hyperlink = (JRPrintHyperlink) element.getParameterValue(paramName); String replacement; if (hyperlink == null) { if (log.isWarnEnabled()) { log.warn("Hyperlink parameter " + paramName + " not found in element"); } replacement = null; } else { replacement = linkProducer.getHyperlink(hyperlink); if (prepareForSerialization) { String id = String.valueOf(hyperlink.hashCode() & 0x7FFFFFFF); HyperlinkData hyperlinkData = new HyperlinkData(); hyperlinkData.setId(id); hyperlinkData.setHref(replacement); hyperlinkData.setHyperlink(hyperlink); hyperlinkData.setSelector("._jrHyperLink." + hyperlink.getLinkType()); replacement = "jrhl-" + id + ";" + hyperlink.getLinkType(); hyperlinksData.add(hyperlinkData); } } if (replacement == null) { replacement = ""; } else { try { if (!prepareForSerialization) { replacement = URLEncoder.encode(replacement, "UTF-8"); } } catch (UnsupportedEncodingException e) { throw new JRRuntimeException(e); } } matcher.appendReplacement(xml, replacement); } matcher.appendTail(xml); if (hyperlinksData.size() > 0) { element.setParameterValue("hyperlinksData", hyperlinksData); } return xml.toString(); } private FlashPrintElement() { } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy