`
JadeLuo
  • 浏览: 430209 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

ReportEngineService

    博客分类:
  • birt
阅读更多

http://dev.eclipse.org/viewcvs/viewvc.cgi/source/org.eclipse.birt.report.viewer/birt/WEB-INF/classes/org/eclipse/birt/report/services/ReportEngineService.java?view=co&revision=1.41&root=BIRT_Project

 

http://www.eclipse.org/birt/phoenix/deploy/reportEngineAPI.php

 

/*************************************************************************************
 * 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.services;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.xml.namespace.QName;

import org.apache.axis.AxisFault;
import org.eclipse.birt.core.data.DataType;
import org.eclipse.birt.core.data.DataTypeUtil;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.IPlatformContext;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.data.engine.api.DataEngine;
import org.eclipse.birt.data.engine.api.IResultMetaData;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.HTMLActionHandler;
import org.eclipse.birt.report.engine.api.HTMLEmitterConfig;
import org.eclipse.birt.report.engine.api.HTMLRenderContext;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.HTMLServerImageHandler;
import org.eclipse.birt.report.engine.api.IDataExtractionTask;
import org.eclipse.birt.report.engine.api.IDataIterator;
import org.eclipse.birt.report.engine.api.IExtractionResults;
import org.eclipse.birt.report.engine.api.IGetParameterDefinitionTask;
import org.eclipse.birt.report.engine.api.IRenderTask;
import org.eclipse.birt.report.engine.api.IReportDocument;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.IRunTask;
import org.eclipse.birt.report.engine.api.IScalarParameterDefn;
import org.eclipse.birt.report.engine.api.PDFRenderContext;
import org.eclipse.birt.report.engine.api.ReportEngine;
import org.eclipse.birt.report.engine.api.ReportParameterConverter;
import org.eclipse.birt.report.engine.api.impl.IResultSetItem;
import org.eclipse.birt.report.engine.api.impl.ScalarParameterDefn;
import org.eclipse.birt.report.engine.script.internal.ScriptExecutor;
import org.eclipse.birt.report.model.api.ScalarParameterHandle;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.soapengine.IBirtConstants;
import org.eclipse.birt.report.soapengine.api.Column;
import org.eclipse.birt.report.soapengine.api.ResultSet;
import org.eclipse.birt.report.viewer.utilities.ParameterAccessor;

public class ReportEngineService
{
	private static ReportEngineService instance;
	
	/**
	 * Report engine instance.
	 */
	private ReportEngine engine = null;
	
	/**
	 * Static engine config instance.
	 */
	private EngineConfig config = null;

	/**
	 * Image directory for report images and charts.
	 */
	private String imageDirectory = null;
    
	/**
	 * URL accesses images.
	 */
	private String imageBaseUrl = null;

	/**
     * Image handler instance.
     */
	private HTMLServerImageHandler imageHandler = null;

	/**
	 * Web app context path.
	 */
	private String contextPath = null;
    
	/**
	 * Constructor.
	 * 
	 * @param config
	 */
	public ReportEngineService( ServletConfig config )
	{
		initEngineInstance( config );
		ReportEngineService.instance = this;
	}
	
	/**
	 * Get engine instance.
	 * 
	 * @return
	 */
	synchronized public static ReportEngineService getInstance( )
	{
		return instance;
	}
	
    /**
	 * Get engine instance.
	 * 
	 * @return engine instance
	 */
	synchronized private void initEngineInstance( ServletConfig servletConfig )
	{
		System.setProperty( "RUN_UNDER_ECLIPSE", "false" ); //$NON-NLS-1$ //$NON-NLS-2$

		if ( servletConfig == null )
		{
			return;
		}
		
		config = new EngineConfig( );

		// Register new image handler
        HTMLEmitterConfig emitterConfig = new HTMLEmitterConfig( );
        emitterConfig.setActionHandler( new HTMLActionHandler( ) );
        imageHandler = new HTMLServerImageHandler( );
        emitterConfig.setImageHandler( imageHandler );
        config.getEmitterConfigs( ).put( "html", emitterConfig ); //$NON-NLS-1$

		// Prepare image directory.
		imageDirectory =  servletConfig.getServletContext( ).getInitParameter( ParameterAccessor.INIT_PARAM_IMAGE_DIR );
		
		if ( imageDirectory == null 
				|| imageDirectory.trim( ).length( ) <= 0
				|| ParameterAccessor.isRelativePath( imageDirectory ) )
		{
			imageDirectory = servletConfig.getServletContext( ).getRealPath( "/report/images" ); //$NON-NLS-1$
		}
		
		// Prepare image base url.
		imageBaseUrl = "/run?__imageID="; //$NON-NLS-1$
	    
		// Prepare log directory.
	    String logDirectory =  servletConfig.getServletContext( ).getInitParameter( ParameterAccessor.INIT_PARAM_LOG_DIR );
		
		if ( logDirectory == null 
				|| logDirectory.trim( ).length( ) <= 0
				|| ParameterAccessor.isRelativePath( logDirectory ) )
		{
			logDirectory = servletConfig.getServletContext( ).getRealPath( "/logs" ); //$NON-NLS-1$
		}

		// Prepare log level.
	    String logLevel =  servletConfig.getServletContext( ).getInitParameter( ParameterAccessor.INIT_PARAM_LOG_LEVEL );
	    Level level = Level.OFF;
	    if ( "SEVERE".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.SEVERE;
	    }
	    else if ( "WARNING".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.WARNING;
	    }
	    else if ( "INFO".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.INFO;
	    }
	    else if ( "CONFIG".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.CONFIG;
	    }
	    else if ( "FINE".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.FINE;
	    }
	    else if ( "FINER".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.FINER;
	    }
	    else if ( "FINEST".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.FINEST;
	    }
	    else if ( "OFF".equalsIgnoreCase( logLevel ) ) //$NON-NLS-1$
	    {
	    	level = Level.OFF;
	    }
        config.setLogConfig( logDirectory, level );
        
        // Prepare ScriptLib location
        String scriptLibDir =  servletConfig.getServletContext( ).getInitParameter( ParameterAccessor.INIT_PARAM_SCRIPTLIB_DIR );		
		if ( scriptLibDir == null || 
			 scriptLibDir.trim( ).length( ) <= 0 ||
			 ParameterAccessor.isRelativePath( scriptLibDir ) )
		{
			scriptLibDir = servletConfig.getServletContext( ).getRealPath( "/scriptlib" ); //$NON-NLS-1$
		}
		
		ArrayList jarFileList = new ArrayList();
		if ( scriptLibDir != null )
		{
			File dir = new File( scriptLibDir );
			getAllJarFiles( dir, jarFileList );
		}
		
		String scriptlibClassPath = ""; //$NON-NLS-1$
		for ( int i=0; i<jarFileList.size(); i++ )
			scriptlibClassPath += ScriptExecutor.PROPERTYSEPARATOR + ((File)jarFileList.get(i)).getAbsolutePath();
		
		if ( scriptlibClassPath.startsWith(ScriptExecutor.PROPERTYSEPARATOR) )
			scriptlibClassPath = scriptlibClassPath.substring( ScriptExecutor.PROPERTYSEPARATOR.length() );
		
		System.setProperty( ScriptExecutor.WEBAPP_CLASSPATH_KEY, scriptlibClassPath );
	}
	
	/**
	 * Get all the files under the specified folder (including all the files under sub-folders)
	 * @param dir - the folder to look into
	 * @param fileList - the fileList to be returned
	 */
	private void getAllJarFiles( File dir, ArrayList fileList )
	{
		if ( dir.exists() &&
			 dir.isDirectory() )
		{
			File[] files = dir.listFiles();
			if ( files == null )
				return;

			for ( int i=0; i<files.length; i++ )
			{
				File file = files[i];
				if ( file.isFile() )
				{
					 if ( file.getName().endsWith(".jar") ) //$NON-NLS-1$
					 	fileList.add( file );
				}
				else if ( file.isDirectory() )
				{
					getAllJarFiles( file, fileList );
				}
			}
		}
	}
	
	/**
	 * Set Engine context.
	 * 
	 * @param servletContext
	 * @param request
	 */
	synchronized public void setEngineContext( ServletContext servletContext, HttpServletRequest request )
	{
	    if ( engine == null )
		{
	    	String url = request.getRequestURL( ).toString( );
	    	this.contextPath = request.getContextPath( );
	    	url = url.substring( 0, url.indexOf( contextPath, url.indexOf( "/" ) ) ) + contextPath; //$NON-NLS-1$
	    	
            config.setEngineHome( "" ); //$NON-NLS-1$
            IPlatformContext context = new PlatformServletContext( servletContext, url );
            config.setEngineContext( context );
			
			engine = new ReportEngine( config );
		}
	}

	/**
	 * Open report design.
	 * 
	 * @param report
	 * @return
	 */
	synchronized public IReportRunnable openReportDesign( String report ) throws EngineException
	{
		return engine.openReportDesign( report );
	}

	/**
	 * createGetParameterDefinitionTask.
	 * 
	 * @param runnable
	 * @return
	 */
	synchronized public IGetParameterDefinitionTask createGetParameterDefinitionTask( IReportRunnable runnable )
	{
		IGetParameterDefinitionTask task = null;
		
		try
		{
			task = engine.createGetParameterDefinitionTask( runnable );
		}
		catch ( Exception e )
		{
		}
		
		return task;
	}

	/**
	 * Open report document from archive,
	 * 
	 * @param docName - the name of the report document
	 * @return
	 */
	synchronized public IReportDocument openReportDocument( String docName )
	{
		
		IReportDocument document = null;
		
		try
		{
			document = engine.openReportDocument( docName );
		}
		catch ( Exception e )
		{
		}
		
		return document;
	}

	/**
	 * Render image.
	 * 
	 * @param imageId
	 * @param outputStream
	 * @throws EngineException
	 */
	synchronized public void renderImage( String imageId, ServletOutputStream outputStream ) throws RemoteException
	{
		assert ( this.imageHandler != null );
		
		try
		{
			this.imageHandler.getImage( outputStream, this.imageDirectory, imageId );
		}
		catch ( EngineException e )
		{
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.renderImage( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}

	}
	
	/**
	 * Create HTML render context.
	 * 
	 * @param svgFlag
	 * @return
	 */
	synchronized private HTMLRenderContext createHTMLrenderContext(	boolean svgFlag )
	{
		HTMLRenderContext renderContext = new HTMLRenderContext( );
		renderContext.setImageDirectory( imageDirectory );
		renderContext.setBaseImageURL( contextPath + imageBaseUrl );
		renderContext.setBaseURL( this.contextPath + "/frameset" ); //$NON-NLS-1$
		renderContext.setSupportedImageFormats( svgFlag ? "PNG;GIF;JPG;BMP;SVG" : "PNG;GIF;JPG;BMP" ); //$NON-NLS-1$ //$NON-NLS-2$
		return renderContext;
	}
	
	/**
	 * Create PDF render context.
	 * 
	 * @return
	 */
	synchronized private PDFRenderContext createPDFrenderContext( )
	{
		PDFRenderContext renderContext = new PDFRenderContext( );
		renderContext.setBaseURL( this.contextPath + "/frameset" ); //$NON-NLS-1$
		renderContext.setSupportedImageFormats( "PNG;GIF;JPG;BMP" ); //$NON-NLS-1$
		return renderContext;
	}

	/**
	 * Run and render a report,
	 * 
	 * @param runnable
	 * @param outputStream
	 * @param format
	 * @param locale
	 * @param parameters
	 * @param svgFlag
	 * @throws IOException
	 */
	synchronized public void runAndRenderReport( HttpServletRequest request, IReportRunnable runnable,
			ServletOutputStream outputStream, String format, Locale locale, HashMap parameters,
			boolean masterPage, boolean svgFlag ) throws RemoteException
	{
		assert runnable != null;
		
		// Render options
		HTMLRenderOption option = new HTMLRenderOption( );
		option.setOutputStream( outputStream );
		option.setOutputFormat( format );
		option.setMasterPageContent( masterPage );

		IRunAndRenderTask runAndRenderTask = engine.createRunAndRenderTask( runnable );
		runAndRenderTask.setLocale( locale );
		runAndRenderTask.setParameterValues( parameters );
		runAndRenderTask.setRenderOption( option );
		
		HashMap context = new HashMap( );
		
		context.put( DataEngine.DATASET_CACHE_OPTION, Boolean.TRUE );
		context.put( EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request );
		context.put( EngineConstants.APPCONTEXT_CLASSLOADER_KEY, ReportEngineService.class.getClassLoader());
		
		if ( !ParameterAccessor.PARAM_FORMAT_PDF.equalsIgnoreCase( format ) )
		{
			context.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, createHTMLrenderContext( svgFlag ) );
		}
		else
		{
			context.put( EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, createPDFrenderContext( ) );
		}

		runAndRenderTask.setAppContext( context );
		
		try
		{
			runAndRenderTask.run( );
		}
		catch ( BirtException e )
		{
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.runAndRenderReport( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}
		finally
		{
			runAndRenderTask.close( );
		}
	}

	/**
	 * Run report.
	 * 
	 * @param runnable
	 * @param archive
	 * @param documentName
	 * @param locale
	 * @param parameters
	 * @throws RemoteException
	 */
	synchronized public void runReport( HttpServletRequest request, IReportRunnable runnable,
		String documentName, Locale locale, HashMap parameters ) throws RemoteException
	{
		assert runnable != null;
		
		// Preapre the run report task.
		IRunTask runTask = engine.createRunTask( runnable );
		runTask.setLocale( locale );
		runTask.setParameterValues( parameters );
		
		HashMap context = new HashMap( );
		context.put( DataEngine.DATASET_CACHE_OPTION, Boolean.TRUE );
		context.put( EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request );
		context.put( EngineConstants.APPCONTEXT_CLASSLOADER_KEY, ReportEngineService.class.getClassLoader());
		runTask.setAppContext( context );
		
		// Run report.
		try
		{
			runTask.run( documentName );
		}
		catch ( BirtException e )
		{
			// Any Birt exception.
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.runReport( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}
		finally
		{
			runTask.close( );
		}		
	}
	
	/**
	 * Render report page.
	 * 
	 * @param reportDocument
	 * @param pageNumber
	 * @param svgFlag
	 * @return report page content
	 * @throws RemoteException
	 */
	synchronized public ByteArrayOutputStream renderReport( HttpServletRequest request, IReportDocument reportDocument,
			long pageNumber, boolean masterPage, boolean svgFlag, List activeIds, Locale locale ) throws RemoteException
	{
		assert reportDocument != null;
		assert pageNumber > 0 && pageNumber < reportDocument.getPageCount( );
		
		ByteArrayOutputStream out = new ByteArrayOutputStream( );
		
		// Create render task.
		IRenderTask renderTask = engine.createRenderTask( reportDocument );
		
		HashMap context = new HashMap( );
		context.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, createHTMLrenderContext( svgFlag ) );
		context.put( EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request );
		context.put( EngineConstants.APPCONTEXT_CLASSLOADER_KEY, ReportEngineService.class.getClassLoader());
		renderTask.setAppContext( context );

		// Render option
		HTMLRenderOption setting = new HTMLRenderOption( );
		setting.setOutputStream( out );
		setting.setOutputFormat( IBirtConstants.RENDERFORMAT );
		setting.setEmbeddable( true );
		setting.setInstanceIDs( activeIds );
		setting.setMasterPageContent( masterPage );
		setting.setActionHandle( new ViewerHTMLActionHandler( reportDocument, pageNumber) );
		
		renderTask.setRenderOption( setting );
		renderTask.setLocale( locale );
		
		// Render designated page.
		try
		{
			renderTask.render( pageNumber );
		}
		catch ( BirtException e )
		{
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.renderReport( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}
		catch ( Exception e )
		{
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.renderReport( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}
		finally
		{
			renderTask.close( );
		}
		
		return out;
	}
	
	/**
	 * Get query result sets.
	 * 
	 * @param document
	 * @return
	 * @throws RemoteException
	 */
	synchronized public ResultSet[] getResultSets( IReportDocument document ) throws RemoteException
	{
		assert document != null;
		
		ResultSet[] resultSetArray = null;
		IDataExtractionTask dataTask = engine.createDataExtractionTask( document );
		
		try
		{
			List resultSets = dataTask.getResultSetList( );
	
			if ( resultSets != null && resultSets.size( ) > 0 )
			{
				resultSetArray = new ResultSet[resultSets.size( )];
				for ( int k = 0; k < resultSets.size( ); k++ )
				{
					resultSetArray[k] = new ResultSet( );
					IResultSetItem resultSetItem = ( IResultSetItem ) resultSets.get( k );
					assert resultSetItem != null;
					
					resultSetArray[k].setQueryName( resultSetItem.getResultSetName( ) );
					
					IResultMetaData metaData = resultSetItem.getResultMetaData( );
					assert metaData != null;
					
					Column[] columnArray = new Column[metaData.getColumnCount( )];
					for ( int i = 0; i < metaData.getColumnCount( ); i++ )
					{
						columnArray[i] = new Column( );
						
						String name = metaData.getColumnName( i );
						columnArray[i].setName( name );
						
						String label = metaData.getColumnLabel( i );
						if ( label == null || label.length( ) <= 0 )
						{
							label = name;
						}
						columnArray[i].setLabel( label );
						
						columnArray[i].setVisibility( new Boolean( true ) );
					}
					resultSetArray[k].setColumn( columnArray );
				}
			}
		}
		catch ( BirtException e )
		{
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.getMetaData( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}
		catch ( Exception e )
		{
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.getMetaData( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}
		finally
		{
			dataTask.close( );
		}

		return resultSetArray;
	}
	
	/**
	 * Extract data.
	 * 
	 * @param document
	 * @param id
	 * @param columns
	 * @param filters
	 * @param locale
	 * @param outputStream
	 * @throws RemoteException
	 */
	synchronized public void extractData( IReportDocument document, String resultSetName, Collection columns,
			Locale locale, ServletOutputStream outputStream ) throws RemoteException
	{
		assert document != null;
		assert resultSetName != null && resultSetName.length( ) > 0;
		assert columns != null && !columns.isEmpty( );
		
		String[] columnNames = new String[columns.size( )];
		Iterator iSelectedColumns = columns.iterator( );
		for ( int i = 0; iSelectedColumns.hasNext( ); i++ )
		{
			columnNames[i] = ( String ) iSelectedColumns.next( );
		}

		IDataExtractionTask dataTask = null;
		IExtractionResults result = null;
		IDataIterator iData = null;
		try
		{
			dataTask = engine.createDataExtractionTask( document );
			dataTask.selectResultSet( resultSetName );
			dataTask.selectColumns( columnNames );
			dataTask.setLocale( locale );
			
			result = dataTask.extract( );
			if ( result != null )
			{
				IResultMetaData iMetaData = result.getResultMetaData( );
				iData = result.nextResultIterator( );
				
				if ( iData != null && iMetaData != null )
				{
					StringBuffer buf = new StringBuffer( );

					//	Captions
					String caption = iMetaData.getColumnLabel( 0 );
					if ( caption != null )
					{
						buf.append( caption );
					}
					else
					{
						buf.append( iMetaData.getColumnName( 0 ) );
					}
					
					for ( int i = 1; i < columnNames.length; i++ )
					{
						buf.append( ',' ); //$NON-NLS-1$
						caption = iMetaData.getColumnLabel( i );
						if ( caption != null )
						{
							buf.append( caption );
						}
						else
						{
							buf.append( iMetaData.getColumnName( i ) );
						}
					}
					
					outputStream.println( buf.toString( ) );
					buf.delete( 0, buf.length( ) );

					// Data
					while ( iData.next( ) )
					{
						String value = null;
						
						try
						{
							value = cvsConvertor( ( String ) DataTypeUtil
									.convert( iData.getValue( columnNames[0] ), DataType.STRING_TYPE ) );
						}
						catch ( Exception e )
						{
							value = null;
						}

						if ( value != null )
						{
							buf.append( value );
						}
						
						for ( int i = 1; i < columnNames.length; i++ )
						{
							buf.append( ',' ); //$NON-NLS-1$
							
							try
							{
								value = cvsConvertor( ( String ) DataTypeUtil
										.convert( iData.getValue( columnNames[i] ), DataType.STRING_TYPE ) );
							}
							catch ( Exception e )
							{
								value = null;
							}
							
							if ( value != null )
							{
								buf.append( value );
							}
						}
						
						outputStream.println( buf.toString( ) );
						buf.delete( 0, buf.length( ) );
					}
				}
			}
		}
		catch( Exception e )
		{
			AxisFault fault = new AxisFault( );
			fault.setFaultCode( new QName( "ReportEngineService.extractData( )" ) ); //$NON-NLS-1$
			fault.setFaultString( e.getLocalizedMessage( ) );
			throw fault;
		}
		finally
		{
			if ( iData != null )
			{
				iData.close( );
			}

			if ( result != null )
			{
				result.close( );
			}
			
			if ( dataTask != null )
			{
				dataTask.close( );
			}
		}
	}
	
	/**
	 * CSV format convertor. Here is the rule.
	 * 
	 * 	1) Fields with embedded commas must be delimited with double-quote characters.
	 * 	2) Fields that contain double quote characters must be surounded by double-quotes, and
	 * 	   the embedded double-quotes must each be represented by a pair of consecutive double quotes.
	 * 	3) A field that contains embedded line-breaks must be surounded by double-quotes.
	 * 	4) Fields with leading or trailing spaces must be delimited with double-quote characters.
	 *  
	 * @param value
	 * @return
	 * @throws RemoteException
	 */
	synchronized private String cvsConvertor( String value ) throws RemoteException
	{
		if ( value == null )
		{
			return null;
		}
		
		value = value.replaceAll( "\"", "\"\"" ); //$NON-NLS-1$  //$NON-NLS-2$
		
		boolean needQuote = false;
		needQuote = ( value.indexOf( ',' ) != -1 ) || ( value.indexOf( '"' ) != -1 ) //$NON-NLS-1$ //$NON-NLS-2$
			|| ( value.indexOf( 0x0A ) != -1 ) || value.startsWith( " " ) || value.endsWith( " " );  //$NON-NLS-1$ //$NON-NLS-2$
		value = needQuote ? "\"" + value + "\"" : value;  //$NON-NLS-1$ //$NON-NLS-2$
		
		return value;
	}
	
	/**
	 * Prepare the report parameters.
	 * 
	 * @param request
	 * @param task
	 * @param configVars
	 * @param locale
	 * @return
	 */
	synchronized public HashMap parseParameters( HttpServletRequest request, IGetParameterDefinitionTask task,
			Map configVars, Locale locale )
	{
		assert task != null;
		HashMap params = new HashMap( );

		Collection parameterList = task.getParameterDefns( false );
		for ( Iterator iter = parameterList.iterator( ); iter.hasNext( ); )
		{
			ScalarParameterDefn parameterObj = ( ScalarParameterDefn ) iter.next( );

			String paramValue = null;
			Object paramValueObj = null;

			ScalarParameterHandle paramHandle = (ScalarParameterHandle) parameterObj.getHandle( );
			String paramName = paramHandle.getName( );
			String format = paramHandle.getFormat( );

			// Get default value from task
			ReportParameterConverter converter = new ReportParameterConverter( format, locale );

			if ( ParameterAccessor.isReportParameterExist( request, paramName ) )
			{
				// Get value from http request
				paramValue = ParameterAccessor.getReportParameter( request, paramName, paramValue );
				paramValueObj = converter.parse( paramValue, getEngineDataType( paramHandle.getDataType( ) ) );
			}
			else if ( ParameterAccessor.isDesigner( request ) && configVars.containsKey( paramName ) )
			{
				// Get value from test config
				String configValue = (String) configVars.get( paramName );
				ReportParameterConverter cfgConverter = new ReportParameterConverter( format, Locale.US );
				paramValueObj = cfgConverter.parse( configValue, getEngineDataType( paramHandle.getDataType( ) ) );
			}
			else
			{
				paramValueObj = task.getDefaultValue( paramHandle.getName( ) );
			}

			params.put( paramName, paramValueObj );
		}

		return params;
	}
	
	/**
	 * Check whether missing parameter or not.
	 * 
	 * @param task
	 * @param parameters
	 * @return
	 */
	synchronized public boolean validateParameters( IGetParameterDefinitionTask task, Map parameters )
	{
		assert task != null;
		assert parameters != null;

		boolean missingParameter = false;
		
		Collection parameterList = task.getParameterDefns( false );
		for ( Iterator iter = parameterList.iterator( ); iter.hasNext( ); )
		{
			ScalarParameterDefn parameterObj = ( ScalarParameterDefn ) iter.next( );
			ScalarParameterHandle paramHandle = (ScalarParameterHandle) parameterObj.getHandle( );
			
			String parameterName = paramHandle.getName( );
			Object parameterValue = parameters.get( parameterName );

			if ( paramHandle.isHidden( ) )
			{
				continue;
			}
			
			if ( parameterValue == null && !paramHandle.allowNull( ) )
			{
				missingParameter = true;
				break;
			}
			
			if ( DesignChoiceConstants.PARAM_TYPE_STRING.equals( paramHandle.getDataType( ) ) )
			{
				String parameterStringValue = ( String ) parameterValue;
				if ( parameterStringValue != null && parameterStringValue.length( ) <= 0 && !paramHandle.allowBlank( ) )
				{
					missingParameter = true;
					break;
				}
			}
		}

		return missingParameter;
	}

	/**
	 * Parameter typer convertion.
	 * 
	 * @param type
	 * @return
	 */
	synchronized public int getEngineDataType( String type )
	{
		if ( DesignChoiceConstants.PARAM_TYPE_BOOLEAN.equals( type ) )
		{
			return IScalarParameterDefn.TYPE_BOOLEAN;
		}
		else if ( DesignChoiceConstants.PARAM_TYPE_DATETIME.equals( type ) )
		{
			return IScalarParameterDefn.TYPE_DATE_TIME;
		}
		else if ( DesignChoiceConstants.PARAM_TYPE_DECIMAL.equals( type ) )
		{
			return IScalarParameterDefn.TYPE_DECIMAL;
		}
		else if ( DesignChoiceConstants.PARAM_TYPE_FLOAT.equals( type ) )
		{
			return IScalarParameterDefn.TYPE_FLOAT;
		}
		else if ( DesignChoiceConstants.PARAM_TYPE_STRING.equals( type ) )
		{
			return IScalarParameterDefn.TYPE_STRING;
		}
		return IScalarParameterDefn.TYPE_ANY;
	}
}
分享到:
评论

相关推荐

    birt报表 API 实例 2.rar

    通过`ReportEngineService`,可以在Java EE环境中提供报表服务,用户可以通过HTTP请求获取报表。另外,也可以通过`ReportAppServlet`在独立的Web应用中部署BIRT报表服务器。 6. **实例分析**:压缩包中的"birt报表...

    SOH-SVM算法:斑点鬣狗优化技术对支持向量机的改进与解析,优化算法助力机器学习:SOH-SVM改进及源码解析与参考,SOH-SVM:斑点鬣狗优化算法改进支持向量机:SOH-SVM 代码有注释,附

    SOH-SVM算法:斑点鬣狗优化技术对支持向量机的改进与解析,优化算法助力机器学习:SOH-SVM改进及源码解析与参考,SOH-SVM:斑点鬣狗优化算法改进支持向量机:SOH-SVM。 代码有注释,附源码和参考文献,便于新手理解,~ ,SOH-SVM; 斑点鬣狗优化算法; 代码注释; 源码; 参考文献,SOH-SVM算法优化:附详解代码与参考

    美赛教程&建模&数据分析&案例分析

    美赛教程&建模&数据分析&案例分析

    GESPC++3级大纲

    GESPC++3级大纲

    电动汽车充电负荷预测:基于出行链分析与OD矩阵的蒙特卡洛模拟研究,电动汽车充电负荷预测:基于出行链分析与OD矩阵的蒙特卡洛模拟方法,电动汽车充电负荷预测,出行链,OD矩阵,蒙特卡洛模拟 ,电动汽车充电

    电动汽车充电负荷预测:基于出行链分析与OD矩阵的蒙特卡洛模拟研究,电动汽车充电负荷预测:基于出行链分析与OD矩阵的蒙特卡洛模拟方法,电动汽车充电负荷预测,出行链,OD矩阵,蒙特卡洛模拟 ,电动汽车充电负荷预测; 出行链; OD矩阵; 蒙特卡洛模拟,基于出行链的电动汽车充电负荷预测研究:蒙特卡洛模拟与OD矩阵分析

    柯尼卡美能达Konica Minolta bizhub 205i 驱动

    柯尼卡美能达Konica Minolta bizhub 205i 驱动

    电气工程中的示波器应用:从基础实验到进阶项目的详细指南

    内容概要:本文全面介绍使用示波器进行一系列电学实验和项目的内容。从基础实验,如示波器的操作入门和常见波形的测量,再到进阶部分,比如电路故障排除与复杂项目设计,旨在帮助学生掌握示波器的各项技能。文中不仅提供了详尽的操作流程指导,还包括针对每个阶段的学习目标设定、预期成果评估和所需注意事项。最终通过对示波器的深入理解和熟练运用,在实际应用场景(如构造简单设备或是进行音频处理)达到创新解决问题的目的。 适用人群:面向有志于深入理解电工仪器及其应用的学生或者技术人员,尤其是刚开始接触或正在强化自己这方面能力的学习者。 使用场景及目标:①作为培训材料支持初学者快速上手专业级电工测试设备—示波器;②用于教学环节辅助讲解电学概念以及实际操作技巧;③鼓励用户参与更高层次的DIY工程任务从而培养解决问题的能力.

    ntc热敏电阻 MF52AT 10K 3950精度1%STM32采集带数字滤波

    标题中的“ntc热敏电阻 MF52AT 10K 3950精度1%STM32采集带数字滤波”表明我们要讨论的是一个使用STM32微控制器进行数据采集的系统,该系统中包含NTC热敏电阻MF52AT作为温度传感器。NTC热敏电阻是一种负温度系数的电阻器,其阻值随温度升高而降低。MF52AT型号的热敏电阻具有10K欧姆的标称电阻和3950的B值,表示在特定温度下(通常为25℃)的阻值和温度特性曲线。精度1%意味着该电阻的阻值有1%的允许误差,这对于温度测量应用来说是相当高的精度。 描述中提到的“MF52AT热敏电阻STM32数据采集2路”,暗示我们有两个这样的热敏电阻连接到STM32微控制器的模拟输入端口,用于采集温度数据。STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于各种嵌入式系统中,包括温度监测等应用。由于STM32内部集成了多个ADC(模拟数字转换器),因此它可以同时处理多路模拟输入信号。 "带滤波,项目中实际运用,温差范围在±0.5度",这表明在实际应用中,数据采集系统采用了某种数字滤波技术来提高信号质量,可能是低通滤波、滑动平均滤波或更复杂的数字信号处理算法。

    Spring+SpringMVC+Mybatis框架整合例子——亲测可用.zip

    SSM框架整合是Java开发中常见的技术栈,包括Spring、SpringMVC和Mybatis三个核心组件。这个压缩包提供了一个已经验证过的整合示例,帮助开发者理解和实践这三大框架的协同工作。 Spring框架是Java企业级应用的基石,它提供了一种依赖注入(Dependency Injection,DI)的方式,使得对象之间的依赖关系得以解耦,便于管理和服务。Spring还提供了AOP(面向切面编程)功能,用于实现如日志记录、事务管理等跨切面关注点的处理。 SpringMVC是Spring框架的一部分,专门用于构建Web应用程序。它采用了模型-视图-控制器(Model-View-Controller,MVC)设计模式,将业务逻辑、数据展示和用户交互分离,提高了代码的可维护性和可扩展性。在SpringMVC中,请求被DispatcherServlet接收,然后分发到相应的处理器,处理器执行业务逻辑后返回结果,最后由视图解析并展示给用户。 Mybatis是一个优秀的持久层框架,它简化了JDBC的繁琐操作,支持SQL语句的动态编写,使得开发者可以直接使用SQL来操作数据库,同时还能保持数

    分割资源UE5.3.z25

    分割资源UE5.3.z25

    Matlab 2021及以上版本:电气工程与自动化仿真实践-电力电子变换器微网建模与仿真研究,涵盖Boost、Buck整流逆变器闭环控制及光伏蓄电池电路等多重电气仿真,基于Matlab 2021及以

    Matlab 2021及以上版本:电气工程与自动化仿真实践——电力电子变换器微网建模与仿真研究,涵盖Boost、Buck整流逆变器闭环控制及光伏蓄电池电路等多重电气仿真,基于Matlab 2021及以上的电气工程与自动化仿真研究:电力电子变换器微网建模与Boost、Buck整流逆变器闭环控制及光伏蓄电池电路等多电气仿真分析,电气工程及其自动化仿真 Matlab simulink 电力电子变器微网建模仿真 仅限matlab版本2021及以上 Boost,Buck,整流逆变器闭环控制 光伏蓄电池电路等多种电气仿真 ,电气工程; Matlab simulink; 电力电子变换器; 微网建模仿真; Boost; Buck; 整流逆变器; 闭环控制; 光伏蓄电池电路; 电气仿真,Matlab 2021版电气工程自动化仿真研究:微网建模与控制策略

    移动机器人路径规划,python入门程序

    移动机器人路径规划,python入门程序

    清华大学关于DeepSeek从入门到精通最详细资料

    《DeepSeek从入门到精通》是清华大学推出的一套深度学习学习资源,内容涵盖基础知识、实用技巧和前沿应用,适合不同水平的学习者。通过系统化的学习路径,帮助你在深度学习领域快速成长。无论你是初学者还是

    考虑新能源消纳的火电机组深度调峰策略:建立成本模型与经济调度,实现风电全额消纳的优化方案,考虑新能源消纳的火电机组深度调峰策略与经济调度模型研究,考虑新能源消纳的火电机组深度调峰策略 摘要:本代码主要

    考虑新能源消纳的火电机组深度调峰策略:建立成本模型与经济调度,实现风电全额消纳的优化方案,考虑新能源消纳的火电机组深度调峰策略与经济调度模型研究,考虑新能源消纳的火电机组深度调峰策略 摘要:本代码主要做的是考虑新能源消纳的火电机组深度调峰策略,以常规调峰、不投油深度调峰、投油深度调峰三个阶段,建立了火电机组深度调峰成本模型,并以风电全额消纳为前提,建立了经济调度模型。 约束条件主要考虑煤燃烧约束、系统旋转备用功率约束、启停、爬坡、储热约束等等。 复现结果非常良好,结果图展示如下: 1、代码非常精品,有注释方便理解; ,核心关键词:新能源消纳;火电机组深度调峰策略;常规调峰;不投油深度调峰;投油深度调峰;成本模型;经济调度模型;煤燃烧约束;系统旋转备用功率约束;启停约束;爬坡约束;储热约束。,新能源优化调度策略:火电机组深度调峰及经济调度研究

    数字设计-原理与实践.pdf

    "数字设计原理与实践" 数字设计是计算机科学和电子工程两个领域的交叉点,涉及到数字电路的设计和实现。本书籍《数字设计-原理与实践》旨在为读者提供一个系统的数字设计指南,从基本原理到实际应用,涵盖了数字设计的方方面面。 1. 数字设计的定义和目标 数字设计是指使用数字电路和系统来实现特定的功能目标的设计过程。在这个过程中,设计师需要考虑到各种因素,如电路的可靠性、功耗、面积等,以确保设计的数字电路能够满足实际应用的需求。 2. 数字设计的基本原理 数字设计的基本原理包括数字电路的基本元件,如逻辑门、 Flip-Flop、计数器、加法器等,以及数字电路的设计方法,如Combinational Logic、Sequential Logic和 Finite State Machine等。 3. 数字设计的设计流程 数字设计的设计流程通常包括以下几个步骤: * 需求分析:确定设计的目标和约束条件。 *电路设计:根据需求设计数字电路。 * 仿真验证:使用软件工具对设计的数字电路进行仿真和验证。 * 实现和测试:将设计的数字电路实现并进行测试。 4. 数字设计在实际应用中的应用 数字设计在实际应用中

    基于Simulink仿真的直流电机双闭环控制系统设计与分析:转速电流双闭环PWM控制策略及7天报告研究,基于Simulink仿真的直流电机双闭环控制系统分析与设计报告:转速电流双闭环PWM控制策略的7

    基于Simulink仿真的直流电机双闭环控制系统设计与分析:转速电流双闭环PWM控制策略及7天报告研究,基于Simulink仿真的直流电机双闭环控制系统分析与设计报告:转速电流双闭环PWM控制策略的7天实践,直流电机双闭环控制系统仿真 simulink仿真 7d 转速电流双闭环 PWM 含有报告哈 ,直流电机; 双闭环控制系统; Simulink仿真; 7d; 转速电流双闭环; PWM; 报告,7天完成双闭环控制系统仿真报告:直流电机转速电流PWM管理与Simulink仿真研究

    三目标微电网能量调度优化:经济、环境友好与高效能分配的协同策略研究,微粒群算法在三目标微电网能量调度中的应用:经济、环境友好与优化调度的综合研究,微电网 能量调度 三目标微网调度, 经济调度 环境友好

    三目标微电网能量调度优化:经济、环境友好与高效能分配的协同策略研究,微粒群算法在三目标微电网能量调度中的应用:经济、环境友好与优化调度的综合研究,微电网 能量调度 三目标微网调度, 经济调度 环境友好调度 优化调度 微电网能量调度问题的求解 问题描述: - 微电网:包含多个能量源,包括DG(分布式发电设备,如太阳能光伏板、微型燃气轮机等)、MT(燃油发电机)和FC(燃料电池)。 - 目标:通过合理分配各种能源的发电功率,满足负荷需求,同时使得微电网的发电成本最小化。 解决方法: 微粒群算法(Particle Swarm Optimization, PSO): - 步骤: - 初始化微粒群:根据给定的微电网问题约束,随机生成一定数量的微粒(粒子),每个粒子代表一种发电方案,包含DG、MT和FC的发电功率分配情况。 - 适应度函数:对每个粒子,计算其对应的发电成本,作为其适应度值。 - 更新速度和位置:根据当前适应度值和历史最优适应度值,通过PSO算法的公式,更新每个粒子的速度和位置,以寻找更优的发电功率分配。 - 约束处理:根据问题约束条件,

    《无感滑膜技术:Microchip1078代码移植至ST芯片的实践指南》-新手必备的反正切算法与电子资料整合方案,《无感滑膜技术:Microchip1078代码移植至ST芯片的实践指南》-新手必备

    《无感滑膜技术:Microchip1078代码移植至ST芯片的实践指南》——新手必备的反正切算法与电子资料整合方案,《无感滑膜技术:Microchip1078代码移植至ST芯片的实践指南》——新手必备的反正切算法与电子资料全解析,无感滑膜,反正切,microchip1078代码移植到st芯片上,新手学习必备。 可以提供提供相应文档和keil工程,电子资料, ,无感滑膜; 反正切; microchip1078代码移植; ST芯片; 新手学习; 文档; Keil工程; 电子资料,无感滑膜算法移植至ST芯片的Microchip1078代码迁移指南

    风光柴储混合微电网系统中的储能电池与互补能量管理技术研究及MATLAB模拟实现,风光柴储混合微电网系统中的储能电池与互补能量管理技术:基于MATLAB的智能调控体系,风光柴储+混合微电网+储能电池系统

    风光柴储混合微电网系统中的储能电池与互补能量管理技术研究及MATLAB模拟实现,风光柴储混合微电网系统中的储能电池与互补能量管理技术:基于MATLAB的智能调控体系,风光柴储+混合微电网+储能电池系统+互补能量管理+MATLA ,核心关键词:风光柴储; 混合微电网; 储能电池系统; 互补能量管理; MATLA;,风光柴储混合微网能量管理系统及储能电池应用

    永磁同步电机PMSM无感FOC驱动与位置估算源码分享:跨平台兼容、高速动态响应、无需初始角度辨识,永磁同步电机PMSM无感FOC驱动与位置估算源码分享:跨平台兼容、高速动态响应、无需初始角度辨识,永磁

    永磁同步电机PMSM无感FOC驱动与位置估算源码分享:跨平台兼容、高速动态响应、无需初始角度辨识,永磁同步电机PMSM无感FOC驱动与位置估算源码分享:跨平台兼容、高速动态响应、无需初始角度辨识,永磁同步电机pmsm无感foc驱动代码 位置估算源码 无刷直流电机无感foc源码,无感foc算法源码 若需要,可提供硬件 速度位置估算部分代码所使用变量全部使用国际标准单位,使用不到60行代码实现完整的位置速度观测器。 提供完整的观测器文档,供需要的朋友参考 程序使用自研观测器,代码全部是源码,不含任何库文件 送simulink仿真 代码可读性极好,关键变量注明单位 模块间完全解耦 高级工程师磁链法位置估算代码 跨平台兼容,提供ti平台或at32平台工程 电流环pi参数自动计算 效果如图 实现0速闭环启动 2hz以内转速角度收敛 动态响应性能好 无需初始角度辨识 电阻电感允许一定误差 ,核心关键词: 1. 永磁同步电机 (PMSM) 无感 FOC 驱动代码 2. 位置估算源码 3. 无刷直流电机无感 FOC 源码 4. 无感 FOC 算法源码 5. 硬件支持(可选) 6. 速度位置估算部分

Global site tag (gtag.js) - Google Analytics