/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



package com.sun.star.xml.security.uno;

import java.util.Vector;

/* uno classes */
import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XInitialization;
import com.sun.star.uno.XComponentContext;

import com.sun.star.xml.crypto.*;
import com.sun.star.xml.crypto.sax.*;

/*
 * this class maintains the data for a signature operation.
 */
class SignatureEntity extends SecurityEntity
{
	private Vector m_vReferenceIds;
	private int    m_nSignatureElementCollectorId;

	SignatureEntity(
		XSecuritySAXEventKeeper xSAXEventKeeper,
		boolean isExporting,
		Object resultListener,
		XXMLSecurityContext xXMLSecurityContext,
		XXMLSignature xXMLSignature,
		XXMLEncryption xXMLEncryption,
		XMultiComponentFactory xRemoteServiceManager,
		XComponentContext xRemoteContext)
	{
		super(xSAXEventKeeper, xXMLSecurityContext, xXMLSignature,
			xXMLEncryption, xRemoteServiceManager, xRemoteContext);

		m_vReferenceIds = new Vector();

		if (isExporting)
		{
			m_nSignatureElementCollectorId = m_xSAXEventKeeper.addSecurityElementCollector(
				ElementMarkPriority.AFTERMODIFY,
				true);

			m_xSAXEventKeeper.setSecurityId(m_nSignatureElementCollectorId, m_nSecurityId);

			try
			{
				/*
				 * creates a SignatureCreator.
				 */
				Object signatureCreator = m_xRemoteServiceManager.createInstanceWithContext(
					TestTool.SIGNATURECREATOR_COMPONENT, m_xRemoteContext);

				m_xReferenceResolvedListener =
					(XReferenceResolvedListener)UnoRuntime.queryInterface(
						XReferenceResolvedListener.class, signatureCreator);

	                        /*
	                         * initializes the SignatureCreator.
	                         */
				XInitialization xInitialization =
					(XInitialization)UnoRuntime.queryInterface(
						XInitialization.class, m_xReferenceResolvedListener);

				Object args[]=new Object[5];
				args[0] = new Integer(m_nSecurityId).toString();
				args[1] = m_xSAXEventKeeper;
				args[2] = new Integer(m_nSignatureElementCollectorId).toString();
				args[3] = m_xXMLSecurityContext.getSecurityEnvironment();
				args[4] = m_xXMLSignature;
				xInitialization.initialize(args);

				/*
				 * creates a Blocker.
				 */
				int blockerId = m_xSAXEventKeeper.addBlocker();
				m_xSAXEventKeeper.setSecurityId(blockerId, m_nSecurityId);

				XBlockerMonitor xBlockerMonitor = (XBlockerMonitor)UnoRuntime.queryInterface(
					XBlockerMonitor.class, m_xReferenceResolvedListener);
				xBlockerMonitor.setBlockerId(blockerId);

				/*
				 * sets signature creation result listener.
				 */
				XSignatureCreationResultBroadcaster xSignatureCreationResultBroadcaster =
					(XSignatureCreationResultBroadcaster)UnoRuntime.queryInterface(
						XSignatureCreationResultBroadcaster.class, m_xReferenceResolvedListener);
				xSignatureCreationResultBroadcaster.addSignatureCreationResultListener(
					(XSignatureCreationResultListener)UnoRuntime.queryInterface(
						XSignatureCreationResultListener.class, resultListener));
			}
			catch( com.sun.star.uno.Exception e)
			{
				e.printStackTrace();
			}

		}
		else
		{
			m_nSignatureElementCollectorId = m_xSAXEventKeeper.addSecurityElementCollector(
				ElementMarkPriority.BEFOREMODIFY, false);

			m_xSAXEventKeeper.setSecurityId(m_nSignatureElementCollectorId, m_nSecurityId);

			try
			{
				/*
				 * creates a SignatureVerifier.
				 */
				Object signatureVerifier = m_xRemoteServiceManager.createInstanceWithContext(
					TestTool.SIGNATUREVERIFIER_COMPONENT, m_xRemoteContext);

				m_xReferenceResolvedListener =
					(XReferenceResolvedListener)UnoRuntime.queryInterface(
						XReferenceResolvedListener.class, signatureVerifier);

	                        /*
	                         * initializes the SignatureVerifier.
	                         */
				XInitialization xInitialization =
					(XInitialization)UnoRuntime.queryInterface(
						XInitialization.class, m_xReferenceResolvedListener);
				Object args[]=new Object[5];
				args[0] = new Integer(m_nSecurityId).toString();
				args[1] = m_xSAXEventKeeper;
				args[2] = new Integer(m_nSignatureElementCollectorId).toString();
				args[3] = m_xXMLSecurityContext;
				args[4] = m_xXMLSignature;
				xInitialization.initialize(args);

				/*
				 * sets signature verify result listener.
				 */
				XSignatureVerifyResultBroadcaster xSignatureVerifyResultBroadcaster =
					(XSignatureVerifyResultBroadcaster)UnoRuntime.queryInterface(
						XSignatureVerifyResultBroadcaster.class, m_xReferenceResolvedListener);
				xSignatureVerifyResultBroadcaster.addSignatureVerifyResultListener(
					(XSignatureVerifyResultListener)UnoRuntime.queryInterface(
						XSignatureVerifyResultListener.class, resultListener));
			}
			catch( com.sun.star.uno.Exception e)
			{
				e.printStackTrace();
			}
		}

		/*
		 * configures the resolve listener for the signature template.
		 */
		XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
			(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
				XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
		xReferenceResolvedBroadcaster.addReferenceResolvedListener(
			m_nSignatureElementCollectorId, m_xReferenceResolvedListener);
	}

/**************************************************************************************
 * private methods
 **************************************************************************************/

	/*
	 * checks whether this signature has a reference with
	 * the particular id.
	 */
	private boolean hasReference(String id)
	{
		boolean rc = false;

		int length = m_vReferenceIds.size();
		for (int i=0; i<length; ++i)
		{
			if (id.equals((String)m_vReferenceIds.elementAt(i)))
			{
				rc = true;
				break;
			}
		}

		return rc;
	}


/**************************************************************************************
 * protected methods
 **************************************************************************************/

	/*
	 * adds a new reference id.
	 */
	protected void addReferenceId(String referenceId)
	{
		m_vReferenceIds.add(referenceId);
	}

	/*
	 * notifies how many reference in this signature.
	 */
	protected void setReferenceNumber()
	{
		try
		{
			XReferenceCollector xReferenceCollector =
				(XReferenceCollector)UnoRuntime.queryInterface(
					XReferenceCollector.class, m_xReferenceResolvedListener);
			xReferenceCollector.setReferenceCount(m_vReferenceIds.size());
		}
		catch( com.sun.star.uno.Exception e)
		{
			e.printStackTrace();
		}
	}

	/*
	 * tries to add a reference to this signature.
	 *
	 * If the specific id belongs to this signature's references, then:
	 * 1. askes the SAXEventKeeper to add a ElementCollector to for the new
	 * referenced element;
	 * 2. configures this ElementCollector's security id;
	 * 3. tells the SAXEventKeeper which listener will receive the reference
	 * resolved notification.
	 * 4. notifies the SignatureCollector about the reference id.
	 */
	protected boolean setReference(String id, boolean isExporting)
	{
		boolean rc = false;

		if (hasReference(id))
		{
			int referenceId = m_xSAXEventKeeper.addSecurityElementCollector(
				isExporting?
				(ElementMarkPriority.AFTERMODIFY):(ElementMarkPriority.BEFOREMODIFY),
				false );

			m_xSAXEventKeeper.setSecurityId(referenceId, m_nSecurityId);

			XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
				(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
					XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
			xReferenceResolvedBroadcaster.addReferenceResolvedListener(
				referenceId, m_xReferenceResolvedListener);

			try
			{
				XReferenceCollector xReferenceCollector =
					(XReferenceCollector)UnoRuntime.queryInterface(
						XReferenceCollector.class, m_xReferenceResolvedListener);
				xReferenceCollector.setReferenceId(referenceId);
			}
			catch( com.sun.star.uno.Exception e)
			{
				e.printStackTrace();
			}

			rc = true;
		}

		return rc;
	}
}
