org.eclipse.mdht.uml.cda.ui.wizards.NewCDAModelProjectWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mdht.uml.cda.ui.wizards.NewCDAModelProjectWizard.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Sean Muir 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:
 *     Sean Muir - initial API and implementation
 *     IBM Corporation - fixed issue related to project manifests (artf2756)
 *
 *******************************************************************************/
package org.eclipse.mdht.uml.cda.ui.wizards;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.mdht.uml.cda.core.profile.CDATemplate;
import org.eclipse.mdht.uml.cda.core.profile.CodegenSupport;
import org.eclipse.mdht.uml.cda.core.util.CDAModelUtil.FindResourcesByNameVisitor;
import org.eclipse.mdht.uml.cda.ui.internal.Activator;
import org.eclipse.mdht.uml.cda.ui.internal.Logger;
import org.eclipse.mdht.uml.cda.ui.util.CDAUIUtil;
import org.eclipse.pde.internal.ui.wizards.IProjectProvider;
import org.eclipse.pde.internal.ui.wizards.plugin.NewProjectCreationOperation;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CopyFilesAndFoldersOperation;
import org.eclipse.ui.ide.IDE;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Type;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.resource.UML22UMLResource;
import org.osgi.framework.Bundle;

public class NewCDAModelProjectWizard extends CDAWizard {

    protected NewCDAModelPage newCDATemplatePage;

    private boolean checkForSpaces() {
        Bundle bundle = Platform.getBundle(org.eclipse.mdht.uml.cda.ui.internal.Activator.PLUGIN_ID);

        URL url = bundle.getEntry("/");

        if (url.getPath().indexOf(" ") >= 0) {
            return true;
        }

        IWorkspace workspace = ResourcesPlugin.getWorkspace();

        IWorkspaceRoot root = workspace.getRoot();

        IPath rootPath = root.getLocation();
        if (rootPath.toOSString().indexOf(" ") >= 0) {
            return true;
        }

        return false;
    }

    @Override
    public void addPages() {

        loadCDAModels();

        if (cdaDocuments.isEmpty()) {
            MessageDialog.openWarning(getShell(), "MDHT CDA Project Wizard Exception",
                    "Unable to create CDA Project, No Available CDA Documents in Workspace!");
            return;
        }

        if (checkForSpaces()) {
            MessageDialog.openWarning(getShell(), "MDHT CDA Project Wizard Exception",
                    "Unable to create CDA Project, Unable to support Spaces ' ' within installation or workspace location");
            return;
        }

        newCDATemplatePage = new NewCDAModelPage("MDHT CDA Model", "Eclipse Modeling Project ", null, cdaDocuments);
        newCDATemplatePage.setDescription("Creates the CDA Model");
        newCDATemplatePage.setMessage("Use to create CDA Implementation Guide Model Project");
        addPage(newCDATemplatePage);
    }

