/*******************************************************************************
 * Copyright (c) 2008 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.ui.internal.mappings.details;

import org.eclipse.jpt.core.context.AbstractJoinColumn;
import org.eclipse.jpt.db.internal.Table;
import org.eclipse.jpt.utility.internal.node.AbstractNode;
import org.eclipse.jpt.utility.internal.node.Node;

/**
 * The abstract definition of a state object used to edit or create a new
 * join column.
 *
 * @see AbstractJoinColumn
 *
 * @version 2.0
 * @since 2.0
 */
@SuppressWarnings("nls")
public abstract class AbstractJoinColumnStateObject extends AbstractNode
{
	/**
	 * Either the join column is being edited or <code>null</code> the state
	 * object is being created.
	 */
	private AbstractJoinColumn joinColumn;

	/**
	 * The join column's name or <code>null</code> if not defined.
	 */
	private String name;

	/**
	 * The owner of the join column to create or where it is located.
	 */
	private Object owner;

	/**
	 * The referenced column name or <code>null</code> if not defined.
	 */
	private String referencedColumnName;

	/**
	 * Keeps track of the <code>Validator</code> since this is the root object.
	 */
	private Validator validator;

	/**
	 * Identifies a change in the name property.
	 */
	public static final String NAME_PROPERTY = "name";

	/**
	 * Identifies a change in the referenced column name property.
	 */
	public static final String REFERENCED_COLUMN_NAME_PROPERTY = "referencedColumnName";

	/**
	 * Creates a new <code>AbstractJoinColumnStateObject</code>.
	 *
	 * @param owner The owner of the join column to create or where it is located
	 * @param joinColumn Either the join column to edit or <code>null</code> if
	 * this state object is used to create a new one
	 */
	public AbstractJoinColumnStateObject(Object owner,
	                                     AbstractJoinColumn joinColumn) {
		super(null);
		initialize(owner, joinColumn);
	}

	/*
	 * (non-Javadoc)
	 */
	@Override
	protected final void checkParent(Node parentNode) {
		// This is the root of the Join Column state object
	}

	/**
	 * Returns the default name if the join column is being edited otherwise
	 * <code>null</code> is returned.
	 *
	 * @return Either the default name defined by the join column or <code>null</code>
	 */
	public String defaultName() {
		if (this.joinColumn == null) {
			return null;
		}

		return this.joinColumn.getDefaultName();
	}

	/**
	 * Returns the default referenced column name if the join column is being
	 * edited otherwise <code>null</code> is returned.
	 *
	 * @return Either the default referenced column name defined by the join
	 * column or <code>null</code>
	 */
	public String defaultReferencedColumnName() {
		if (this.joinColumn == null) {
			return null;
		}

		return this.joinColumn.getDefaultReferencedColumnName();
	}

	/*
	 * (non-Javadoc)
	 */
	public final String displayString() {
		return "";
	}

	/**
	 * Returns the edited join column or <code>null</code> if this state object
	 * is used to create a new one.
	 *
	 * @return The edited join column or <code>null</code>
	 */
	public AbstractJoinColumn getJoinColumn() {
		return this.joinColumn;
	}

	/**
	 * Returns the name of the join column.
	 *
	 * @return Either join column's name or <code>null</code> to use the default
	 * name
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * Returns the database table if one can be found.
	 *
	 * @return The database table
	 */
	public abstract Table getNameTable();

	/**
	 * Returns the owner where the join column is located or where a new one can
	 * be added.
	 *
	 * @return The parent of the join column
	 */
	public Object getOwner() {
		return owner;
	}

	/**
	 * Returns the referenced column name of the join column.
	 *
	 * @return Either join column's referenced column name or <code>null</code>
	 * to use the default name
	 */
	public String getReferencedColumnName() {
		return this.referencedColumnName;
	}

	public abstract Table getReferencedNameTable();

	/*
	 * (non-Javadoc)
	 */
	@Override
	protected void initialize() {
		super.initialize();
		validator = NULL_VALIDATOR;
	}

	/**
	 * Initializes this state object.
	 *
	 * @param owner The owner of the join column to create or where it is located
	 * @param joinColumn Either the join column to edit or <code>null</code> if
	 * this state object is used to create a new one
	 */
	protected void initialize(Object owner, AbstractJoinColumn joinColumn) {

		this.owner      = owner;
		this.joinColumn = joinColumn;

		if (joinColumn != null) {
			this.name                 = joinColumn.getSpecifiedName();
			this.referencedColumnName = joinColumn.getSpecifiedReferencedColumnName();
		}
	}

	/**
	 * Sets the name of the join column.
	 *
	 * @param name The new join column's name or <code>null</code> to use the
	 * default name
	 */
	public void setName(String name) {
		String oldName = this.name;
		this.name = name;
		firePropertyChanged(NAME_PROPERTY, oldName, name);
	}

	/**
	 * Sets the referenced column name of the join column.
	 *
	 * @param referencedColumnName The new join column's referenced column name
	 * or <code>null</code> to use the default referenced column name
	 */
	public void setReferencedColumnName(String referencedColumnName) {
		String oldReferencedColumnName = this.referencedColumnName;
		this.referencedColumnName = referencedColumnName;
		firePropertyChanged(REFERENCED_COLUMN_NAME_PROPERTY, oldReferencedColumnName, referencedColumnName);
	}

	/*
	 * (non-Javadoc)
	 */
	@Override
	public final void setValidator(Validator validator) {
		this.validator = validator;
	}

	/**
	 * Updates the given join column with the values contained in this state
	 * object.
	 *
	 * @param joinColumn The join column to update
	 */
	public void updateJoinColumn(AbstractJoinColumn joinColumn) {

		// Name
		if (valuesAreDifferent(name, joinColumn.getSpecifiedName())) {
			joinColumn.setSpecifiedName(name);
		}

		// Referenced Column Name
		if (valuesAreDifferent(referencedColumnName, joinColumn.getSpecifiedReferencedColumnName())) {
			joinColumn.setSpecifiedReferencedColumnName(referencedColumnName);
		}
	}

	/*
	 * (non-Javadoc)
	 */
	@Override
	public final Validator validator() {
		return this.validator;
	}
}