/*******************************************************************************
 * 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
 *******************************************************************************/
/*
 * Created on Mar 20, 2003
 *
 */
package org.eclipse.jst.j2ee.internal.model.translator.webapplication;


import org.eclipse.emf.ecore.EObject;
import org.eclipse.jst.j2ee.internal.model.translator.common.CommonTranslators;
import org.eclipse.jst.j2ee.internal.xml.WarDeploymentDescriptorXmlMapperI;
import org.eclipse.jst.j2ee.webapplication.WebType;
import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
import org.eclipse.wst.common.internal.emf.resource.Translator;

/**
 * @author schacher
 */
public class WebTypeTranslator extends Translator implements WarDeploymentDescriptorXmlMapperI {
	
	private static Translator[] SERVLET_XLATORS = new Translator[] {
		new Translator(TEXT_ATTRIBUTE_VALUE, WebapplicationPackage.eINSTANCE.getServletType_ClassName())
	};
	private static Translator[] JSP_XLATORS = new Translator[] {
		new Translator(TEXT_ATTRIBUTE_VALUE, WebapplicationPackage.eINSTANCE.getJSPType_JspFile())
	};
	
	public WebTypeTranslator() {
		super(SERVLET_CLASS+','+JSP_FILE, WebapplicationPackage.eINSTANCE.getServlet_WebType(), Translator.END_TAG_NO_INDENT);
	}


	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.impl.Translator#getChildren(java.lang.Object, int)
	 */
	@Override
	public Translator[] getChildren(Object o, int versionID) {
		if (o == null)
			return CommonTranslators.EMPTY_CHILDREN;
		if (((WebType)o).isJspType())
			return JSP_XLATORS;
		else if (((WebType)o).isServletType())
			return SERVLET_XLATORS;
		else
			throw new IllegalStateException("Internal error: Web Type expected"); //$NON-NLS-1$
	}
	
	
	@Override
	public String getDOMName(Object value) {
		if (((WebType)value).isJspType())
			return JSP_FILE;
		else if (((WebType)value).isServletType())
			return SERVLET_CLASS;
		else 
			throw new IllegalStateException("Internal error: Web Type expected"); //$NON-NLS-1$
	}

		
	
	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.impl.Translator#createEMFObject(java.lang.String, java.lang.String)
	 */
	@Override
	public EObject createEMFObject(String nodeName, String readAheadName) {
		WebapplicationFactory fact = WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
		if (SERVLET_CLASS.equals(nodeName))
			return fact.createServletType();
		else if (JSP_FILE.equals(nodeName))
			return fact.createJSPType();
		else
			return null;
	}
	
	@Override
	public boolean isManagedByParent() {
		return false;
	}

}
