/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License 2.0        
 * which accompanies this distribution, and is available at                  
 * https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 * SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.wizard.ui.model;

import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IBundleGroup;
import org.eclipse.core.runtime.IBundleGroupProvider;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.wizard.ui.basic.BasicProjectCreator;
import org.eclipse.osbp.wizard.ui.basic.BasicProjectInfo;
import org.eclipse.xtext.ui.util.PluginProjectFactory;
import org.eclipse.xtext.ui.util.ProjectFactory;
import org.eclipse.xtext.ui.wizard.IProjectInfo;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

/**
 * Creator for a new Model Project.
 */
public class ModelProjectCreator extends BasicProjectCreator {

	/**
	 * Execute one model project for each existing project post fixes.
	 *
	 * @param projectInfo
	 *            the project info
	 * @param monitor
	 *            the monitor
	 * @throws InvocationTargetException
	 *             the invocation target exception
	 * @throws CoreException
	 *             the core exception
	 * @throws InterruptedException
	 *             the interrupted exception
	 */
	public static void execute(BasicProjectInfo projectInfo, IProgressMonitor monitor) throws InvocationTargetException, CoreException, InterruptedException {
		// for each project postfix
		Set<String> postfixes = projectInfo.getAllProjectPostFixes();
		for (String postfix : postfixes) {
			// generate a new model project for that postfix
			projectInfo.useForModelFactory(postfix);
			ModelProjectCreator instance = new ModelProjectCreator(projectInfo);
			instance.execute(monitor);
		}
		// return to the product project factory
		projectInfo.useForProductFactory();
	}

	/**
	 * Instantiates a new model project creator.
	 *
	 * @param projectInfo
	 *            the project info
	 */
	private ModelProjectCreator(BasicProjectInfo projectInfo) {
		super();
		super.setProjectInfo(projectInfo);
	}

	/**
	 * Do not use this method!
	 */
	@Deprecated
	@Override
	public void setProjectInfo(IProjectInfo projectInfo) {
		System.err.println();
	}

	/** The Constant SRC_ROOT. */
	protected static final String SRC_ROOT = "src";

	/** The Constant SRC_GEN_ROOT. */
	protected static final String SRC_GEN_ROOT = "src-gen";

	// /** The Constant MODELS_ROOT. */
	// protected static final String MODELS_ROOT = "models";

	/** The Constant I18N_ROOT. */
	protected static final String I18N_ROOT = "i18n";

	/** The src folder list. */
	// protected final List<String> SRC_FOLDER_LIST = ImmutableList.of(SRC_ROOT, SRC_GEN_ROOT, MODELS_ROOT, I18N_ROOT);
	protected final List<String> SRC_FOLDER_LIST = ImmutableList.of(SRC_ROOT, SRC_GEN_ROOT);

	@Override
	protected BasicProjectInfo getProjectInfo() {
		return (BasicProjectInfo) super.getProjectInfo();
	}

	@Override
	protected String getModelFolderName() {
		return SRC_ROOT;
	}

	@Override
	protected List<String> getAllFolders() {
		return SRC_FOLDER_LIST;
	}