    @Override
    public boolean performFinish() {

        try {

            ProgressMonitorDialog pd = new ProgressMonitorDialog(getShell());

            IWorkspace workspace = ResourcesPlugin.getWorkspace();

            IWorkspaceRoot root = workspace.getRoot();

            final String modelName = newCDATemplatePage.getModelName().toLowerCase();

            modelProject = root
                    .getProject(String.format("%s.%s.model", newCDATemplatePage.getBasePackage(), modelName));
            generatedProject = root
                    .getProject(String.format("%s.%s", newCDATemplatePage.getBasePackage(), modelName));
            docProject = root
                    .getProject(String.format("%s.%s.doc", newCDATemplatePage.getBasePackage(), modelName));

            pd.run(false, false, new IRunnableWithProgress() {

                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {

                    monitor.beginTask("Creating Projects", 9);

                    try {
                        modelProject.create(monitor);

                        modelProject.open(monitor);

                        generatedProject.create(monitor);

                        generatedProject.open(monitor);

                        docProject.create(monitor);

                        docProject.open(monitor);

                        // Use pde internal functionality to create plugin

                        IProjectProvider generatedProjectProvider = new IProjectProvider() {

                            public IProject getProject() {

                                return generatedProject;
                            }

                            public String getProjectName() {

                                return generatedProject.getName();
                            }

                            public IPath getLocationPath() {

                                return generatedProject.getFullPath();
                            }

                        };

                        getContainer().run(false, true, new NewProjectCreationOperation(fPluginData,
                                generatedProjectProvider, contentWizard));

                        IProjectProvider docProjectProvider = new IProjectProvider() {

                            public IProject getProject() {

                                return docProject;
                            }

                            public String getProjectName() {

                                return docProject.getName();
                            }

                            public IPath getLocationPath() {

                                return docProject.getFullPath();
                            }

                        };

                        getContainer().run(false, true,
                                new NewProjectCreationOperation(fPluginData, docProjectProvider, contentWizard));

                        monitor.worked(1);

                        monitor.setTaskName("Create Manifest for Generated Project");
                        createGeneratedProjectManifest(generatedProject, newCDATemplatePage.getBasePackage(),
                                modelName);
                        monitor.worked(1);

                        monitor.setTaskName("Create Manifest for Doc Project");
                        createDocumentProjectManifest(docProject, newCDATemplatePage.getBasePackage(), modelName);
                        monitor.worked(1);

                        monitor.setTaskName("Create css");
                        createFolder(docProject, "css");

                        monitor.setTaskName("Create dita");
                        createFolder(docProject, "dita");

                        createDocProject(docProject, modelName);

                        createPluginProperties(docProject, modelName);
                        updateBuildProperties(docProject);
                        createDitaProperties(docProject, newCDATemplatePage.getBasePackage(), modelName);

                        monitor.setTaskName("Create UML Model");
                        createFolder(modelProject, "model");

                        createUMLModel(modelProject, newCDATemplatePage.getNamespaceURI(),
                                newCDATemplatePage.getBasePackage(), modelName);
                        monitor.worked(1);

                        monitor.setTaskName("Create Model Plugin");
                        createModelPlugin(modelProject, modelName);

                        monitor.setTaskName("Create Manifest for Model Project");
                        createModelProjectManifest(modelProject, newCDATemplatePage.getBasePackage(), modelName);
                        monitor.worked(1);

                        monitor.setTaskName("Create Transformation XML");
                        createTransformation(generatedProject, modelName);
                        monitor.worked(1);

                        monitor.setTaskName("Add Properties");
                        createPluginProperties(generatedProject, modelName);
                        updateBuildProperties(generatedProject);

                        monitor.setTaskName("Run MDHT Transformation");
                        org.eclipse.mdht.uml.cda.ui.builder.CDABuilder.runTransformation(generatedProject, monitor);
                        monitor.worked(1);

                        monitor.setTaskName("Create GenModel");
                        org.eclipse.mdht.uml.cda.ui.builder.CDABuilder.createGenModel(generatedProject, monitor);
                        monitor.worked(1);

                        monitor.setTaskName("Run MDHT Transformation");
                        org.eclipse.mdht.uml.cda.ui.builder.CDABuilder.runTransformation(generatedProject, monitor);
                        monitor.worked(1);

                        monitor.setTaskName("Generate");
                        org.eclipse.mdht.uml.cda.ui.builder.CDABuilder.runGenerate(false, generatedProject,
                                monitor);
                        monitor.worked(1);
                        generatedProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);

                        monitor.setTaskName("Toggle Build Nature");
                        org.eclipse.mdht.uml.cda.ui.builder.ToggleNatureAction.toggleNature(generatedProject);
                        org.eclipse.mdht.uml.cda.ui.builder.ToggleNatureAction.toggleNature(docProject);
                        monitor.worked(1);

                        setupWorkspace(modelProject, modelName);

                    } catch (Exception exception) {
                        monitor.setCanceled(true);

                        Logger.logException(exception);

                        throw new InvocationTargetException(exception);

                    }

                }
            });

            docProject.refreshLocal(IResource.DEPTH_INFINITE, null);
            modelProject.refreshLocal(IResource.DEPTH_INFINITE, null);
            generatedProject.refreshLocal(IResource.DEPTH_INFINITE, null);

        } catch (InvocationTargetException exception) {

            Logger.logException(exception);

            Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0,
                    exception.getCause().getLocalizedMessage(), exception.getCause());

