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

org.eclipse.birt.report.utility.BirtUtility Maven / Gradle / Ivy

There is a newer version: 4.5.0
Show newest version
/*************************************************************************************
 * Copyright (c) 2004 Actuate Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Actuate Corporation - Initial implementation.
 ************************************************************************************/

package org.eclipse.birt.report.utility;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.namespace.QName;

import org.apache.axis.AxisFault;
import org.eclipse.birt.data.engine.api.DataEngine;
import org.eclipse.birt.report.IBirtConstants;
import org.eclipse.birt.report.context.BaseAttributeBean;
import org.eclipse.birt.report.context.BaseTaskBean;
import org.eclipse.birt.report.context.ViewerAttributeBean;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.IEngineTask;
import org.eclipse.birt.report.engine.api.IReportDocument;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.ITOCTree;
import org.eclipse.birt.report.engine.api.TOCNode;
import org.eclipse.birt.report.engine.api.script.instance.IScriptStyle;
import org.eclipse.birt.report.model.api.IModuleOption;
import org.eclipse.birt.report.model.api.ModuleHandle;
import org.eclipse.birt.report.model.api.ParameterHandle;
import org.eclipse.birt.report.model.api.ReportDesignHandle;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.resource.BirtResources;
import org.eclipse.birt.report.resource.ResourceConstants;
import org.eclipse.birt.report.service.ParameterDataTypeConverter;
import org.eclipse.birt.report.service.ReportEngineService;
import org.eclipse.birt.report.service.api.IViewerReportDesignHandle;
import org.eclipse.birt.report.service.api.InputOptions;
import org.eclipse.birt.report.service.api.ParameterDefinition;
import org.eclipse.birt.report.service.api.ReportServiceException;
import org.eclipse.birt.report.soapengine.api.Operation;
import org.eclipse.birt.report.soapengine.api.Oprand;

import com.ibm.icu.util.ULocale;

/**
 * Utilities for Birt Report Service
 * 
 */
public class BirtUtility
{

	/*
	 * none value
	 */
	public final static String NONE = "none"; //$NON-NLS-1$

	/*
	 * Request attribute name that indicates the viewer markder has been cleared
	 */
	public final static String VIEWER_MARKER_CLEARED = "ViewerMarkerCleared"; //$NON-NLS-1$

	/**
	 * Add current task in http session
	 * 
	 * @param request
	 * @param task
	 */
	public static void addTask( HttpServletRequest request, IEngineTask task )
	{
		if ( request == null || task == null )
			return;

		try
		{
			// get task id
			BaseAttributeBean attrBean = (BaseAttributeBean) request.getAttribute( IBirtConstants.ATTRIBUTE_BEAN );
			if ( attrBean == null )
				return;

			String taskid = attrBean.getTaskId( );
			if ( taskid == null )
				return;

			// get task map
			HttpSession session = request.getSession( true );
			Map map = (Map) session.getAttribute( IBirtConstants.TASK_MAP );
			if ( map == null )
			{
				map = new HashMap( );
				session.setAttribute( IBirtConstants.TASK_MAP, map );
			}

			// add task
			synchronized ( map )
			{
				BaseTaskBean bean = new BaseTaskBean( taskid, task );
				map.put( taskid, bean );
			}
		}
		catch ( Exception e )
		{

		}
	}

	/**
	 * Remove task from http session
	 * 
	 * @param request
	 */
	public static void removeTask( HttpServletRequest request )
	{
		if ( request == null )
			return;

		try
		{
			// get task id
			BaseAttributeBean attrBean = (BaseAttributeBean) request.getAttribute( IBirtConstants.ATTRIBUTE_BEAN );
			if ( attrBean == null )
				return;

			String taskid = attrBean.getTaskId( );
			if ( taskid == null )
				return;

			// get task map
			HttpSession session = request.getSession( true );
			Map map = (Map) session.getAttribute( IBirtConstants.TASK_MAP );
			if ( map == null )
				return;

			// remove task
			synchronized ( map )
			{
				map.remove( taskid );
			}
		}
		catch ( Exception e )
		{
		}
	}

	/**
	 * Cancel the current engine task by task id
	 * 
	 * @param request
	 * @param taskid
	 * @throws Exception
	 */
	public static void cancelTask( HttpServletRequest request, String taskid )
			throws Exception
	{
		if ( taskid == null )
			return;

		// get task map
		HttpSession session = request.getSession( );
		if ( session == null )
			return;

		Map map = (Map) session.getAttribute( IBirtConstants.TASK_MAP );
		if ( map != null && map.containsKey( taskid ) )
		{
			BaseTaskBean bean = (BaseTaskBean) map.get( taskid );
			if ( bean == null )
				return;

			// cancel task
			IEngineTask task = bean.getTask( );
			if ( task != null )
			{
				task.cancel( );
			}

			// remove task from task map
			synchronized ( map )
			{
				map.remove( taskid );
			}
		}
	}