	@Override
	protected List<String> getRequiredBundles() {
		// No need to use the super required bundles!
		List<String> result = Lists.newArrayList(); // super.getRequiredBundles());
		return addFromMultiLine(result, ManifestAttribute.REQUIRED_BUNDLE, /* getFeatureBasedRequiredPlugins() + */"net.osbee.bpm;bundle-version=\"1.0.0\";resolution:=optional,"
				+ "net.osbee.organization.permissions;bundle-version=\"1.0.0\";resolution:=optional," + "net.osbee.org.drools;bundle-version=\"5.5.1\";resolution:=optional," + "OpenCSV;bundle-version=\"2.3.0\";resolution:=optional,"
				+ "animator.osgi;bundle-version=\"0.2.0\"," + "com.ibm.icu;bundle-version=\"52.1.0\"," + "com.vaadin.client;bundle-version=\"7.5.7\","
				+ "com.vaadin.server;bundle-version=\"7.5.7\"," + "com.vaadin.shared;bundle-version=\"7.5.7\"," + "dCharts.osgi;bundle-version=\"1.7.0\","
				+ "dom.osgi;bundle-version=\"0.1.0\"," + "easyuploads.osgi;bundle-version=\"7.4.2\"," + "filteringtable.osgi;bundle-version=\"0.9.13\","
				+ "javax.inject;bundle-version=\"1.0.0\"," + "javax.persistence;bundle-version=\"2.1.0\"," + "javax.validation.api;bundle-version=\"1.1.0\","
				+ "joda-time;bundle-version=\"2.3.0\"," + "mondrian.osgi;bundle-version=\"3.5.0\"," + "olap4j.osgi;bundle-version=\"[1.1.0#1.3.1)\","
				+ "org.apache.commons.beanutils;bundle-version=\"1.8.0\"," + "org.apache.commons.collections;bundle-version=\"3.2.1\","
				+ "org.apache.commons.dbcp;bundle-version=\"1.4.0\"," + "org.apache.commons.discovery;bundle-version=\"0.5.0\","
				+ "org.apache.commons.lang3;bundle-version=\"3.1.0\"," + "org.apache.commons.lang;bundle-version=\"2.6.0\","
				+ "org.apache.commons.logging;bundle-version=\"1.1.1\"," + "org.apache.commons.math3;bundle-version=\"3.1.1\","
				+ "org.apache.commons.math;bundle-version=\"1.2.0\"," + "org.apache.commons.net;bundle-version=\"3.2.0\"," + "org.apache.commons.pool;bundle-version=\"1.6.0\","
				+ "org.apache.commons.vfs;bundle-version=\"2.0.0\"," + "org.apache.log4j;bundle-version=\"1.2.15\"," 
				+ "org.eclipse.birt.core;bundle-version=\"4.4.0\"," + "org.eclipse.birt.data.aggregation;bundle-version=\"4.4.0\","
				+ "org.eclipse.birt.data;bundle-version=\"4.4.0\"," + "org.eclipse.birt.report.data.adapter;bundle-version=\"4.4.0\","
				+ "org.eclipse.birt.report.engine.emitter.html;bundle-version=\"4.4.0\"," + "org.eclipse.birt.report.engine.emitter.pdf;bundle-version=\"4.4.0\","
				+ "org.eclipse.birt.report.engine.fonts;bundle-version=\"4.3.2\"," + "org.eclipse.birt.report.engine.fonts;bundle-version=\"4.4.0\","
				+ "org.eclipse.birt.report.engine.script.javascript;bundle-version=\"4.4.0\"," + "org.eclipse.birt.report.engine;bundle-version=\"4.4.0\","
				+ "org.eclipse.birt.report.model;bundle-version=\"4.4.0\"," + "org.eclipse.core.commands;bundle-version=\"3.6.100\","
				+ "org.eclipse.core.databinding.beans;bundle-version=\"1.2.200\"," + "org.eclipse.core.databinding.observable;bundle-version=\"1.4.1\","
				+ "org.eclipse.core.databinding.property;bundle-version=\"1.4.200\"," + "org.eclipse.core.databinding;bundle-version=\"1.4.2\"," + "org.eclipse.core.runtime,"
				+ "org.eclipse.e4.core.commands;bundle-version=\"0.10.2\"," + "org.eclipse.e4.core.contexts;bundle-version=\"1.5.1\"," + "org.eclipse.e4.core.di.extensions,"
				+ "org.eclipse.e4.core.di;bundle-version=\"1.4.0\"," + "org.eclipse.e4.core.services;bundle-version=\"2.0.100\"," + "org.eclipse.e4.ui.di;bundle-version=\"1.0.0\","
				+ "org.eclipse.e4.ui.model.workbench;bundle-version=\"1.1.0\"," + "org.eclipse.e4.ui.services;bundle-version=\"1.1.0\","
				+ "org.eclipse.e4.ui.workbench;bundle-version=\"1.4.0\"," + "org.eclipse.emf.ecore;bundle-version=\"2.10.2\"," + "org.eclipse.emf.mwe.core,"
				+ "org.eclipse.gemini.dbaccess.util;bundle-version=\"1.1.0\"," + "org.eclipse.jdt.core;bundle-version=\"3.10.0\","
				+ "org.eclipse.osbp.authentication;bundle-version=\"0.9.0\"," + "org.eclipse.osbp.authentication.ui;bundle-version=\"0.9.0\","
				+ "org.eclipse.osbp.bpm;bundle-version=\"0.9.0\"," + "org.eclipse.osbp.bpm.api;bundle-version=\"0.9.0\"," 
				+ "org.eclipse.osbp.datainterchange.api;bundle-version=\"0.9.0\"," + "org.eclipse.osbp.dsl.common.xtext;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.dsl.datatype.lib;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.dsl.dto.lib;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.dsl.entity.xtext;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.ecview.core.common.editparts.emf;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.ecview.core.common;bundle-version=\"0.9.0\""
				+ "org.eclipse.osbp.ecview.core.common.model;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.ecview.core.common;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.ecview.core.extension.model;bundle-version=\"0.8.1\"," + "org.eclipse.osbp.ecview.dsl.lib;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.ecview.dsl;bundle-version=\"0.9.1\";resolution:=optional," + "org.eclipse.osbp.ecview.extension.api;bundle-version=\"0.1.0\","
				+ "org.eclipse.osbp.ecview.extension.editparts.emf;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.ecview.extension.editparts;bundle-version=\"0.1.0\","
				+ "org.eclipse.osbp.ecview.extension.grid.editparts;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.ecview.extension.grid.model;bundle-version=\"0.1.0\","
				+ "org.eclipse.osbp.ecview.extension.model;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.ecview.extension.presentation.vaadin;bundle-version=\"0.1.0\","
				+ "org.eclipse.osbp.ecview.extension.strategy;bundle-version=\"1.0.0\"," + "org.eclipse.osbp.ecview.extension.widgetset;bundle-version=\"0.1.0\","
				+ "org.eclipse.osbp.ecview.xtext.builder.participant;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.eventbroker;bundle-version=\"0.9.0\","
				+ "org.eclipse.osbp.gitinfo;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.infogrid.api;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.infogrid.vaaclipse;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.jpa.services;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.mobile.vaadin.ecview.api;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.mobile.vaadin.ecview.model;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.osgi.hybrid.api;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.runtime.common;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.runtime.jsr303.validation;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.runtime.web.ecview.presentation.vaadin;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.runtime.web.vaadin.common;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.runtime.web.vaadin.databinding;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.ui.api;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.ui.common," + "org.eclipse.osbp.user,"
				+ "org.eclipse.osbp.blob;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.utils.functionnormalizer,"
				+ "org.eclipse.osbp.utils.themes.ui;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.utils.ui;bundle-version=\"0.1.0\","
				+ "org.eclipse.osbp.utils;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.vaaclipse.addons.common.api;bundle-version=\"0.1.0\","
				+ "org.eclipse.osbp.vaaclipse.addons.softwarefactory;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.vaaclipse.api;bundle-version=\"0.9.0\","
				+ "org.eclipse.osbp.vaaclipse.common.ecview.api;bundle-version=\"0.9.1\"," + "org.eclipse.osbp.vaaclipse.publicapi;bundle-version=\"2.7.3\","
				+ "org.eclipse.osbp.vaaclipse.theme;bundle-version=\"2.7.3\"," + "org.eclipse.osbp.vaadin.widgetset," + "org.eclipse.osbp.vaadin;bundle-version=\"2.7.3\","
				+ "org.eclipse.osbp.webserver.messagequeue;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.xtext.builder.metadata.services;bundle-version=\"0.9.1\","
				+ "org.eclipse.osbp.xtext.cubedsl;bundle-version=\"0.9.0\";resolution:=optional,"
				+ "org.eclipse.osbp.xtext.datamartdsl;bundle-version=\"0.9.0\";resolution:=optional,"
				+ "org.eclipse.osbp.xtext.entitymock.common;bundle-version=\"0.9.0\"," + "org.eclipse.osbp.xtext.functionlibrary.common,"
				+ "org.eclipse.osbp.xtext.menu;bundle-version=\"0.1.0\"," + "org.eclipse.osbp.xtext.table.common;bundle-version=\"0.1.0\","
				+ "org.eclipse.osgi.services;bundle-version=\"3.4.0\"," + "org.eclipse.persistence.antlr;bundle-version=\"3.2.0\","
				+ "org.eclipse.persistence.asm;bundle-version=\"3.3.1\"," + "org.eclipse.persistence.core;bundle-version=\"2.6.0\","
				+ "org.eclipse.persistence.jpa;bundle-version=\"2.5.1\"," + "org.eclipse.uomo.core;bundle-version=\"0.6.0\"," + "org.eclipse.uomo.units;bundle-version=\"0.6.0\","
				+ "org.eclipse.xtext.xbase.lib;bundle-version=\"[2.11.0#2.12.0)\"," + "org.eclipse.xtext.xbase;bundle-version=\"[2.11.0#2.12.0)\";resolution:=optional,"
				+ "org.joda.money;bundle-version=\"0.10.0\"," + "org.jsoup;bundle-version=\"1.8.1\"," + "org.junit;bundle-version=\"4.11.0\","
				+ "org.mozilla.javascript;bundle-version=\"1.7.5\"," + "org.mvel2;bundle-version=\"2.1.6\"," + "org.unitsofmeasurement.unit-api;bundle-version=\"0.6.1\","
				+ "osgi.enterprise;bundle-version=\"4.2.0\"," + "overlays.osgi;bundle-version=\"1.0.0\"," + "popupbutton.osgi;bundle-version=\"2.5.0\","
				+ "refresher.osgi;bundle-version=\"1.2.3\"," + "sizereporter.osgi;bundle-version=\"0.1.4\"," + "");
	}

