/***************************************************************************************************
 * Copyright (c) 2003, 2004 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.webservice.editmodel;

import java.util.ArrayList;
import java.util.Hashtable;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;

//import org.eclipse.emf.ecore.resource.ResourceSet;
//import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;

//import com.ibm.etools.emf.workbench.plugin.JEMUtilPlugin;

//import org.eclipse.jst.j2ee.internal.internal.webservice.wsdd.WsddResource;
//import org.eclipse.jst.j2ee.internal.internal.webservice.wsdd.WebServices;

//import org.eclipse.jst.j2ee.internal.internal.common.impl.J2EEResourceFactoryRegistry;


public class WebServicesEditModel extends CompositeEditModel {

	private WebServicesEditModelOwner fOwner;

	public WebServicesEditModel(WebServicesEditModelOwner owner) {
		//set the fields inherited from CompositeEditModel
		fEditModels = new Hashtable();
		fResources = new Hashtable();
		fRootObjects = new Hashtable();
		fDescriptors = new ArrayList();

		//set the fields inherited from EditModel
		fOwner = owner;
		fResourceSet = owner.getResourceSet();
		fProject = owner.getProject();
		fInputFile = owner.getInputFile();

		fReferenceCount = 0;
	}

	public IConfigurationElement[] getExtensions() {
		IExtensionRegistry reg = Platform.getExtensionRegistry();
		return reg.getConfigurationElementsFor("com.ibm.wtp.webservice", "webserviceseditmodelcontainer"); //$NON-NLS-1$ //$NON-NLS-2$
	}

	public EObject getRootModelObject() {
		return getRootModelObject("webservices.xml"); //$NON-NLS-1$
	}

	public Resource getRootModelResource() {
		return getModelResource("webservices.xml"); //$NON-NLS-1$
	}

	protected void dispose() {
		//Only dispose if no one is hanging on
		if (fReferenceCount > 0)
			return;
		fOwner.dispose();
	}
}