	/**
	 * Returns the parameter handle list
	 * 
	 * @param reportDesignHandle
	 * @return
	 * @throws ReportServiceException
	 */
	public static List getParameterList(
			IViewerReportDesignHandle reportDesignHandle )
			throws ReportServiceException
	{
		IReportRunnable runnable = (IReportRunnable) reportDesignHandle.getDesignObject( );
		if ( runnable == null )
			return null;

		ModuleHandle model = runnable.getDesignHandle( ).getModuleHandle( );
		if ( model == null )
			return null;

		return model.getFlattenParameters( );
	}

	/**
	 * find the parameter definition by parameter name
	 * 
	 * @param parameterList
	 * @param paramName
	 * @return
	 */
	public static ParameterDefinition findParameterDefinition(
			Collection parameterList, String paramName )
	{
		if ( parameterList == null || paramName == null )
			return null;

		// find parameter definition
		for ( Iterator iter = parameterList.iterator( ); iter.hasNext( ); )
		{
			ParameterDefinition parameter = (ParameterDefinition) iter.next( );
			if ( parameter == null )
				continue;

			String name = parameter.getName( );
			if ( paramName.equals( name ) )
			{
				return parameter;
			}
		}

		return null;
	}

	/**
	 * find the parameter handle by parameter name
	 * 
	 * @param reportDesignHandle
	 * @param paramName
	 * @return
	 * @throws ReportServiceException
	 */
	public static ParameterHandle findParameter(
			IViewerReportDesignHandle reportDesignHandle, String paramName )
			throws ReportServiceException
	{
		if ( paramName == null )
			return null;

		IReportRunnable runnable = (IReportRunnable) reportDesignHandle.getDesignObject( );
		if ( runnable == null )
			return null;

		// get module handle from report runnable
		ModuleHandle model = runnable.getDesignHandle( ).getModuleHandle( );
		if ( model == null )
			return null;

		return model.findParameter( paramName );
	}

	/**
	 * Gets the module option map from the request.
	 * 
	 * @param request
	 *            the request
	 * @return the module options
	 */

	public static Map getModuleOptions( HttpServletRequest request )
	{
		Map options = new HashMap( );
		options.put( IModuleOption.RESOURCE_FOLDER_KEY,
				ParameterAccessor.getResourceFolder( request ) );
		options.put( IModuleOption.PARSER_SEMANTIC_CHECK_KEY, Boolean.FALSE );
		return options;
	}

	/**
	 * Get Display Text of select parameters
	 * 
	 * @param parameters
	 * @param displayTexts
	 * @param request
	 * @return Map
	 */
	public static Map getDisplayTexts( Collection parameters, Map displayTexts,
			HttpServletRequest request )
	{
		if ( displayTexts == null )
			displayTexts = new HashMap( );

		Enumeration params = request.getParameterNames( );
		while ( params != null && params.hasMoreElements( ) )
		{
			String param = DataUtil.getString( params.nextElement( ) );
			String paramName = ParameterAccessor.isDisplayText( param );
			if ( paramName != null )
			{
				ParameterDefinition parameter = findParameterDefinition( parameters,
						paramName );

				// TODO: Currently, Multi-value parameter doesn't support
				// displayText.( set to NULL value )
				if ( parameter != null )
				{
					if ( parameter.isMultiValue( ) )
						displayTexts.put( paramName, null );
					else
						displayTexts.put( paramName,
								ParameterAccessor.getParameter( request, param ) );
				}
			}
		}

		return displayTexts;
	}

	/**
	 * Get locale parameter list
	 * 
	 * @param locParams
	 * @param request
	 * @return List
	 */
	public static List getLocParams( List locParams, HttpServletRequest request )
	{
		if ( locParams == null )
			locParams = new ArrayList( );

		String[] arrs = request.getParameterValues( ParameterAccessor.PARAM_ISLOCALE );
		if ( arrs != null )
		{
			for ( int i = 0; i < arrs.length; i++ )
				locParams.add( arrs[i] );
		}

		return locParams;
	}

	/**
	 * Check whether missing parameter or not.
	 * 
	 * @param task
	 * @param parameters
	 * @return
	 */
	public static boolean validateParameters( Collection parameterList,
			Map parameters )
	{
		assert parameters != null;
		boolean missingParameter = false;

		Iterator iter = parameterList.iterator( );
		while ( iter.hasNext( ) )
		{
			ParameterDefinition parameter = (ParameterDefinition) iter.next( );

			String parameterName = parameter.getName( );
			Object parameterValue = parameters.get( parameterName );

			// hidden type parameter
			if ( parameter.isHidden( ) || !parameter.isRequired( ) )
			{
				continue;
			}

			// Null Value
			if ( parameterValue == null )
			{
				missingParameter = true;
				break;
			}

			if ( parameterValue instanceof List )
			{
				// handle multi-value parameter
				List values = (List) parameterValue;
				for ( int i = 0; i < values.size( ); i++ )
				{
					Object value = values.get( i );
					if ( value == null )
					{
						missingParameter = true;
						break;
					}

					if ( value instanceof String
							&& ( (String) value ).length( ) <= 0 )
					{
						missingParameter = true;
						break;
					}
				}

				if ( missingParameter )
					break;
			}
			else
			{
				// Blank Value
				if ( parameterValue instanceof String
						&& ( (String) parameterValue ).length( ) <= 0 )
				{
					missingParameter = true;
					break;
				}
			}
		}

		return missingParameter;
	}

