/*******************************************************************************
 * Copyright (c) 2001, 2006 IBM 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
/*
 * Created on Jan 22, 2004
 *
 * To change the template for this generated file go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
package org.eclipse.jst.j2ee.model.internal.validation;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jst.j2ee.commonarchivecore.internal.RARFile;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.jca.Connector;
import org.eclipse.wst.validation.internal.core.Message;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;


/**
 * To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
public class ConnectorValidator extends J2EEValidator implements ConnectorMessageConstants {
	protected RARFile rarFile;
	protected Connector connectorDD;
	/**
	 * 
	 */
	public ConnectorValidator() {
		super();
	}
	/* (non-Javadoc)
	 * @see org.eclipse.jst.j2ee.internal.model.validation.J2EEValidator#getBaseName()
	 */
	@Override
	public String getBaseName() {
		return "org.eclipse.jst.j2ee.model.internal.validation.rarvalidation"; //$NON-NLS-1$
	}
	/**
	 * @return Returns the connectorDD.
	 */
	protected Connector getConnectorDD() {
		return connectorDD;
	}

	/**
	 * @param connectorDD The connectorDD to set.
	 */
	protected void setConnectorDD(Connector connectorDD) {
		this.connectorDD = connectorDD;
	}

	/**
	 * @return Returns the rarFile.
	 */
	protected RARFile getRarFile() {
		return rarFile;
	}

	/**
	 * @param rarFile The rarFile to set.
	 */
	protected void setRarFile(RARFile rarFile) {
		this.rarFile = rarFile;
	}
		
	/**
	 * Does the validation.
	 * 
	 * @throws ValidationException
	 */
	@Override
	public void validate(IValidationContext inHelper, IReporter inReporter) throws ValidationException {
		validateInJob(inHelper, inReporter);		
	}	

	protected void validateJ2EE14DocType() {
	
		if ( getConnectorDD().getVersionID() < J2EEVersionConstants.JCA_1_5_ID) {
			String[] params = new String[3];
			params[0] = DOCTYPE_1_4;
			//params[1] = helper.getProject().getName();
			params[2] = DOCTYPE_1_3;
			addError(getBaseName(), CONNECTOR_INVALID_DOC_TYPE_ERROR_, params);
		} else if (getConnectorDD().getVersionID() != J2EEVersionConstants.JCA_1_0_ID) {
			String[] params = new String[3];
			params[0] = DOCTYPE_1_3;
			//params[1] = helper.getProject().getName();
			params[2] = DOCTYPE_1_4;
			addError(getBaseName(), CONNECTOR_INVALID_DOC_TYPE_ERROR_, params);
		}// if
	}// validateDocTypeVsNature
	
	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
		return null;
	}
	
	@Override
	public IStatus validateInJob(IValidationContext helper, IReporter reporter) throws ValidationException{
	
		super.validateInJob(helper, reporter);
		
		// First remove all previous msg. for this project
		_reporter.removeAllMessages(this, null); // Note the WarHelper will return web.xml with a null object as well
	
		try {
			setRarFile((RARFile) helper.loadModel(CONNECTOR_MODEL_NAME));
			if (rarFile != null) {
				setConnectorDD( rarFile.getDeploymentDescriptor() );
				//validateJ2EE14DocType();
			} else {
				IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_INVALID_CONNECTOR_FILE);
				throw new ValidationException(errorMsg);
			}
	
		} catch (ValidationException ex) {
			throw ex;
		} catch (Exception e) {
			IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_CONNECTOR_VALIDATION_FAILED);
			throw new ValidationException(errorMsg, e);
		}
		return status;		
	}

	@Override
	public void cleanup(IReporter reporter) {
		rarFile = null;
		connectorDD = null;
		super.cleanup(reporter);
	}	
}
