org.emftext.language.emfdoc.ui.ExtractDocumentationProcess.java Source code

Java tutorial

Introduction

Here is the source code for org.emftext.language.emfdoc.ui.ExtractDocumentationProcess.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2012
 * Software Technology Group, Dresden University of Technology
 * DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026
 * 
 * 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:
 *   Software Technology Group - TU Dresden, Germany;
 *   DevBoost GmbH - Berlin, Germany
 *      - initial API and implementation
 ******************************************************************************/
package org.emftext.language.emfdoc.ui;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
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.operation.IRunnableWithProgress;
import org.emftext.language.emfdoc.Documentation;
import org.emftext.language.emfdoc.DocumentationElement;
import org.emftext.language.emfdoc.EmfdocFactory;
import org.emftext.language.emfdoc.resource.emfdoc.mopp.EmfdocPlugin;
import org.emftext.language.emfdoc.resource.emfdoc.util.EmfdocEObjectUtil;

public class ExtractDocumentationProcess implements IRunnableWithProgress {

    private final URI ecoreURI;
    private final URI ecoreDocURI;

    public ExtractDocumentationProcess(URI ecoreURI, URI ecoreDocURI) {
        this.ecoreURI = ecoreURI;
        this.ecoreDocURI = ecoreDocURI;
    }

    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        ResourceSet rs = new ResourceSetImpl();
        Resource ecoreResource = rs.getResource(ecoreURI, true);
        Resource ecoreDocResource = null;
        try {
            ecoreDocResource = rs.getResource(ecoreDocURI, true);
        } catch (Exception e) {
            // ecoredoc file does not seem to exist
            ecoreDocResource = rs.createResource(ecoreDocURI);
        }
        EList<EObject> contents = ecoreResource.getContents();
        if (contents.isEmpty()) {
            return;
        }
        EObject root = contents.get(0);

        Documentation existingDoc = null;
        EList<EObject> docContents = ecoreDocResource.getContents();
        if (docContents.isEmpty()) {
            Documentation newDocumentation = EmfdocFactory.eINSTANCE.createDocumentation();
            docContents.add(newDocumentation);
        }
        existingDoc = (Documentation) docContents.get(0);

        if (root instanceof EPackage) {
            EPackage ePackage = (EPackage) root;
            if (existingDoc.getDocumentedPackage() == null) {
                existingDoc.setDocumentedPackage(ePackage);
            }
            Collection<EModelElement> elements = EmfdocEObjectUtil.getObjectsByType(ePackage.eAllContents(),
                    EcorePackage.eINSTANCE.getEModelElement());
            for (EModelElement element : elements) {
                String documentation = EcoreUtil.getDocumentation(element);
                String existingDocumentation = findExistingDocumentation(existingDoc, element);
                if (existingDocumentation != null) {
                    // found some documentation
                } else {
                    if (documentation != null && documentation.trim().length() != 0) {
                        DocumentationElement newDocElement = EmfdocFactory.eINSTANCE.createDocumentationElement();
                        newDocElement.setDocumentedElement(element);
                        newDocElement.setText(documentation);
                        existingDoc.getDocumentationElements().add(newDocElement);
                    }
                }
            }
        }
        try {
            ecoreDocResource.save(null);
        } catch (IOException e) {
            EmfdocPlugin.logError("Exception while saving ecore documentation.", e);
        }
    }

    private String findExistingDocumentation(Documentation existingDoc, EModelElement element) {
        for (DocumentationElement docElement : existingDoc.getDocumentationElements()) {
            if (docElement.getDocumentedElement() == element) {
                return docElement.getText();
            }
        }
        return null;
    }
}