	/**
	 * Handle SOAP operation. Parse report parameters and display text
	 * 
	 * @param operation
	 * @param bean
	 * @param parameterMap
	 * @param displayTexts
	 * @throws Exception
	 */
	public static void handleOperation( Operation operation,
			ViewerAttributeBean bean, Map parameterMap, Map displayTexts )
			throws Exception
	{
		if ( operation == null
				|| bean == null
				|| parameterMap == null
				|| displayTexts == null )
			return;

		// convert parameter from SOAP operation
		List locs = new ArrayList( );
		Map params = new HashMap( );
		String displayTextParam = null;
		Oprand[] oprands = operation.getOprand( );
		for ( int i = 0; i < oprands.length; i++ )
		{
			String paramName = oprands[i].getName( );
			Object paramValue = oprands[i].getValue( );

			if ( paramName == null || paramValue == null )
				continue;

			if ( paramName.equalsIgnoreCase( ParameterAccessor.PARAM_ISLOCALE ) )
			{
				// parameter value is a locale string
				locs.add( paramValue );
			}
			// display text of parameter
			else if ( ( displayTextParam = ParameterAccessor.isDisplayText( paramName ) ) != null )
			{
				ParameterDefinition parameter = bean.findParameterDefinition( displayTextParam );

				// TODO: Currently, Multi-value parameter doesn't support
				// displayText.( set to NULL value )
				if ( parameter != null )
				{
					if ( parameter.isMultiValue( ) )
						displayTexts.put( displayTextParam, null );
					else
						displayTexts.put( displayTextParam, paramValue );
				}
				continue;
			}
			else
			{
				// Check if it's the parameter value list set to null
				if ( ParameterAccessor.PARAM_ISNULLLIST.equalsIgnoreCase( paramName ) )
				{
					paramName = (String) paramValue;
					// remove from the map rather than set to null, so it get
					// the chance to use the default values
					params.remove( paramName );
				}
				else
				{
					// Check if it's the parameter value set to null
					if ( ParameterAccessor.PARAM_ISNULL.equalsIgnoreCase( paramName ) )
					{
						paramName = (String) paramValue;
						paramValue = null;
					}

					List list = (List) params.get( paramName );
					if ( list == null )
					{
						list = new ArrayList( );
						params.put( paramName, list );
					}
					list.add( paramValue );
				}
			}
		}

		Iterator it = params.entrySet( ).iterator( );
		while ( it.hasNext( ) )
		{
			Map.Entry entry = (Map.Entry) it.next( );
			String paramName = (String) entry.getKey( );
			List paramValues = (List) entry.getValue( );

			// find the parameter
			ParameterDefinition parameter = bean.findParameterDefinition( paramName );
			if ( parameter == null )
				continue;

			String pattern = parameter.getPattern( );
			String dataType = ParameterDataTypeConverter.convertDataType( parameter.getDataType( ) );

			// check whether it is a locale String.
			boolean isLocale = locs.contains( paramName );

			// convert parameter
			if ( parameter.isMultiValue( ) )
			{
				if ( paramValues == null )
				{
					// the value list is null
					parameterMap.put( paramName, null );
				}
				else
				{
					List values = new ArrayList( );

					// convert multi-value parameter
					for ( int i = 0; i < paramValues.size( ); i++ )
					{
						Object paramValueObj = DataUtil.validate( paramName,
								dataType,
								pattern,
								(String) paramValues.get( i ),
								bean.getLocale( ),
								bean.getTimeZone( ),
								isLocale );
						values.add( paramValueObj );
					}

					parameterMap.put( paramName, values.toArray( ) );
				}
			}
			else
			{
				// single parameter value
				Object paramValueObj = DataUtil.validate( paramName,
						dataType,
						pattern,
						paramValues == null ? null
								: (String) paramValues.get( 0 ),
						bean.getLocale( ),
						bean.getTimeZone( ),
						isLocale );

				// push to parameter map
				parameterMap.put( paramName, paramValueObj );
			}
		}
	}

