/**
 * i-net software provides programming examples for illustration only, without warranty
 * either expressed or implied, including, but not limited to, the implied warranties
 * of merchantability and/or fitness for a particular purpose. This programming example
 * assumes that you are familiar with the programming language being demonstrated and
 * the tools used to create and debug procedures. i-net software support professionals
 * can help explain the functionality of a particular procedure, but they will not modify
 * these examples to provide added functionality or construct procedures to meet your
 * specific needs.
 *
 * Copyright © 1999-2025 i-net software GmbH, Berlin, Germany.
**/
package rdc;

import java.util.Properties;

import com.inet.report.Engine;
import com.inet.report.EngineRenderData;
import com.inet.report.RDC;
import com.inet.report.ReportException;
import com.inet.viewer.RenderData;
import com.inet.viewer.ReportViewer;

/**
 * This class implements the RenderData and PropertiesChecker interfaces in the same way as the class
 * <code>com.inet.report.EngineRenderData</code> does, so this will not be explained. But the constructor and the method
 * <code>checkEngine</code> differs from <code>EngineRenderData</code>. The constructor does not set a report URL, the
 * method <code>checkEngine</code> does not create a engine with a report URL. Both use an interface
 * <code>FillEngineRDC</code>, which enables you to implement arbitrary classes using RDC, by implementing one function
 * containing the RDC calls only. See the samples in package <code>samples.rdc</code>.
 * @see EngineRenderData
 */
public class EngineRDCRenderData extends EngineRenderData {

    private EngineCreator engineCreator;

    /**
     * Use this constructor to set an implementation of the <code>EngineCreator</code> interface to this object.
     * @param engineCreator interface to create and fill engine
     */
    public EngineRDCRenderData( EngineCreator engineCreator ) {
        super( "" );
        if( engineCreator != null ) {
            this.engineCreator = engineCreator;
        } else {
            throw new IllegalArgumentException( "EngineCreator is null" );
        }
    }

    /**
     * Creates or load an <code>Engine</code> and set all needed properties. Do NOT execute the <code>Engine</code>
     * here!
     * @param props Properties to use for creating the engine.
     * @return the created engine
     * @throws ReportException if the specified export format is invalid.
     */
    @Override
    protected Engine createEngine( Properties props ) throws ReportException {
        Engine e = engineCreator.createAndFillEngine( props.getProperty( "export_fmt" ) );
        RDC.setEngineParams( e, props, getPropertiesChecker(), null );
        return e;
    }

    /**
     * "Clones" this RenderData object with all its properties and returns the copy. Useful for deriving from existing
     * RenderData objects by copying them and adding or changing properties. This method is called by the viewer for
     * drilling down, for example - the drilldown property is set on the copy while all other properties remain the
     * same, and the copy is used to open a new report view.
     * @return A cloned copy of this RenderData object with all its properties.
     * @see ReportViewer#addNewReportView(RenderData)
     * @see EngineRenderData#getProperties()
     */
    @Override
    public RenderData getCopy() {
        EngineRDCRenderData rd = new EngineRDCRenderData( engineCreator );
        rd.getProperties().putAll( getProperties() );
        return rd;
    }

}