/*******************************************************************************
 * Copyright (c) 2014 Bosch Software Innovations GmbH and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompany this distribution.
 *
 * The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * The Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 * Bosch Software Innovations GmbH - Please refer to git log
 *
 *******************************************************************************/
package org.eclipse.vorto.codegen.api.tasks.eclipse;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
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.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.JavaRuntime;

/**
 * Configures the classpath and source folders for a Java Project
 * 
 *
 * 
 */
public class ClasspathConfiguration extends AbstractConfiguration {

	private String[] sourceFolders = new String[0];

	public ClasspathConfiguration(String... sourceFolders) {
		this.sourceFolders = sourceFolders;
	}

	@Override
	public IEclipseProjectConfiguration configure(IProject project) {
		IJavaProject javaProject = JavaCore.create(project);
		try {
			javaProject.setRawClasspath(getClasspathEntries(project),
					new NullProgressMonitor());
			javaProject.setOutputLocation(project.getFolder("target")
					.getFullPath(), new NullProgressMonitor());
		} catch (JavaModelException e1) {
		}

		return this;
	}

	private IClasspathEntry[] getClasspathEntries(IProject project) {

		IClasspathEntry[] newEntries = new IClasspathEntry[sourceFolders.length + 1];

		for (int i = 0; i < sourceFolders.length; i++) {
			newEntries[i] = JavaCore.newSourceEntry(project.getFolder(
					sourceFolders[i]).getFullPath());
		}

		newEntries[sourceFolders.length] = getVmClasspathEntry();

		return newEntries;
	}

	private IClasspathEntry getVmClasspathEntry() {
		IPath containerPath = new Path(JavaRuntime.JRE_CONTAINER);
		IVMInstall vmInstall = JavaRuntime.getDefaultVMInstall();
		IPath vmPath = containerPath.append(
				vmInstall.getVMInstallType().getId()).append(
				vmInstall.getName());
		return JavaCore.newContainerEntry(vmPath);

	}

}