	/**
	 * Returns report runnable from design file
	 * 
	 * @param request
	 * @param path
	 * @return
	 * @throws EngineException
	 * 
	 */
	public static IReportRunnable getRunnableFromDesignFile(
			HttpServletRequest request, String designFile, Map options )
			throws EngineException
	{
		IReportRunnable reportRunnable = null;

		// check the design file if exist
		File file = new File( designFile );
		if ( file.exists( ) )
		{
			reportRunnable = ReportEngineService.getInstance( )
					.openReportDesign( designFile, options );
		}
		else
		{
			// try to get resource from war package
			InputStream is = null;
			URL url = null;
			try
			{
				if ( !ParameterAccessor.isUniversalPath( designFile ) )
				{
					designFile = ParameterAccessor.workingFolder + "/" //$NON-NLS-1$
							+ ParameterAccessor.getParameter( request,
									ParameterAccessor.PARAM_REPORT );
				}

				// try detect as resource path first
				String resoureFile = designFile;
				if ( !resoureFile.startsWith( "/" ) ) //$NON-NLS-1$
				{
					resoureFile = "/" + resoureFile; //$NON-NLS-1$
				}

				url = request.getSession( )
						.getServletContext( )
						.getResource( resoureFile );
				if ( url != null )
				{
					is = url.openStream( );
				}
				else
				{
					// try handle the design file path as url directly
					url = new URL( designFile );
					is = url.openStream( );
				}

				if ( is != null )
				{
					reportRunnable = ReportEngineService.getInstance( )
							.openReportDesign( url.toString( ), is, options );
				}

			}
			catch ( Exception e )
			{
			}
		}

		return reportRunnable;
	}

	/**
	 * Returns report title from design
	 * 
	 * @param reportDesignHandle
	 * @return
	 * @throws ReportServiceException
	 */
	public static String getTitleFromDesign(
			IViewerReportDesignHandle reportDesignHandle )
			throws ReportServiceException
	{
		String reportTitle = null;
		if ( reportDesignHandle != null )
		{
			Object design = reportDesignHandle.getDesignObject( );
			if ( design instanceof IReportRunnable )
			{
				IReportRunnable runnable = (IReportRunnable) design;
				if ( runnable.getDesignHandle( ) != null )
				{
					ModuleHandle moduleHandle = runnable.getDesignHandle( )
							.getModuleHandle( );
					String key = moduleHandle.getStringProperty( ReportDesignHandle.TITLE_ID_PROP );
					if ( key != null && moduleHandle.getMessage( key ) != null )
					{
						reportTitle = moduleHandle.getMessage( key );
					}
					else
					{
						reportTitle = (String) runnable.getProperty( IReportRunnable.TITLE );
					}
				}
				else
					reportTitle = (String) runnable.getProperty( IReportRunnable.TITLE );
			}
		}

		return reportTitle;
	}

	public static String getStackTrace( Throwable e )
	{
		StringWriter stackTraceWriter = null;
		PrintWriter writer = null;
		try
		{
			stackTraceWriter = new StringWriter( );
			writer = new PrintWriter( stackTraceWriter );
			e.printStackTrace( writer );
			return stackTraceWriter.toString( );
		}
		finally
		{
			if ( stackTraceWriter != null )
			{
				try
				{
					stackTraceWriter.close( );
				}
				catch ( IOException e1 )
				{
				}
			}
			if ( writer != null )
			{
				writer.close( );
			}
		}
	}