	@Override
	protected List<String> getImportedPackages() {
		List<String> result = Lists.newArrayList(super.getImportedPackages());
		return addFromMultiLine(result, ManifestAttribute.IMPORTED_PACKAGE,
				"org.apache.commons.io;version=\"2.1.0\"," + "org.apache.commons.lang," + "org.eclipse.bpmn2,"
						+ "org.eclipse.e4.core.contexts," + "org.eclipse.e4.core.di," + "org.eclipse.e4.core.di.annotations," + "org.eclipse.e4.ui.di,"
						+ "org.eclipse.e4.ui.model.application," + "org.eclipse.e4.ui.model.application.ui," + "org.eclipse.e4.ui.model.application.ui.basic,"
						+ "org.eclipse.e4.ui.model.application.ui.menu," + "org.eclipse.osbp.dsl.common.datatypes,"
						+ "org.eclipse.osbp.dsl.dto.lib.impl," + "org.eclipse.osbp.ecview.core.util.emf," + "org.eclipse.osbp.eventbroker," + "org.eclipse.osbp.osgi.hybrid.api,"
						+ "org.eclipse.osbp.core.api.persistence," + "org.eclipse.osbp.preferences,"
						// + "org.eclipse.osbp.ui.api.contextfunction," + "org.eclipse.osbp.ui.api.metadata," + "org.eclipse.osbp.ui.api.useraccess,"
						+ "org.eclipse.osbp.vaaclipse.presentation.engine," + "org.eclipse.osbp.vaaclipse.presentation.renderers," + "org.eclipse.osbp.xtext.blip,"
						+ "org.eclipse.osbp.xtext.blip.common," + "org.eclipse.osbp.xtext.datainterchange.common," + "org.eclipse.osbp.xtext.datamart.common,"
						+ "org.eclipse.osbp.xtext.datamart.common.olap," + "org.eclipse.osbp.xtext.datamart.common.sql," + "org.eclipse.osbp.xtext.datamartdsl,"
						+ "org.eclipse.osbp.xtext.dialogdsl.common," + "org.eclipse.osbp.xtext.functionlibrary.common," + "org.eclipse.osbp.xtext.i18n,"
						+ "org.eclipse.osbp.xtext.messagedsl.common," + "org.eclipse.osbp.xtext.reportdsl.common," + "org.eclipse.osbp.xtext.reportdsl.common.attribute,"
						+ "org.eclipse.osbp.xtext.reportdsl.common.item," + "org.eclipse.osbp.xtext.reportdsl.jvmmodel," 
						+ "org.eclipse.osbp.xtext.reportdsl.oda.datamart.impl," + "org.eclipse.persistence.annotations;version=\"2.5.1\"," + "org.osgi.service.component.annotations;version=\"1.2.0\","
						+ "org.slf4j;version=\"1.7.2\";resolution:=optional," + "org.tepi.filtertable," + "");
	}

