/** * Copyright (C) 2012 - 2014 Eric Van Dewoestine * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.eclim.plugin.jdt.command.include; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclim.plugin.core.preference.Preferences; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ImportDeclaration; import org.eclipse.jdt.ui.SharedASTProvider; import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.TextEdit; /** * Utilities for working with java imports. * * @author Eric Van Dewoestine */ public class ImportUtils { public static boolean importsInSameGroup( int separationLevel, ImportDeclaration i1, ImportDeclaration i2) { // -1 = separate based on full package // 0 = never separate // n = separate on comparing of n segments of the package. if (separationLevel == 0){ return true; } List<String> pn1 = packageName(i1); List<String> pn2 = packageName(i2); for (int i = 0; (i < separationLevel || separationLevel == -1); i++){ int level = i + 1; if (pn1.size() < level){ return pn2.size() < level; } if (pn2.size() < level){ return pn1.size() < level; } if (!pn1.get(i).equals(pn2.get(i))){ return false; } } return true; } public static List<String> packageName(ImportDeclaration imprt) { String name = imprt.getName().getFullyQualifiedName(); List<String> pack = new ArrayList<String>(); for (String part : StringUtils.split(name, '.')){ if (Character.isUpperCase(part.charAt(0))){ break; } pack.add(part); } return pack; } public static boolean isImportExcluded(IProject project, String name) throws Exception { String[] patterns = Preferences.getInstance() .getArrayValue(project, "org.eclim.java.import.exclude"); for (String pattern : patterns){ if (name.matches(pattern)){ return true; } } return false; } public static TextEdit importGroupingEdit( ICompilationUnit src, Preferences preferences) throws Exception { int separationLevel = preferences.getIntValue( src.getJavaProject().getProject(), "org.eclim.java.import.package_separation_level"); CompilationUnit astRoot = SharedASTProvider .getAST(src, SharedASTProvider.WAIT_YES, null); @SuppressWarnings("unchecked") List<ImportDeclaration> imports = astRoot.imports(); String lineDelim = src.findRecommendedLineSeparator(); MultiTextEdit edit = new MultiTextEdit(); ImportDeclaration next = null; for (int i = imports.size() - 1; i >= 0; i--){ ImportDeclaration imprt = imports.get(i); int end = imprt.getStartPosition() + imprt.getLength() + lineDelim.length(); if (next != null && end == next.getStartPosition() && !ImportUtils.importsInSameGroup(separationLevel, imprt, next)) { edit.addChild(new InsertEdit(end, lineDelim)); } next = imprt; } return edit.getChildrenSize() > 0 ? edit : null; } }