/*******************************************************************************
 * Copyright (c) 2001, 2005 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
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.model.translator.common;


import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jst.j2ee.common.CommonPackage;
import org.eclipse.jst.j2ee.internal.xml.DeploymentDescriptorXmlMapperI;
import org.eclipse.wst.common.internal.emf.resource.IDTranslator;
import org.eclipse.wst.common.internal.emf.resource.Translator;

public class EnvEntryTranslator extends Translator implements DeploymentDescriptorXmlMapperI {
	private boolean isJ2EE14;
	private static Translator[] children;
	private static Translator[] reorderedChildren;
	//Hacks because of inconsistencies in the servlet spec
	boolean typeBeforeValue = true;
	/**
	 * Constructor for EnvEntryTranslator.
	 * @param domNameAndPath
	 * @param aFeature
	 */
	public EnvEntryTranslator(EStructuralFeature aFeature, boolean writeTypeBeforeValue, boolean isJ2EE14) {
		super(ENV_ENTRY, aFeature);
		typeBeforeValue = writeTypeBeforeValue;
		this.isJ2EE14 = isJ2EE14;
	}

	/**
	 * @see com.ibm.etools.emf2xml.impl.Translator#getChildren()
	 */
	@Override
	public Translator[] getChildren(Object obj, int versionID) {
		//Hava to you create a different one each time
		children = createChildren();
		setReorderedChildren();
		
		if (typeBeforeValue)
			return children;
		
		return reorderedChildren;
	}

	protected Translator[] createChildren() {
		CommonPackage ePackageCommon = CommonPackage.eINSTANCE;
		Translator descriptionTranslator;
		if (isJ2EE14)
			descriptionTranslator = CommonTranslators.createDescriptionTranslator(ePackageCommon.getEnvEntry_Descriptions()); 
		else 
			descriptionTranslator = new Translator(DESCRIPTION, ePackageCommon.getEnvEntry_Description());
			
		return new Translator[] {
			IDTranslator.INSTANCE,				
			descriptionTranslator,
			new Translator(ENV_ENTRY_NAME, ePackageCommon.getEnvEntry_Name()),
			new EnvEntryTypeTranslator(), 
			new Translator(ENV_ENTRY_VALUE, ePackageCommon.getEnvEntry_Value())
		};
	}
	
	protected void setReorderedChildren() {
		reorderedChildren = new Translator[children.length];
		System.arraycopy(children, 0, reorderedChildren, 0, children.length);
		Translator temp = reorderedChildren[3];
		reorderedChildren[3] = reorderedChildren[4];
		reorderedChildren[4] = temp;
	}


}