            ErrorDialog.openError(getShell(), "MDHT CDA Project Wizard Exception",
                    "Unable to create new CDA Project", status);

            // try {
            // docProject.delete(true, null);
            // modelProject.delete(true, null);
            // generatedProject.delete(true, null);
            // } catch (CoreException coreException) {
            // Logger.logException(coreException);
            // }

        } catch (InterruptedException interruptedException) {
            Logger.logException(interruptedException);
        } catch (CoreException coreException) {
            Logger.logException(coreException);
        }

        return true;
    }

    protected void setupWorkspace(IProject modelProject, String modelName) throws Exception {
        IWorkbench workbench = PlatformUI.getWorkbench();
        final IWorkbenchPage activePage = workbench.getActiveWorkbenchWindow().getActivePage();
        activePage.closeEditors(activePage.getEditorReferences(), true);

        IFileStore fileStore = EFS.getLocalFileSystem()
                .getStore(modelProject.getFolder("model").getFile(modelName + ".uml").getLocation());
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();

        IDE.openEditorOnFileStore(page, fileStore);

    }

    void createDocProject(IProject project, String modelName) throws Exception {

        CopyFilesAndFoldersOperation copyOperation = new CopyFilesAndFoldersOperation(this.getShell());
        Bundle bundle = Platform.getBundle(org.eclipse.mdht.uml.cda.ui.internal.Activator.PLUGIN_ID);
        ArrayList<java.net.URI> elements = new ArrayList<java.net.URI>();

        Enumeration<java.net.URL> entries = bundle.findEntries("resources/dita", "*", true);

        while (entries.hasMoreElements()) {

            elements.add(
                    FileLocator.toFileURL(new URL(bundle.getEntry("/"), entries.nextElement().getPath())).toURI());

        }

        java.net.URI[] ditauris = new java.net.URI[elements.size()];
        elements.toArray(ditauris);
        copyOperation.copyFiles(ditauris, project.getFolder(new Path("dita")));

        entries = bundle.findEntries("resources/css", "*", true);
        elements.clear();
        while (entries.hasMoreElements()) {

            elements.add(
                    FileLocator.toFileURL(new URL(bundle.getEntry("/"), entries.nextElement().getPath())).toURI());

        }

        java.net.URI[] cssuris = new java.net.URI[elements.size()];
        elements.toArray(cssuris);

        copyOperation.copyFiles(cssuris, project.getFolder(new Path("css")));

        entries = bundle.findEntries("resources", "dita-transform.xml", false);
        elements.clear();
        while (entries.hasMoreElements()) {

            elements.add(
                    FileLocator.toFileURL(new URL(bundle.getEntry("/"), entries.nextElement().getPath())).toURI());

        }

        java.net.URI[] transformuris = new java.net.URI[elements.size()];
        elements.toArray(transformuris);
        copyOperation.copyFiles(transformuris, project);

        IProjectDescription description;

        description = project.getDescription();
        String[] newNatures = new String[0];
        description.setNatureIds(newNatures);
        project.setDescription(description, null);

        IFolder srcFolder = project.getFolder("src");

        if (srcFolder.exists()) {

            srcFolder.delete(true, null);

        }

        IFolder binFolder = project.getFolder("bin");

        if (binFolder.exists()) {

            binFolder.delete(true, null);

        }

    }

    private Package cloneModel(IProject project, ResourceSet resourceSet, Map<String, String> options,
            String sourcePathName, String clonePath, String packageName) throws IOException {

        URI cloneModelURI = URI.createPlatformPluginURI(sourcePathName, false);

        Package sourcePackage = (Package) EcoreUtil.getObjectByType(
                resourceSet.getResource(cloneModelURI, true).getContents(),
                UMLPackage.eINSTANCE.getPackageableElement());

        Package clonedPackage = EcoreUtil.copy(sourcePackage);

        clonedPackage.setName(packageName);

        IPath cloneFilePath = new Path(clonePath);

        IFile file = CDAUIUtil.getBundleRelativeFile(project, cloneFilePath);

        IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

        String cdaUMLPath = myWorkspaceRoot.getLocation().toOSString() + file.getFullPath().toOSString();

        URI targetModelURI = URI.createFileURI(cdaUMLPath);

        Resource umlResource = UML22UMLResource.Factory.INSTANCE.createResource(targetModelURI);

        umlResource.getContents().add(clonedPackage);

        umlResource.save(options);

        return clonedPackage;
    }

    private final String TEMPLATEURI = String.format("%s/resources/model/%s", Activator.PLUGIN_ID, "example.uml");

    private final String VOCABURI = String.format("%s/resources/model/%s", Activator.PLUGIN_ID,
            "example-vocab.uml");

    void createUMLModel(IProject project, String namespaceURI, String basePackage, String modelName)
            throws Exception {

        ResourceSet resourceSet = new ResourceSetImpl();

        org.eclipse.mdht.uml.common.UmlPlugin.computeModelPathMapExtensions();

        resourceSet.getURIConverter().getURIMap().putAll(EcorePlugin.computePlatformURIMap(false));

        Map<String, String> options = new HashMap<String, String>();

        Package templatePackage = cloneModel(project, resourceSet, options, TEMPLATEURI,
                String.format("model/%s.uml", modelName.toLowerCase()), modelName.toLowerCase());

        Package vocabPackage = cloneModel(project, resourceSet, options, VOCABURI,
                String.format("model/%s-vocab.uml", modelName.toLowerCase()),
                String.format("%s-vocab", modelName.toLowerCase()));

        CodegenSupport codegenSupport = (CodegenSupport) templatePackage
                .applyStereotype(templatePackage.getApplicableStereotype("CDA::CodegenSupport"));

        codegenSupport.setBase_Namespace(templatePackage);

        codegenSupport.setBasePackage(basePackage);

        codegenSupport.setNsURI(namespaceURI);

        codegenSupport.setNsPrefix(newCDATemplatePage.getNsPrefix()); // modelName.toLowerCase());

        codegenSupport.setPackageName(modelName.toLowerCase());

        codegenSupport.setPrefix(newCDATemplatePage.getPrefix()); // modelName.substring(0, 1).toUpperCase() + modelName.substring(1));

        Class cdaClass = templatePackage.createOwnedClass(newCDATemplatePage.getCDADocumentName(), false);

        CDATemplate template = (CDATemplate) cdaClass
                .applyStereotype(cdaClass.getApplicableStereotype("CDA::CDATemplate"));

        template.setBase_Class(cdaClass);

        template.setTemplateId(newCDATemplatePage.getTemplateId());

        template.setAssigningAuthorityName(newCDATemplatePage.getTemplateAssigningAuthority());

        Type t = cdaDocuments.get(newCDATemplatePage.getCDADocument());

        if (t instanceof Class) {
            Class documentClass = (Class) t;
            cdaClass.createGeneralization(documentClass);
            Package documentPackage = documentClass.getNearestPackage();
            EcoreUtil.resolveAll(documentPackage);
            templatePackage.createPackageImport(documentClass.getNearestPackage());
        }

        templatePackage.createPackageImport(vocabPackage);

        templatePackage.eResource().save(options);

    }

    void createTransformation(IProject project, String modelName) throws Exception {

        FindResourcesByNameVisitor visitor = new FindResourcesByNameVisitor("transform-common.xml");

        IWorkspace iw = org.eclipse.core.resources.ResourcesPlugin.getWorkspace();

        iw.getRoot().accept(visitor);

        // Default transform file location to cda
        String transformCommonProject = "org.eclipse.mdht.uml.cda";
        // Search for it in the case of an extension
        if (!visitor.getResources().isEmpty() && visitor.getResources().size() == 1) {
            transformCommonProject = visitor.getResources().get(0).getProject().getName();
        }

        StringWriter swriter = new StringWriter();

        PrintWriter writer = new PrintWriter(swriter);

        writer.println("<?eclipse version=\"3.0\"?>");
        writer.println("<project name=\"CDA Model Transformation\"  basedir=\".\" default=\"all\">");

        writer.println("<eclipse.convertPath resourcePath=\"" + transformCommonProject
                + "\" property=\"cdaPluginPath\"/>");
        writer.println("<property name=\"modelName\" value=\"" + modelName.toLowerCase() + "\"/>");
        writer.println("<macrodef name=\"convertEcorePaths\">");
        writer.println("<attribute name=\"filePath\"/>");
        writer.println("<sequential>");

        // writer.println("<mapping source=\"pathmap://" + modelName.toUpperCase() + "_MODEL///\" target=\"model/\">");

        writer.println("<replace file=\"@{filePath}\" token=\"pathmap://" + modelName.toUpperCase() + "_MODEL///"
                + modelName + ".uml\" value=\"" + modelName + "_Ecore.uml\"/>");

        for (String cdaPackage : cdaPackages.keySet()) {

            Package aPackage = cdaPackages.get(cdaPackage);

            if (!"cda".equals(cdaPackage)) {

                FindResourcesByNameVisitor ecoreModel = new FindResourcesByNameVisitor(cdaPackage + "_Ecore.uml");

                iw.getRoot().accept(ecoreModel);

                if (aPackage.eResource() != null && aPackage.eResource().getURI() != null
                        && ecoreModel.getResources().size() == 1) {

                    writer.println(
                            "<replace file=\"@{filePath}\" token=\"" + aPackage.eResource().getURI() + "\" value=\""
                                    + "../.." + ecoreModel.getResources().get(0).getFullPath().toFile() + "\"/> ");
                }

                if (cdaPackages.get(cdaPackage).eResource() != null) {
                    for (Resource controlledResource : org.eclipse.mdht.uml.common.util.UMLUtil
                            .getControlledResources(cdaPackages.get(cdaPackage).eResource())) {

                        if (controlledResource != null && controlledResource.getURI() != null
                                && ecoreModel.getResources().size() == 1) {

                            writer.println("<replace file=\"@{filePath}\" token=\"" + controlledResource.getURI()
                                    + "\" value=\"" + "../.."
                                    + ecoreModel.getResources().get(0).getFullPath().toFile() + "\"/> ");
                        }

                    }
                }

            }
        }

        writer.println("</sequential>");
        writer.println("</macrodef>");

        writer.println("<import file=\"${cdaPluginPath}/transform-common.xml\"/>");
        writer.println("</project>");

        writer.flush();

        swriter.close();

        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));

        createFile(project, "transform.xml", is);

    }

    /*
     * Model plugin is to leverage the URI mapping
     */
    void createModelPlugin(IProject project, String modelName) throws Exception {

        StringWriter swriter = new StringWriter();

        PrintWriter writer = new PrintWriter(swriter);
        writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        writer.println("<?eclipse version=\"3.0\"?>");
        writer.println("<plugin>");
        writer.println("<extension point=\"org.eclipse.emf.ecore.uri_mapping\">");
        writer.println("<mapping source=\"pathmap://" + modelName.toUpperCase() + "_MODEL/\" target=\"model/\">");
        writer.println("</mapping>");
        writer.println("</extension>");
        writer.println("</plugin>");
        writer.flush();
        swriter.close();
        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));
        createFile(project, "plugin.xml", is);
    }

    void createDitaProperties(IProject project, String basePackage, String modelName) throws Exception {

        StringWriter swriter = new StringWriter();

        PrintWriter writer = new PrintWriter(swriter);

        writer.println("basePackage = " + basePackage);
        writer.println("projectName = " + modelName);
        writer.println("modelName = " + modelName);
        writer.flush();

        swriter.close();

        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));

        createFile(project, "dita.properties", is);

    }

    void createPluginProperties(IProject project, String modelName) throws Exception {

        StringWriter swriter = new StringWriter();

        PrintWriter writer = new PrintWriter(swriter);

        writer.println("pluginName = " + modelName + " Model");
        writer.println("providerName = Provider Name Here");

        writer.flush();

        swriter.close();

        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));

        createFile(project, "plugin.properties", is);

    }

    void updateBuildProperties(IProject project) throws Exception {

        StringWriter swriter = new StringWriter();
        PrintWriter writer = new PrintWriter(swriter);
        writer.println("source.. = src/");
        writer.println("output.. = bin/");
        if (project.equals(docProject)) {
            writer.println("bin.includes = META-INF/,\\");
        } else {
            writer.println("bin.includes = plugin.xml,\\");
            writer.println("               META-INF/,\\");
        }
        writer.println("               .,\\");
        writer.println("               plugin.properties");
        writer.flush();
        swriter.close();
        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));
        IPath path = new Path("build.properties");
        IFile file = CDAUIUtil.getBundleRelativeFile(project, path);
        file.setContents(is, true, false, null);

    }

    void createGeneratedProjectManifest(IProject project, String basePackage, String modelName) throws Exception {

        IFile manfiestFile = cdaDocumentsManifest.get(newCDATemplatePage.getCDADocument());
        InputStream input = new FileInputStream(manfiestFile.getRawLocation().toOSString());
        Manifest projectManifest = new Manifest(input);
        Attributes attributes = projectManifest.getMainAttributes();
        IFile manifest = CDAUIUtil.getManifest(project);
        StringWriter swriter = new StringWriter();

        PrintWriter writer = new PrintWriter(swriter);
        writer.println("Bundle-Name: %pluginName");
        writer.println(String.format("Bundle-SymbolicName: %s;singleton:=true", project.getName()));
        writer.println("Bundle-ActivationPolicy: lazy");
        writer.println(String.format("Bundle-Activator: %s.%s.%sPlugin$Implementation", basePackage, modelName,
                modelName.substring(0, 1).toUpperCase() + modelName.substring(1)));
        writer.println("Bundle-ClassPath: .");
        writer.println("Bundle-Vendor: %providerName");
        writer.println("Bundle-Localization: plugin");

        String requiredBundles = attributes.getValue("Require-Bundle");
        String sourceBundle = attributes.getValue("Bundle-SymbolicName");
        String rb[] = requiredBundles.split(",");
        String sb[] = sourceBundle.split(";");

        for (int index = 0; index < rb.length; index++) {
            if (index == 0) {
                writer.print("Require-Bundle: " + rb[index]);
            } else {

                if (index > 0) {
                    writer.println(",");
                    writer.print(" " + rb[index]);
                }
            }

        }
        if (sb.length > 0) {
            writer.println(",");
            writer.println(" " + sb[0] + ";visibility:=reexport");
        }
        writer.println(String.format("Export-Package: %s.%s,", basePackage, modelName));
        writer.println(String.format(" %s.%s.impl,", basePackage, modelName));
        writer.println(String.format(" %s.%s.operations,", basePackage, modelName));
        writer.println(String.format(" %s.%s.util", basePackage, modelName));
        writer.flush();
        swriter.close();
        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));
        manifest.appendContents(is, true, false, null);
    }

    void createDocumentProjectManifest(IProject project, String basePackage, String modelName) throws Exception {
        IFile manifest = CDAUIUtil.getManifest(project);
        StringWriter swriter = new StringWriter();
        PrintWriter writer = new PrintWriter(swriter);
        writer.println("Bundle-Name: Document Bundle " + modelName);
        writer.println(String.format("Bundle-SymbolicName: %s;singleton:=true", project.getName()));
        writer.flush();
        swriter.close();
        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));
        manifest.appendContents(is, true, false, null);
    }

    void createModelProjectManifest(IProject project, String basePackage, String modelName) throws Exception {
        IFile manifest = CDAUIUtil.getManifest(project);
        StringWriter swriter = new StringWriter();
        PrintWriter writer = new PrintWriter(swriter);
        writer.println("Bundle-Name: Model Bundle " + modelName);
        writer.println(String.format("Bundle-SymbolicName: %s;singleton:=true", project.getName()));
        writer.flush();
        swriter.close();
        InputStream is = new ByteArrayInputStream(swriter.toString().getBytes("UTF-8"));
        createFolder(project, "META-INF");
        createFile(project, manifest.getProjectRelativePath().toString(), is);
    }
}