/*******************************************************************************
 *  Copyright (c) 2006 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.facet;

import java.io.IOException;
import java.util.Iterator;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
import org.eclipse.jpt.core.internal.JptCorePlugin;
import org.eclipse.jpt.core.internal.JpaModelManager;
import org.eclipse.jpt.core.internal.content.orm.EntityMappingsInternal;
import org.eclipse.jpt.core.internal.content.orm.OrmFactory;
import org.eclipse.jpt.core.internal.content.orm.OrmXmlResource;
import org.eclipse.jpt.core.internal.content.persistence.MappingFileRef;
import org.eclipse.jpt.core.internal.content.persistence.Persistence;
import org.eclipse.jpt.core.internal.content.persistence.PersistenceFactory;
import org.eclipse.jpt.core.internal.content.persistence.PersistenceUnit;
import org.eclipse.jpt.core.internal.content.persistence.resource.PersistenceResource;
import org.eclipse.jpt.utility.internal.CollectionTools;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IDelegate;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;

public class JpaFacetPostInstallDelegate 
	implements IDelegate, IJpaFacetDataModelProperties
{
	private final static String ORM_XML_FILE_PATH = "META-INF/orm.xml";
	
	public void execute(IProject project, IProjectFacetVersion fv, 
			Object config, IProgressMonitor monitor) throws CoreException {
		
		if (monitor != null) {
			monitor.beginTask("", 2); //$NON-NLS-1$
		}
		
		JpaModelManager.instance().createJpaProject(project);
		IDataModel dataModel = (IDataModel) config;
		JpaFacetUtils.setPlatform(project, dataModel.getStringProperty(PLATFORM_ID));
		JpaFacetUtils.setConnectionName(project, dataModel.getStringProperty(CONNECTION));
		
		createPersistenceXml(project, dataModel);
		
		if (dataModel.getBooleanProperty(CREATE_ORM_XML)) {
			createOrmXml(project, dataModel);
		}
		
		if (monitor != null) {
			monitor.worked(1);
		}
		
		JpaModelManager.instance().fillJpaProject(project);
		
		if (monitor != null) {
			monitor.worked(2);
		}
	}
	
	private void createPersistenceXml(IProject project, IDataModel dataModel) {
		String sourceFolder = computeSourceFolder(project);
		
		URI fileURI = URI.createPlatformResourceURI(sourceFolder + "/META-INF/persistence.xml", false);
		PersistenceResource resource = (PersistenceResource) getResourceSet(project).createResource(fileURI);
		Persistence persistence = PersistenceFactory.eINSTANCE.createPersistence();
		persistence.setVersion("1.0");
		PersistenceUnit pUnit = PersistenceFactory.eINSTANCE.createPersistenceUnit();
		pUnit.setName(project.getName());
		
		if (dataModel.getBooleanProperty(CREATE_ORM_XML)) {
			MappingFileRef mappingFile = PersistenceFactory.eINSTANCE.createMappingFileRef();
			mappingFile.setFileName(ORM_XML_FILE_PATH);
			pUnit.getMappingFiles().add(mappingFile);
		}
		
		persistence.getPersistenceUnits().add(pUnit);
		
		try {
			resource.getContents().add(persistence);
			resource.save(null);
		}
		catch (IOException e) {
			JptCorePlugin.log(e);
		}
	}
	
	private void createOrmXml(IProject project, IDataModel dataModel) {
		String sourceFolder = computeSourceFolder(project);
		
		URI fileURI = URI.createPlatformResourceURI(sourceFolder + "/" + ORM_XML_FILE_PATH, false);
		OrmXmlResource resource = (OrmXmlResource) getResourceSet(project).createResource(fileURI);
		EntityMappingsInternal entityMappings = OrmFactory.eINSTANCE.createEntityMappingsInternal();
		entityMappings.setVersion("1.0");
		
		try {
			resource.getContents().add(entityMappings);
			resource.save(null);
		}
		catch (IOException e) {
			JptCorePlugin.log(e);
		}
	}
	
	private String computeSourceFolder(IProject project) {
		IJavaProject jproject = JavaCore.create(project);
		IClasspathEntry[] classpath;
		
		try {
			classpath = jproject.getRawClasspath();
		}
		catch (JavaModelException jme) {
			classpath = new IClasspathEntry[0];
		}
		
		for (Iterator stream = CollectionTools.iterator(classpath); stream.hasNext(); ) {
			IClasspathEntry next = (IClasspathEntry) stream.next();
			if (next.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
				return next.getPath().toString();
			}
		}
		
		return "/" + project.getName();
	}
	
	private ResourceSet getResourceSet(IProject project) {
		return WorkbenchResourceHelperBase.getResourceSet(project);
	}
}
