
<%
/**
 * Copyright (c) 2005 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 - Initial API and implementation
 */
%>
<%GenModel genModel = (GenModel)argument;%>
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: <%=genModel.getTestsPluginID()%>;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-ClassPath: <%if (genModel.isRuntimeJar()) {%><%=genModel.getTestsPluginID()%>.jar<%}else{%>.<%}%>
Bundle-Vendor: %providerName
Bundle-Localization: plugin
<%if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {%>
Bundle-RequiredExecutionEnvironment: J2SE-1.5
<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {%>
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {%>
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {%>
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {%>
Bundle-RequiredExecutionEnvironment: JavaSE-9
<%}%>
<%Iterator<String> packagesIterator = genModel.getTestsQualifiedPackageNames().iterator(); if (packagesIterator.hasNext()) { String pack = packagesIterator.next();%>
Export-Package: <%=pack%><%while(packagesIterator.hasNext()) { pack = packagesIterator.next();%>,
 <%=pack%><%}%>
<%}%>
<%Iterator<String> requiredPluginIterator = genModel.getTestsRequiredPlugins().iterator(); if (requiredPluginIterator.hasNext()) { String pluginID = requiredPluginIterator.next();%>
Require-Bundle: <%=pluginID%><%if (!pluginID.startsWith("org.eclipse.core.runtime")){%>;visibility:=reexport<%} while(requiredPluginIterator.hasNext()) { pluginID = requiredPluginIterator.next();%>,
 <%=pluginID%><%if (!pluginID.startsWith("org.eclipse.core.runtime") && !pluginID.equals("org.eclipse.xtext.xbase.lib") && !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {%>;visibility:=reexport<%}}%>
<%}%>
<%if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22 || genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {%>
Eclipse-LazyStart: true
<%}%>
Bundle-ActivationPolicy: lazy
