package org.eclipse.wst.common.modulecore.util;

import org.eclipse.emf.ecore.EStructuralFeature;
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;
import org.eclipse.wst.common.modulecore.ModuleCorePackage;


public class WTPModulesTranslator extends RootTranslator implements WTPModulesXmlMapperI{
	public static WTPModulesTranslator INSTANCE = new WTPModulesTranslator();
	private static Translator[] children;
	private static ModuleCorePackage MODULE_CORE_PKG = ModuleCorePackage.eINSTANCE;
	/**
	 * @param domNameAndPath
	 * @param eClass
	 */
	public WTPModulesTranslator() {
		super(PROJECT_MODULES, MODULE_CORE_PKG.getProjectModules());
	}
	/* (non-Javadoc)
	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren(java.lang.Object, int)
	 */
	public Translator[] getChildren(Object target, int versionID) {
		return createWTPModulesTranslator();
	}
	
	private static Translator[] createWTPModulesTranslator() {
		return new Translator[] {
				IDTranslator.INSTANCE,
				createWBAppTranslator(MODULE_CORE_PKG.getProjectModules_WorkbenchApplications()),
				createWBModuleTranslator(MODULE_CORE_PKG.getProjectModules_WorkbenchModules()),
				createDeployableAppTranslator(MODULE_CORE_PKG.getProjectModules_DeployedApplications())
		};
	}

	/**
	 * @return
	 */
	private static Translator createWBAppTranslator(EStructuralFeature afeature) {
		GenericTranslator result = new GenericTranslator(WBAPP, afeature);
		result.setChildren(new Translator[] {
			IDTranslator.INSTANCE,
			new Translator(WBMODULE, MODULE_CORE_PKG.getWorkbenchApplication_Modules())
		});
		return result;
	}
	/**
	 * @return
	 */
	private static Translator createDeployableAppTranslator(EStructuralFeature afeature) {
		GenericTranslator result = new GenericTranslator(DEPLOYABLE_APP, afeature);
		result.setChildren(new Translator[] {
			IDTranslator.INSTANCE,
			new Translator(WBAPPLICATION, MODULE_CORE_PKG.getDeployedApplication_Application(), DOM_ATTRIBUTE),
			new Translator(DEPLOY_SCHEME, MODULE_CORE_PKG.getDeployedApplication_DeployScheme()),
			new Translator(SERVER_TARGET, MODULE_CORE_PKG.getDeployScheme_ServerTarget())
		});
		return result;
	}
	/**
	 * @return
	 */
	private static Translator createWBModuleTranslator(EStructuralFeature afeature) {
		GenericTranslator result = new GenericTranslator(WBMODULE, afeature);
		result.setChildren(new Translator[] {
			IDTranslator.INSTANCE,
			new Translator(HANDLE, MODULE_CORE_PKG.getWorkbenchModule_Handle(), DOM_ATTRIBUTE),
			createModuleTypeTranslator(MODULE_CORE_PKG.getWorkbenchModule_ModuleType()),
			createWBResource(MODULE_CORE_PKG.getWorkbenchModule_Resources()),
			new Translator(WBMODULE, MODULE_CORE_PKG.getWorkbenchApplication_Modules())
		});
		return result;
	}
	private static Translator createModuleTypeTranslator(EStructuralFeature afeature) {
		GenericTranslator result = new GenericTranslator(WBMODULE, afeature);
		result.setChildren(new Translator[] {
			IDTranslator.INSTANCE,
			new Translator(ROOT, MODULE_CORE_PKG.getIModuleType_Root(), DOM_ATTRIBUTE), 
			new Translator(META_RESOURCES, MODULE_CORE_PKG.getIModuleType_MetadataResources())
		});
		return result;
	}

	private static Translator createWBResource(EStructuralFeature afeature) {
		GenericTranslator result = new GenericTranslator(WBRESOURCE, afeature);
		result.setChildren(new Translator[] {
			IDTranslator.INSTANCE,
			new Translator(SOURCE_PATH, MODULE_CORE_PKG.getWorkbenchModuleResource_SourcePath(), DOM_ATTRIBUTE),
			new Translator(DEPLOY_PATH, MODULE_CORE_PKG.getWorkbenchModuleResource_DeployedPath(), DOM_ATTRIBUTE),
			new Translator(EXCLUSIONS, MODULE_CORE_PKG.getWorkbenchModuleResource_Exclusions())
		});
		return result;
	}

}
