
<%
/**
 * <copyright>
 *
 * 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
 *
 * </copyright>
 */
%>
<%GenModel genModel = (GenModel)argument;%>
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: <%=genModel.getEditorPluginID()%>; singleton:=true
Bundle-Version: 1.0.0
Bundle-ClassPath: <%if (genModel.isRuntimeJar()) {%><%=genModel.getEditorPluginID()%>.jar<%}else{%>.<%}%>
Bundle-Activator: <%=genModel.getQualifiedEditorPluginClassName()%>$Implementation
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
<%}%>
<%Iterator<String> packagesIterator = genModel.getEditorQualifiedPackageNames().iterator(); if (packagesIterator.hasNext()) { String pack = packagesIterator.next();%>
Export-Package: <%=pack%><%while(packagesIterator.hasNext()) { pack = packagesIterator.next();%>,
 <%=pack%><%}%>
<%}%>
<%Iterator<String> requiredPluginIterator = genModel.getEditorRequiredPlugins().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")){%>;visibility:=reexport<%}}%>
<%}%>
Eclipse-LazyStart: true
