/*******************************************************************************
 * Copyright (c) 2006, 2007 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.core.internal.content.persistence.resource;

import org.eclipse.jpt.core.internal.content.persistence.PersistencePackage;
import org.eclipse.wst.common.internal.emf.resource.ConstantAttributeTranslator;
import org.eclipse.wst.common.internal.emf.resource.GenericTranslator;
import org.eclipse.wst.common.internal.emf.resource.IDTranslator;
import org.eclipse.wst.common.internal.emf.resource.RootTranslator;
import org.eclipse.wst.common.internal.emf.resource.Translator;

public class PersistenceTranslator extends RootTranslator
	implements PersistenceXMLMapper
{
	public static PersistenceTranslator INSTANCE = new PersistenceTranslator();
	
	private static Translator[] children;
	
	private static PersistencePackage PERSISTENCE_PKG = PersistencePackage.eINSTANCE;
	
	
	public PersistenceTranslator() {
		super(PERSISTENCE, PERSISTENCE_PKG.eINSTANCE.getPersistence());
	}
	
	public Translator[] getChildren(Object target, int versionID) {
		if (children == null) {
			children = createChildren();
		}
		return children;
	}
	
	private static Translator[] createChildren() {
		return new Translator[] {
			IDTranslator.INSTANCE,
			createVersionTranslator(),
			new ConstantAttributeTranslator(XML_NS, PERSISTENCE_NS_URL),
			new ConstantAttributeTranslator(XML_NS_XSI, XSI_NS_URL),
			new ConstantAttributeTranslator(XSI_SCHEMA_LOCATION, PERSISTENCE_NS_URL + ' ' + PERSISTENCE_SCHEMA_LOC_1_0),
			createPersistenceUnitTranslator()
		};
	}
	
	private static Translator createVersionTranslator() {
		return new Translator(PERSISTENCE_VERSION, PERSISTENCE_PKG.getPersistence_Version(), DOM_ATTRIBUTE);
	}
	
	private static Translator createPersistenceUnitTranslator() {
		GenericTranslator translator = new GenericTranslator(PERSISTENCE_UNIT, PERSISTENCE_PKG.getPersistence_PersistenceUnits());
		translator.setChildren(
			new Translator[] {
				IDTranslator.INSTANCE,
				createPersistenceUnitNameTranslator(),
				createTransactionTypeTranslator(),
				createPersistenceUnitDescriptionTranslator(),
				createPersistenceUnitProviderTranslator(),
				createJtaDataSourceTranslator(),
				createNonJtaDataSourceTranslator(),
				createMappingFileTranslator(),
				createJarFileTranslator(),
				createClassTranslator(),
				createExcludeUnlistedClassesTranslator(),
				createPropertiesTranslator()
			}
		);
		return translator;
	}
	
	private static Translator createPersistenceUnitNameTranslator() {
		return new Translator(PERSISTENCE_UNIT_NAME, PERSISTENCE_PKG.getPersistenceUnit_Name(), DOM_ATTRIBUTE);
	}
	
	private static Translator createTransactionTypeTranslator() {
		return new TransactionTypeTranslator();
	}
	
	private static Translator createPersistenceUnitDescriptionTranslator() {
		return new Translator(PERSISTENCE_UNIT_DESCRIPTION, PERSISTENCE_PKG.getPersistenceUnit_Description());
	}
	
	private static Translator createPersistenceUnitProviderTranslator() {
		return new Translator(PERSISTENCE_UNIT_PROVIDER, PERSISTENCE_PKG.getPersistenceUnit_Provider(), UNSET_IF_NULL);
	}
	
	private static Translator createJtaDataSourceTranslator() {
		return new Translator(JTA_DATA_SOURCE, PERSISTENCE_PKG.getPersistenceUnit_JtaDataSource());
	}
	
	private static Translator createNonJtaDataSourceTranslator() {
		return new Translator(NON_JTA_DATA_SOURCE, PERSISTENCE_PKG.getPersistenceUnit_NonJtaDataSource());
	}
	
	private static Translator createMappingFileTranslator() {
		return new MappingFileTranslator(MAPPING_FILE, PERSISTENCE_PKG.getPersistenceUnit_MappingFiles());
	}
	
	private static Translator createJarFileTranslator() {
		return new Translator(JAR_FILE, PERSISTENCE_PKG.getPersistenceUnit_JarFiles());
	}
	
	private static Translator createClassTranslator() {
		return new JavaClassRefTranslator(CLASS, PERSISTENCE_PKG.getPersistenceUnit_Classes());
	}
	
	private static Translator createExcludeUnlistedClassesTranslator() {
		return new BooleanTranslator(EXCLUDE_UNLISTED_CLASSES, PERSISTENCE_PKG.getPersistenceUnit_ExcludeUnlistedClasses(), UNSET_IF_NULL);
	}
	
	private static Translator createPropertiesTranslator() {
		GenericTranslator translator = new GenericTranslator(PROPERTIES, PERSISTENCE_PKG.getPersistenceUnit_Properties());
		translator.setChildren(
			new Translator[] {
				createPropertyTranslator()
			}
		);
		return translator;
	}
	
	private static Translator createPropertyTranslator() {
		GenericTranslator translator = new GenericTranslator(PROPERTY, PERSISTENCE_PKG.getProperties_Properties());
		translator.setChildren(
			new Translator[] {
				createPropertyNameTranslator(),
				createPropertyValueTranslator()
			}
		);
		return translator;
	}
	
	private static Translator createPropertyNameTranslator() {
		return new Translator(PROPERTY_NAME, PERSISTENCE_PKG.getProperty_Name());
	}
	
	private static Translator createPropertyValueTranslator() {
		return new Translator(PROPERTY_VALUE, PERSISTENCE_PKG.getProperty_Value());
	}
}