	/**
	 * Converts the given text into HTML code. Replaces the newlines into 
* and the leading spaces/tabs into   * * @param text * @return */ public static String toHtml( String text ) { return text.replaceAll( "\n", "
" ); // .replaceAll( // "^([\s])*[^\s]", " "); } /** * Creates an axis fault based on a given exception. * * @param qName * QName of the fault * @param e * exception * @return axis fault */ public static AxisFault makeAxisFault( String qName, Exception e ) { AxisFault fault = makeAxisFault( e ); fault.setFaultCode( new QName( qName ) ); return fault; } /** * Creates an axis fault based on a given exception. * * @param qName * QName of the fault * @param e * exception * @return axis fault */ public static AxisFault makeAxisFault( Exception e ) { if ( e instanceof AxisFault ) { return (AxisFault) e; } else { AxisFault fault = AxisFault.makeFault( e ); fault.addFaultDetailString( BirtUtility.getStackTrace( e ) ); return fault; } } /** * Creates an axis fault grouping the given exceptions list * * @param qName * QName of the fault * @param exceptions * list of exceptions * @return axis fault */ public static Exception makeAxisFault( String qName, Collection exceptions ) { if ( exceptions.size( ) == 1 ) { return makeAxisFault( qName, exceptions.iterator( ).next( ) ); } else { QName exceptionQName = new QName( "string" ); AxisFault fault = new AxisFault( BirtResources.getMessage( ResourceConstants.GENERAL_EXCEPTION_MULTIPLE_EXCEPTIONS ) ); fault.setFaultCode( new QName( qName ) ); for ( Iterator i = exceptions.iterator( ); i.hasNext( ); ) { Exception e = (Exception) i.next( ); fault.addFaultDetail( exceptionQName, getStackTrace( e ) ); } return fault; } } /** * Append Error Message with stack trace * * @param out * @param e * @throws IOException */ public static void appendErrorMessage( OutputStream out, Exception e ) throws IOException { StringBuffer message = new StringBuffer( ); message.append( "\n\n" //$NON-NLS-1$ + BirtResources.getMessage( "birt.viewer.title.error" ) //$NON-NLS-1$ + "\n" ); //$NON-NLS-1$ message.append( "\n\n" ) //$NON-NLS-1$ .append( "\n" ); //$NON-NLS-1$ String errorId = "document.getElementById('error_detail')"; //$NON-NLS-1$ String errorIcon = "document.getElementById('error_icon')"; //$NON-NLS-1$ String onClick = "if (" + errorId + ".style.display == 'none') { " //$NON-NLS-1$//$NON-NLS-2$ + errorIcon + ".innerHTML = '- '; " + errorId //$NON-NLS-1$ + ".style.display = 'block'; }" + "else { " + errorIcon //$NON-NLS-1$//$NON-NLS-2$ + ".innerHTML = '+ '; " + errorId //$NON-NLS-1$ + ".style.display = 'none'; }"; //$NON-NLS-1$ message.append( "
\n" ) //$NON-NLS-1$ .append( " + \n" ); //$NON-NLS-1$ String errorMessage = null; if ( e instanceof AxisFault ) { errorMessage = ( (AxisFault) e ).getFaultString( ); } else { errorMessage = e.getLocalizedMessage( ); } if ( errorMessage != null ) { message.append( ParameterAccessor.htmlEncode( errorMessage ) ); } else { message.append( "Unknown error!" ); //$NON-NLS-1$ } message.append( "
\n" ) //$NON-NLS-1$ .append( "
\n" )//$NON-NLS-1$
				.append( ParameterAccessor.htmlEncode( getDetailMessage( e ) ) )
				.append( "
\n" ) //$NON-NLS-1$ .append( "
\n" ) //$NON-NLS-1$ .append( "\n" ); //$NON-NLS-1$ out.write( message.toString( ).getBytes( "UTF-8" ) ); //$NON-NLS-1$ out.flush( ); out.close( ); } /** * Returns the detail message of exception * * @param tx * @return */ public static String getDetailMessage( Throwable tx ) { StringWriter out = new StringWriter( ); PrintWriter print = new PrintWriter( out ); try { tx.printStackTrace( print ); } catch ( Throwable ex ) { } print.flush( ); print.close( ); return out.getBuffer( ).toString( ); } /** * Write message into output stream. * * @param out * @param message * @param msgType * @param isCloseWin */ public static void writeMessage( OutputStream out, String content, String msgType, boolean isCloseWin ) throws IOException { String fontColor = "black"; //$NON-NLS-1$ if ( IBirtConstants.MSG_ERROR.equalsIgnoreCase( msgType ) ) fontColor = "red"; //$NON-NLS-1$ StringBuffer message = new StringBuffer( ); message.append( "" //$NON-NLS-1$ + BirtResources.getMessage( "birt.viewer.title." + msgType ) //$NON-NLS-1$ + "" );//$NON-NLS-1$ message.append( "" ) //$NON-NLS-1$ .append( "
" //$NON-NLS-1$ //$NON-NLS-2$ + content + "
" ); //$NON-NLS-1$ out.write( message.toString( ).getBytes( "UTF-8" ) ); //$NON-NLS-1$ out.flush( ); out.close( ); } /** * Handle print action * * @param request * @param response * @throws Exception */ public static void doPrintAction( InputStream inputStream, HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException, RemoteException { Printer printer = PrintUtility.getPrinter( request ); response.setContentType( "text/html; charset=utf-8" ); //$NON-NLS-1$ if ( printer != null ) { PrintUtility.execPrint( inputStream, printer ); writeMessage( response.getOutputStream( ), BirtResources.getMessage( "birt.viewer.dialog.printserver.complete" ), IBirtConstants.MSG_COMPLETE, true ); //$NON-NLS-1$ } else { writeMessage( response.getOutputStream( ), BirtResources.getMessage( "birt.viewer.dialog.printserver.error.noprinter" ), IBirtConstants.MSG_ERROR, false ); //$NON-NLS-1$ } } /** * Returns toc style from TOCNode * * @param node * @return */ public static String getTOCStyle( TOCNode node ) { if ( node == null ) return null; IScriptStyle scriptStyle = node.getTOCStyle( ); if ( scriptStyle == null ) return null; StringBuffer style = new StringBuffer( ); // background-attachment style.append( getStyle( scriptStyle, "getBackgroundAttachment", //$NON-NLS-1$ "background-attachment" ) ); //$NON-NLS-1$ // background-color style.append( getStyle( scriptStyle, "getBackgroundColor", //$NON-NLS-1$ "background-color" ) ); //$NON-NLS-1$ // background-image style.append( getStyle( scriptStyle, "getBackgroundImage", //$NON-NLS-1$ "background-image" ) ); //$NON-NLS-1$ // background-position-x/y style.append( getStyle( scriptStyle, "getBackgroundPositionX", //$NON-NLS-1$ "background-position-x" ) ); //$NON-NLS-1$ style.append( getStyle( scriptStyle, "getBackgroundPositionY", //$NON-NLS-1$ "background-position-y" ) ); //$NON-NLS-1$ // background-repeat style.append( getStyle( scriptStyle, "getBackgroundRepeat", //$NON-NLS-1$ "background-repeat" ) ); //$NON-NLS-1$ // Border Bottom style.append( getStyle( scriptStyle, "getBorderBottomColor", //$NON-NLS-1$ "border-bottom-color" ) ); //$NON-NLS-1$ style.append( getStyle( scriptStyle, "getBorderBottomStyle", //$NON-NLS-1$ "border-bottom-style" ) ); //$NON-NLS-1$ style.append( getStyle( scriptStyle, "getBorderBottomWidth", //$NON-NLS-1$ "border-bottom-width" ) ); //$NON-NLS-1$ // Border Left style.append( getStyle( scriptStyle, "getBorderLeftColor", //$NON-NLS-1$ "border-left-color" ) ); //$NON-NLS-1$ style.append( getStyle( scriptStyle, "getBorderLeftStyle", //$NON-NLS-1$ "border-left-style" ) ); //$NON-NLS-1$ style.append( getStyle( scriptStyle, "getBorderLeftWidth", //$NON-NLS-1$ "border-left-width" ) ); //$NON-NLS-1$ // Border Right style.append( getStyle( scriptStyle, "getBorderRightColor", //$NON-NLS-1$ "border-right-color" ) );//$NON-NLS-1$ style.append( getStyle( scriptStyle, "getBorderRightStyle",//$NON-NLS-1$ "border-right-style" ) );//$NON-NLS-1$ style.append( getStyle( scriptStyle, "getBorderRightWidth",//$NON-NLS-1$ "border-right-width" ) );//$NON-NLS-1$ // Border Top style.append( getStyle( scriptStyle, "getBorderTopColor", "border-top-color" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getBorderTopStyle", "border-top-style" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getBorderTopWidth", "border-top-width" ) );//$NON-NLS-1$ //$NON-NLS-2$ // font style.append( getStyle( scriptStyle, "getColor", "color" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getFontFamily", "font-family" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getFontSize", "font-size" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getFontStyle", "font-style" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getFontVariant", "font-variant" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getFontWeight", "font-weight" ) );//$NON-NLS-1$ //$NON-NLS-2$ // letter-spacing style.append( getStyle( scriptStyle, "getLetterSpacing", "letter-spacing" ) );//$NON-NLS-1$ //$NON-NLS-2$ // line-height style.append( getStyle( scriptStyle, "getLineHeight", "line-height" ) );//$NON-NLS-1$ //$NON-NLS-2$ // padding style.append( getStyle( scriptStyle, "getPaddingBottom", "padding-bottom" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getPaddingLeft", "padding-left" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getPaddingRight", "padding-right" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getPaddingTop", "padding-top" ) );//$NON-NLS-1$ //$NON-NLS-2$ // Text style.append( getStyle( scriptStyle, "getTextAlign", "text-align" ) );//$NON-NLS-1$ //$NON-NLS-2$ style.append( getStyle( scriptStyle, "getTextTransform", "text-transform" ) );//$NON-NLS-1$ //$NON-NLS-2$ String textDecoration = ""; //$NON-NLS-1$ String textOverline = scriptStyle.getTextOverline( ); if ( textOverline != null && !NONE.equalsIgnoreCase( textOverline ) ) { textDecoration += textOverline + " "; //$NON-NLS-1$ } String textLinethrough = scriptStyle.getTextLineThrough( ); if ( textLinethrough != null && !NONE.equalsIgnoreCase( textLinethrough ) ) { textDecoration += textLinethrough + " "; //$NON-NLS-1$ } String textUnderline = scriptStyle.getTextUnderline( ); if ( textUnderline != null && !NONE.equalsIgnoreCase( textUnderline ) ) { textDecoration += textUnderline + " "; //$NON-NLS-1$ } if ( textDecoration.length( ) > 0 ) style.append( "text-decoration:" + textDecoration + ";" ); //$NON-NLS-1$ //$NON-NLS-2$ // word-spacing style.append( getStyle( scriptStyle, "getWordSpacing", "word-spacing" ) );//$NON-NLS-1$ //$NON-NLS-2$ return style.toString( ); } /** * Returns the CSS text * * @param obj * @param methodName * @param cssAttr * @return */ private static String getStyle( Object obj, String methodName, String cssAttr ) { assert obj != null; assert methodName != null; assert cssAttr != null; String style = invokeGetStyle( obj, methodName ); if ( style == null || NONE.equalsIgnoreCase( style ) ) return ""; //$NON-NLS-1$ return cssAttr + ":" + style + ";"; //$NON-NLS-1$//$NON-NLS-2$ } /** * Invoke GET method * * @param obj * @param methodName * @return */ private static String invokeGetStyle( Object obj, String methodName ) { String style = null; try { Method method = IScriptStyle.class.getMethod( methodName, new Class[]{} ); if ( method == null ) return null; Object value = method.invoke( obj, new Object[]{} ); if ( value != null ) style = (String) value; } catch ( Exception e ) { } return style; } /** * Returns appcontext * * @param request * @return */ public static Map getAppContext( HttpServletRequest request ) { HashMap context = new HashMap( ); Boolean isDesigner = Boolean.valueOf( ParameterAccessor.isDesigner( ) ); context.put( "org.eclipse.birt.data.engine.dataset.cache.option", //$NON-NLS-1$ isDesigner ); context.put( EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request ); // Client DPI setting context.put( EngineConstants.APPCONTEXT_CHART_RESOLUTION, ParameterAccessor.getDpi( request ) ); // Max cube fetch levels // int maxCubeRowLevels = ParameterAccessor.getMaxCubeRowLevels( request // ); // if ( maxCubeRowLevels >= 0 ) // context.put( DataEngine.CUBECUSROR_FETCH_LIMIT_ON_ROW_EDGE, // Integer.valueOf( maxCubeRowLevels ) ); // // int maxCubeColumnLevels = ParameterAccessor.getMaxCubeColumnLevels( // request ); // if ( maxCubeColumnLevels >= 0 ) // context.put( DataEngine.CUBECURSOR_FETCH_LIMIT_ON_COLUMN_EDGE, // Integer.valueOf( maxCubeColumnLevels ) ); // Cube memory size int cubeMemorySize = ParameterAccessor.getCubeMemorySize( request ); if ( cubeMemorySize >= 0 ) context.put( DataEngine.IN_MEMORY_CUBE_SIZE, Integer.valueOf( cubeMemorySize ) ); // add resource path to app context context.put( IBirtConstants.APPCONTEXT_BIRT_RESOURCE_PATH, ParameterAccessor.getResourceFolder( request ) ); // Push user-defined application context ParameterAccessor.pushAppContext( context, request ); if ( isDesigner.booleanValue( ) ) { String appContextName = ParameterAccessor.getAppContextName( request ); getAppContextFromExtension( appContextName, context ); } return context; } /** * Find toc id from document instance by name * * @param doc * @param name * @param options * @return */ public static String findTocByName( IReportDocument doc, String name, InputOptions options ) { if ( doc == null || name == null ) return null; String tocid = null; // get locale information Locale locale = null; TimeZone timeZone = null; if ( options != null ) { locale = (Locale) options.getOption( InputOptions.OPT_LOCALE ); timeZone = (TimeZone) options.getOption( InputOptions.OPT_TIMEZONE ); } if ( locale == null ) locale = Locale.getDefault( ); // get TOC tree ITOCTree tocTree = null; if ( timeZone != null ) { tocTree = doc.getTOCTree( DesignChoiceConstants.FORMAT_TYPE_VIEWER, ULocale.forLocale( locale ), BirtUtility.toICUTimeZone( timeZone ) ); } else { tocTree = doc.getTOCTree( DesignChoiceConstants.FORMAT_TYPE_VIEWER, ULocale.forLocale( locale ) ); } if ( tocTree == null ) return null; List tocList = tocTree.findTOCByValue( name ); if ( tocList != null && tocList.size( ) > 0 ) tocid = ( (TOCNode) tocList.get( 0 ) ).getBookmark( ); return tocid; } /** * Output file content * * @param filePath * @param out * @param isDelete * @exception IOException */ public static void outputFile( String filePath, OutputStream out, boolean isDelete ) throws IOException { if ( filePath == null ) return; File file = new File( filePath ); if ( !file.exists( ) ) return; FileInputStream in = new FileInputStream( file ); try { byte[] buf = new byte[512]; int len = 0; while ( ( len = in.read( buf ) ) > 0 ) { out.write( buf, 0, len ); } out.flush( ); } finally { in.close( ); try { if ( isDelete ) file.delete( ); } catch ( Exception e ) { } } } /** * Get current resource system id * * @param request * @return */ private static String getSystemId( HttpServletRequest request ) { String systemId = null; ViewerAttributeBean attrBean = (ViewerAttributeBean) request.getAttribute( IBirtConstants.ATTRIBUTE_BEAN ); if ( attrBean != null ) systemId = attrBean.getReportDesignName( ); return systemId; } /** * Log error message in problem view * * @param systemId * @param message * @param elementId * @param lineNumber */ private static void error( String systemId, String message, long elementId, int lineNumber ) { try { Class clz = Class.forName( "org.eclipse.birt.report.viewer.utilities.MarkerUtil" ); //$NON-NLS-1$ if ( clz != null ) { Method mt = clz.getMethod( "error", new Class[]{//$NON-NLS-1$ String.class, String.class, long.class, int.class } ); if ( mt != null ) mt.invoke( null, new Object[]{ systemId, message, Long.valueOf( elementId ), Integer.valueOf( lineNumber ) } ); } } catch ( Exception e ) { } } /** * Log engine error message in problem view * * @param request * @param moduleHandle * @param errors */ public static void error( HttpServletRequest request, List errors ) { String systemId = getSystemId( request ); if ( systemId == null ) return; String isCleared = (String) request.getAttribute( VIEWER_MARKER_CLEARED ); if ( isCleared == null ) { // clear the errors clearErrors( systemId ); request.setAttribute( VIEWER_MARKER_CLEARED, "true" ); //$NON-NLS-1$ } // no error if ( errors == null || errors.size( ) <= 0 ) return; Iterator it = errors.iterator( ); while ( it.hasNext( ) ) { Exception e = (Exception) it.next( ); if ( e != null ) { int lineno = IBirtConstants.UNKNOWN_POSITION; long elementId = 0; // If EngineException ,get the lineno if ( e instanceof EngineException ) { try { Map options = getModuleOptions( request ); options.put( IModuleOption.MARK_LINE_NUMBER_KEY, Boolean.TRUE ); IReportRunnable reportRunnable = BirtUtility.getRunnableFromDesignFile( request, systemId, options ); if ( reportRunnable != null ) { ModuleHandle moduleHandle = reportRunnable.getDesignHandle( ) .getModuleHandle( ); elementId = ( (EngineException) e ).getElementID( ); Object obj = moduleHandle.getElementByID( elementId ); lineno = moduleHandle.getLineNo( obj ); } } catch ( Exception err ) { } } error( systemId, getDetailMessage( e ), elementId, lineno ); } } } /** * clear all errors related current resource in problem view * * @param systemId */ private static void clearErrors( String systemId ) { try { Class clz = Class.forName( "org.eclipse.birt.report.viewer.utilities.MarkerUtil" ); //$NON-NLS-1$ if ( clz != null ) { Method mt = clz.getMethod( "clear", new Class[]{//$NON-NLS-1$ String.class } ); if ( mt != null ) mt.invoke( null, new Object[]{ systemId } ); } } catch ( Exception e ) { } } /** * Returns the application classloader * * @return ClassLoader */ public static ClassLoader getAppClassLoader( ) { ClassLoader classLoader = null; try { Class clz = Class.forName( "org.eclipse.birt.report.viewer.utilities.WebViewer" ); //$NON-NLS-1$ if ( clz != null ) { Method mt = clz.getMethod( "getAppClassLoader", new Class[]{//$NON-NLS-1$ } ); if ( mt != null ) classLoader = (ClassLoader) mt.invoke( null, new Object[]{} ); } } catch ( Exception e ) { } return classLoader; } /** * @return Returns the user specified app context */ public static Map getAppContext( Map context ) { String appContextName = null; try { Class clz = Class.forName( "org.eclipse.birt.report.viewer.utilities.WebViewer" ); //$NON-NLS-1$ if ( clz != null ) { Method mt = clz.getMethod( "getAppContextName", (Class[]) null ); //$NON-NLS-1$ if ( mt != null ) { appContextName = (String) mt.invoke( null, (Object[]) null ); } } } catch ( Exception e ) { } if ( appContextName != null ) { return getAppContextFromExtension( appContextName, context ); } return context; } /** * Get the appcontext from extension * * @param appContextName * @param context * @return */ private static Map getAppContextFromExtension( String appContextName, Map context ) { try { Class clz = Class.forName( "org.eclipse.birt.report.viewer.utilities.AppContextUtil" ); //$NON-NLS-1$ if ( clz != null ) { Method mt = clz.getMethod( "getAppContext", new Class[]{//$NON-NLS-1$ String.class, Map.class } ); if ( mt != null ) context = (Map) mt.invoke( null, new Object[]{ appContextName, context } ); } } catch ( Exception e ) { } return context; } /** * Converts a Java time zone to an ICU time zone. * * @param timeZone * Java time zone * @return ICU time zone */ public static com.ibm.icu.util.TimeZone toICUTimeZone( java.util.TimeZone timeZone ) { if ( timeZone != null ) { return com.ibm.icu.util.TimeZone.getTimeZone( timeZone.getID( ) ); } else { return null; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy