/*
* 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);
}
}