org.eclipse.gmf.internal.common.codegen.ImportUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gmf.internal.common.codegen.ImportUtil.java

Source

/*
 * Copyright (c) 2005, 2007 Borland Software Corporation
 * 
 * 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:
 *    Artem Tikhomirov (Borland) - initial API and implementation
 */
package org.eclipse.gmf.internal.common.codegen;

import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.util.CodeGenUtil;
import org.eclipse.emf.codegen.util.ImportManager;
import org.eclipse.gmf.common.codegen.ImportAssistant;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;

/**
 * Copy of GenModelImpl functionality
 */
public class ImportUtil implements ImportAssistant {
    private final ImportManager myImportManager;
    private final String myPackageName;
    private final String myUnitName;

    private StringBuffer importStringBuffer;

    private int importInsertionPoint;

    public ImportUtil(String compilationUnitPackage, String compilationUnitName, IPackageFragmentRoot sourceRoot) {
        this(compilationUnitPackage, compilationUnitName);
        if (sourceRoot != null) {
            ICompilationUnit existingCU = sourceRoot.getPackageFragment(compilationUnitPackage)
                    .getCompilationUnit(compilationUnitName + ".java"); //$NON-NLS-1$
            if (existingCU.exists()) {
                try {
                    myImportManager.addCompilationUnitImports(existingCU.getSource());
                } catch (JavaModelException e) {
                    //Ignore. The compilation unit imports will not be added, but we may proceed.
                }
            }
        }
    }

    public ImportUtil(String compilationUnitPackage, String compilationUnitName) {
        assert compilationUnitName != null && compilationUnitName.trim().length() > 0;
        myImportManager = new ImportManager(compilationUnitPackage);
        // although addMasterImport implementation doesn't handle no package case correctly
        // it makes no difference to us as we just need to mark CU name as occupied
        myImportManager.addMasterImport(compilationUnitPackage == null ? "" : compilationUnitPackage,
                compilationUnitName);
        myPackageName = compilationUnitPackage;
        myUnitName = compilationUnitName;
    }

    public void emitPackageStatement(StringBuffer stringBuffer) {
        if (myPackageName == null || myPackageName.trim().length() == 0) {
            return;
        }
        stringBuffer.append("\npackage ");
        stringBuffer.append(myPackageName);
        stringBuffer.append(';');
    }

    public String getCompilationUnitName() {
        return myUnitName;
    }

    public void markImportLocation(StringBuffer stringBuffer, GenPackage genPackage) {
        markImportLocation(stringBuffer);
        myImportManager.addJavaLangImports(genPackage.getJavaLangConflicts());
    }

    public void markImportLocation(StringBuffer stringBuffer) {
        importStringBuffer = stringBuffer;
        importInsertionPoint = stringBuffer.length();
        myImportManager.addCompilationUnitImports(stringBuffer.toString());
    }

    public void emitSortedImports() {
        String NL = System.getProperties().getProperty("line.separator");
        StringBuffer importsBuf = new StringBuffer();

        String previousPackageName = null;
        for (String importName : myImportManager.getImports()) {
            int index = importName.lastIndexOf(".");
            if (index != -1) {
                String packageName = importName.substring(0, index);
                if (previousPackageName != null && !previousPackageName.equals(packageName)) {
                    importsBuf.append(NL);
                }
                previousPackageName = packageName;
            }
            importsBuf.append(NL + "import " + importName + ";");
        }

        importStringBuffer.insert(importInsertionPoint, importsBuf.toString());
    }

    // one from GenModelImpl
    public String getImportedName(String qualifiedName) {
        if (qualifiedName.equals(CodeGenUtil.getSimpleClassName(qualifiedName))) {
            // initially a HACK for inner ScalablePolygon, though makes sense regardless of that -
            // there's no sense to import classes from default package
            return qualifiedName;
        }

        int index = qualifiedName.indexOf("<");
        if (index >= 0) {
            String baseName = qualifiedName.substring(0, index);
            StringBuilder result = new StringBuilder(getImportedName(baseName));
            result.append("<");
            for (int start = ++index, end = qualifiedName.lastIndexOf(">") + 1; index < end; ++index) {
                char character = qualifiedName.charAt(index);
                switch (character) {
                case ' ':
                case ',':
                case '<':
                case '>':
                case '&': {
                    if (start != index) {
                        String segment = qualifiedName.substring(start, index);
                        result.append(getImportedName(segment));
                    }
                    result.append(character);
                    start = index + 1;
                    break;
                }
                default: {
                    break;
                }
                }
            }
            return result.toString();
        }

        index = qualifiedName.indexOf("$");
        myImportManager.addImport(index == -1 ? qualifiedName : qualifiedName.substring(0, index));
        return myImportManager.getImportedName(qualifiedName);
    }

    public void addImport(String qualifiedName) {
        myImportManager.addImport(qualifiedName);
    }

    public void registerInnerClass(String innerClassName) {
        myImportManager.addPseudoImport(innerClassName);
    }

    public void addImport(String packageName, String shortName) {
        myImportManager.addImport(packageName, shortName);
    }
}