/*******************************************************************************
 * Copyright (c) 2010 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.jaxb.core.internal.context.java;

import org.eclipse.jpt.jaxb.core.context.JaxbElementFactoryMethod;
import org.eclipse.jpt.jaxb.core.context.JaxbRegistry;
import org.eclipse.jpt.jaxb.core.internal.context.AbstractJaxbContextNode;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourceMethod;
import org.eclipse.jpt.jaxb.core.resource.java.XmlElementDeclAnnotation;

public class GenericJavaElementFactoryMethod
		extends AbstractJaxbContextNode
		implements JaxbElementFactoryMethod {

	protected final JavaResourceMethod resourceMethod;

	protected String elementName;
	protected String defaultValue;
	protected String namespace;
	protected String scope;
	protected String substitutionHeadName;
	protected String substitutionHeadNamespace;

	public GenericJavaElementFactoryMethod(JaxbRegistry parent, JavaResourceMethod resourceMethod) {
		super(parent);
		this.resourceMethod = resourceMethod;
		this.elementName = this.getResourceElementName();
		this.defaultValue = this.getResourceDefaultValue();
		this.namespace = this.getResourceNamespace();
		this.scope = this.getResourceScope();
		this.substitutionHeadName = this.getResourceSubstitutionHeadName();
		this.substitutionHeadNamespace = this.getResourceSubstitutionHeadNamespace();
	}

	public JavaResourceMethod getResourceMethod() {
		return this.resourceMethod;
	}

	// ********** synchronize/update **********

	public void synchronizeWithResourceModel() {
		this.setElementName_(this.getResourceElementName());
		this.setDefaultValue_(this.getResourceDefaultValue());
		this.setNamespace_(this.getResourceNamespace());
		this.setScope_(this.getResourceScope());
		this.setSubstitutionHeadName_(this.getResourceSubstitutionHeadName());
		this.setSubstitutionHeadNamespace_(this.getResourceSubstitutionHeadNamespace());
	}

	public void update() {
		// nothing yet
	}

	// ********** xml enum value annotation **********

	protected XmlElementDeclAnnotation getXmlElementDeclAnnotation() {
		return (XmlElementDeclAnnotation) this.getResourceMethod().getNonNullAnnotation(XmlElementDeclAnnotation.ANNOTATION_NAME);
	}


	// ************** JaxbElementFactoryMethod impl ***********

	public String getName() {
		return this.resourceMethod.getName();
	}

	// ********** element name **********

	public String getElementName() {
		return this.elementName;
	}

	public void setElementName(String elementName) {
		this.getXmlElementDeclAnnotation().setName(elementName);
		this.setElementName_(elementName);	
	}

	protected void setElementName_(String elementName) {
		String old = this.elementName;
		this.elementName = elementName;
		this.firePropertyChanged(ELEMENT_NAME_PROPERTY, old, elementName);
	}

	protected String getResourceElementName() {
		return this.getXmlElementDeclAnnotation().getName();
	}

	public String getDefaultValue() {
		return this.defaultValue;
	}

	public void setDefaultValue(String defaultValue) {
		this.getXmlElementDeclAnnotation().setDefaultValue(defaultValue);
		this.setDefaultValue_(defaultValue);	
	}

	protected void setDefaultValue_(String defaultValue) {
		String old = this.defaultValue;
		this.defaultValue = defaultValue;
		this.firePropertyChanged(DEFAULT_VALUE_PROPERTY, old, defaultValue);
	}

	protected String getResourceDefaultValue() {
		return this.getXmlElementDeclAnnotation().getDefaultValue();
	}

	public String getNamespace() {
		return this.namespace;
	}

	public void setNamespace(String namespace) {
		this.getXmlElementDeclAnnotation().setNamespace(namespace);
		this.setNamespace_(namespace);	
	}

	protected void setNamespace_(String namespace) {
		String old = this.namespace;
		this.namespace = namespace;
		this.firePropertyChanged(NAMESPACE_PROPERTY, old, namespace);
	}

	protected String getResourceNamespace() {
		return this.getXmlElementDeclAnnotation().getNamespace();
	}

	public String getScope() {
		return this.scope;
	}

	public void setScope(String scope) {
		this.getXmlElementDeclAnnotation().setScope(scope);
		this.setScope_(scope);	
	}

	protected void setScope_(String scope) {
		String old = this.scope;
		this.scope = scope;
		this.firePropertyChanged(SCOPE_PROPERTY, old, scope);
	}

	protected String getResourceScope() {
		return this.getXmlElementDeclAnnotation().getScope();
	}

	public String getSubstitutionHeadName() {
		return this.substitutionHeadName;
	}

	public void setSubstitutionHeadName(String substitutionHeadName) {
		this.getXmlElementDeclAnnotation().setSubstitutionHeadName(substitutionHeadName);
		this.setSubstitutionHeadName_(substitutionHeadName);	
	}

	protected void setSubstitutionHeadName_(String substitutionHeadName) {
		String old = this.substitutionHeadName;
		this.substitutionHeadName = substitutionHeadName;
		this.firePropertyChanged(SUBSTIUTION_HEAD_NAME_PROPERTY, old, substitutionHeadName);
	}

	protected String getResourceSubstitutionHeadName() {
		return this.getXmlElementDeclAnnotation().getSubstitutionHeadName();
	}

	public String getSubstitutionHeadNamespace() {
		return this.substitutionHeadNamespace;
	}

	public void setSubstitutionHeadNamespace(String substitutionHeadNamespace) {
		this.getXmlElementDeclAnnotation().setSubstitutionHeadNamespace(substitutionHeadNamespace);
		this.setSubstitutionHeadNamespace_(substitutionHeadNamespace);	
	}

	protected void setSubstitutionHeadNamespace_(String substitutionHeadNamespace) {
		String old = this.substitutionHeadNamespace;
		this.substitutionHeadNamespace = substitutionHeadNamespace;
		this.firePropertyChanged(SUBSTIUTION_HEAD_NAMESPACE_PROPERTY, old, substitutionHeadNamespace);
	}

	protected String getResourceSubstitutionHeadNamespace() {
		return this.getXmlElementDeclAnnotation().getSubstitutionHeadNamespace();
	}
}
