/**
 *                                                                            
 * 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.util.List;

import org.eclipse.osbp.wizard.ui.basic.BasicProjectFactory;

/**
 * Factory for creating a new Model Project.
 */
public class ModelProjectFactory extends BasicProjectFactory {
	
	/** The contained factory models. */
	private List<String> factoryModels = null; 
	
	/**
	 * Sets the contained factory models.
	 * @param factoryModels the contained factory models
	 */
	public void setFactoryModels(List<String> factoryModels) {
		this.factoryModels = factoryModels;
	}
	
	@Override
	protected void createManifestAppend(final StringBuilder content) {
		content.append("OSBP-ECView-I18nProvider: \n");
		content.append("OSBP-RuntimeBuilder-BundleSpace: \n");
		content.append("Service-Component: OSGI-INF/*.xml\n");
		// add all contained factory model file extensions
		content.append("Factory-Model: "+String.join(", ", factoryModels)+"\n");
	}
}