	@Override
	protected List<String> getExportedPackages() {
		List<String> result = Lists.newArrayList(super.getExportedPackages());
		return addFromMultiLine(result, ManifestAttribute.EXPORTED_PACKAGE, "");
	}

	/**
	 * Gets the factory models.
	 *
	 * @return the factory models
	 */
	protected List<String> getFactoryModels() {
		List<String> result = Lists.newArrayList();
		return addFromMultiLine(result, ManifestAttribute.FACTORY_MODEL, "");
	}

	@Override
	protected ProjectFactory configureProjectFactory(ProjectFactory factory) {
		// ----------- !!!!DON´T MOVE THIS!!!! --------------
		// This path manipulation is mandatory to put the product plugin project as subfolder of the aggregator.
		// The setting of this new location path to projectInfo has to be before the call of super.configureProjectFactory(factory).
		IPath path = Platform.getLocation().append(getProjectInfo().getBasicProjectName()).append(getProjectInfo().getProjectName());
		getProjectInfo().setLocationPath(path.makeAbsolute());
		// ---------------------------------------------------
		ProjectFactory result = super.configureProjectFactory(factory);
		((ModelProjectFactory) result).setFactoryModels(getFactoryModels());
		((ModelProjectFactory) result).configureFrom(getProjectInfo());
		((ModelProjectFactory) result).setRule(getRule());
		return result;
	}

	/**
	 * @return a specific model project factory
	 */
	@Override
	protected PluginProjectFactory createProjectFactory() {
		return new ModelProjectFactory(); // super.createProjectFactory();
	}

	@Override
	protected String getActivatorClassName() {
		return getProjectInfo().getModelProjectPackageName() + ".Activator"; // super.getActivatorClassName();
	}

	@Override
	protected String getEncoding() throws CoreException {
		return super.getEncoding();
	}

	/*
	 * please add any natures via template /org.eclipse.osbp.wizard.ui/wizardtemplates/MODEL/__basic__/PROJECT.__basic__/.project.TEMPLATE_NO_COMMENT
	 * /org.eclipse.osbp.wizard.ui/wizardtemplates/MODEL/__basic__/PROJECT.blip/.project.TEMPLATE_NO_COMMENT
	 * /org.eclipse.osbp.wizard.ui/wizardtemplates/MODEL/__basic__/PROJECT.core/.project.TEMPLATE_NO_COMMENT
	 * 
	 * @Override protected String[] getProjectNatures() { Set<String> projectNatures = new LinkedHashSet<String>(); projectNatures.add("org.eclipse.pde.PluginNature");
	 * projectNatures.add("org.eclipse.jdt.core.javanature"); projectNatures.add("org.eclipse.xtext.ui.shared.xtextNature");
	 * projectNatures.add("org.eclipse.babel.editor.rbeNature"); projectNatures.add("org.eclipse.osbp.ide.core.ui.shared.OSBPNature");
	 * projectNatures.add("org.eclipse.osbp.ide.core.ui.softwarefactory.OSBP2Nature"); return projectNatures.toArray(new String[0]); }
	 */

	/*
	 * please add any builder via template /org.eclipse.osbp.wizard.ui/wizardtemplates/MODEL/__basic__/PROJECT.__basic__/.project.TEMPLATE_NO_COMMENT
	 * /org.eclipse.osbp.wizard.ui/wizardtemplates/MODEL/__basic__/PROJECT.blip/.project.TEMPLATE_NO_COMMENT
	 * /org.eclipse.osbp.wizard.ui/wizardtemplates/MODEL/__basic__/PROJECT.core/.project.TEMPLATE_NO_COMMENT
	 * 
	 * @Override protected String[] getBuilders() { Set<String> builders = new LinkedHashSet<String>(); builders.add("org.eclipse.xtext.ui.shared.xtextBuilder");
	 * builders.add("org.eclipse.osbp.ide.core.ui.shared.OSBPModelEnhancingBuilder"); builders.add("org.eclipse.osbp.ide.core.ui.shared.OSBPI18nBuilder");
	 * builders.add("org.eclipse.osbp.ide.core.ui.softwarefactory.OSBP2Builder"); builders.add("org.eclipse.jdt.core.javabuilder"); builders.add("org.eclipse.pde.ManifestBuilder");
	 * builders.add("org.eclipse.pde.SchemaBuilder"); builders.add("org.eclipse.wst.validation.validationbuilder"); builders.add("org.eclipse.babel.editor.rbeBuilder");
	 * builders.add("org.eclipse.pde.ds.core.builder"); return builders.toArray(new String[0]); }
	 */

	/**
	 * Enhance the model project and display the progress on the monitor.
	 * 
	 * @param project
	 * @param monitor
	 */
	@Override
	protected void enhanceProject(final IProject project, final IProgressMonitor monitor) throws CoreException {
		enhanceProject(project, monitor, "model");
	}

	@SuppressWarnings("restriction")
	@Override
	protected String[] getProjectNatures() {
		Set<String> projectNatures = new LinkedHashSet<>();
		if (ProductConfiguration.isMavenActivated()) {
			projectNatures.add(IMavenConstants.NATURE_ID);
		}
		projectNatures.addAll(Arrays.asList(super.getProjectNatures()));
		if (getProjectInfo().isProjectPostFix(".blip")) {
			projectNatures.add("org.eclipse.bpmn2.modeler.core.bpmn2Nature");
		}
		if (getProjectInfo().isLuPostfix()) {
			projectNatures.add("org.eclipse.osbp.ide.core.ui.shared.OSBPNature");
		}
		projectNatures.add("org.eclipse.osbp.ide.core.ui.softwarefactory.OSBP2Nature");
		return projectNatures.toArray(new String[0]);
	}

	@SuppressWarnings("restriction")
	@Override
	protected String[] getBuilders() {
		Set<String> projectBuilders = new LinkedHashSet<>();
		if (ProductConfiguration.isMavenActivated()) {
			projectBuilders.add(IMavenConstants.BUILDER_ID);
		}
		projectBuilders.addAll(Arrays.asList(super.getBuilders()));
		projectBuilders.add("org.eclipse.osbp.ide.core.ui.softwarefactory.OSBP2Builder");
		if (getProjectInfo().isLuPostfix()) {
			projectBuilders.add("org.eclipse.osbp.ide.core.ui.shared.OSBPModelEnhancingBuilder");
		}
		projectBuilders.add("org.eclipse.pde.ds.core.builder");
		projectBuilders.add("org.eclipse.wst.validation.validationbuilder");
		if (getProjectInfo().isProjectPostFix(".blip")) {
			projectBuilders.add("org.eclipse.bpmn2.modeler.core.bpmn2Builder");
		}
		return projectBuilders.toArray(new String[0]);
	}

	private String getFeatureBasedRequiredPlugins() {
		boolean netOsbee = false;
		boolean orgOsbee = false;
		for (IBundleGroupProvider provider : Platform.getBundleGroupProviders()) {
			for (IBundleGroup feature : provider.getBundleGroups()) {
				String featureId = feature.getIdentifier();
				if (featureId != null) {
					if (featureId.startsWith("net.osbee")) {
						netOsbee = true;
					} else if (featureId.startsWith("org.osbee")) {
						orgOsbee = true;
					}
				}
			}
		}
		if (netOsbee) {
			return getNetOsbeeRequiredPlugins();
		} else if (orgOsbee) {
			return getOrgOsbeeRequiredPlugins();
		}
		return "";
	}

	private String getNetOsbeeRequiredPlugins() {
		return "net.osbee.bpm;bundle-version=\"1.0.0\"," + "net.osbee.organization.permissions;bundle-version=\"1.0.0\"," + getOrgOsbeeRequiredPlugins();
	}

	private String getOrgOsbeeRequiredPlugins() {
		return "OpenCSV;bundle-version=\"2.3.0\",";
	}

}
