blob: cd849550830f426cff93bc13818c92c1b1b6091c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 IBM Corporation 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
*
* This is an implementation of an early-draft specification developed under the Java
* Community Process (JCP) and is made available for testing and evaluation purposes
* only. The code is not compatible with any specification of the JCP.
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.actions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.swt.widgets.Display;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IModuleDescription;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.corext.util.InfoFilesUtil;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.internal.ui.JavaPlugin;
public class CreateModuleInfoAction implements IObjectActionDelegate {
private static final String MODULE_INFO_JAVA_FILENAME= JavaModelUtil.MODULE_INFO_JAVA;
private ISelection fSelection;
@Override
public void selectionChanged(IAction action, ISelection selection) {
fSelection= selection;
}
@Override
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
// not used
}
@Override
public void run(IAction action) {
IJavaProject javaProject= null;
if (fSelection instanceof IStructuredSelection) {
Object selectedElement= ((IStructuredSelection) fSelection).getFirstElement();
if (selectedElement instanceof IProject) {
javaProject= JavaCore.create((IProject) selectedElement);
} else if (selectedElement instanceof IJavaProject) {
javaProject= (IJavaProject) selectedElement;
} else {
return;
}
try {
if (!JavaModelUtil.is9OrHigher(javaProject)) {
MessageDialog.openError(getDisplay().getActiveShell(), ActionMessages.CreateModuleInfoAction_error_title, ActionMessages.CreateModuleInfoAction_error_message_compliance);
return;
}
IPackageFragmentRoot[] packageFragmentRoots= javaProject.getPackageFragmentRoots();
List<IPackageFragmentRoot> packageFragmentRootsAsList= new ArrayList<>(Arrays.asList(packageFragmentRoots));
for (IPackageFragmentRoot packageFragmentRoot : packageFragmentRoots) {
IResource res= packageFragmentRoot.getCorrespondingResource();
if (res == null || res.getType() != IResource.FOLDER || packageFragmentRoot.getKind() != IPackageFragmentRoot.K_SOURCE) {
packageFragmentRootsAsList.remove(packageFragmentRoot);
}
}
packageFragmentRoots= packageFragmentRootsAsList.toArray(new IPackageFragmentRoot[packageFragmentRootsAsList.size()]);
if (packageFragmentRoots.length == 0) {
MessageDialog.openError(getDisplay().getActiveShell(), ActionMessages.CreateModuleInfoAction_error_title, ActionMessages.CreateModuleInfoAction_error_message_no_source_folder);
return;
}
IPackageFragmentRoot targetPkgFragmentRoot= null;
for (IPackageFragmentRoot packageFragmentRoot : packageFragmentRoots) {
if (packageFragmentRoot.getPackageFragment("").getCompilationUnit(MODULE_INFO_JAVA_FILENAME).exists()) { //$NON-NLS-1$
String message= Messages.format(ActionMessages.CreateModuleInfoAction_question_message_overwrite_module_info, packageFragmentRoot.getElementName());
boolean overwrite= MessageDialog.openQuestion(getDisplay().getActiveShell(), ActionMessages.CreateModuleInfoAction_error_title, message);
if (!overwrite) {
return;
}
targetPkgFragmentRoot= packageFragmentRoot;
break;
}
}
if (targetPkgFragmentRoot == null) {
targetPkgFragmentRoot= packageFragmentRoots[0];
}
createAndOpenFile(targetPkgFragmentRoot, packageFragmentRoots);
} catch (CoreException e) {
JavaPlugin.log(e);
}
}
}
private void createAndOpenFile(IPackageFragmentRoot targetPkgFragmentRoot, IPackageFragmentRoot[] packageFragmentRoots) throws CoreException {
createModuleInfoJava(targetPkgFragmentRoot, packageFragmentRoots);
IFile file= ((IFolder) targetPkgFragmentRoot.getCorrespondingResource()).getFile(MODULE_INFO_JAVA_FILENAME);
if (file.exists()) {
BasicNewResourceWizard.selectAndReveal(file, JavaPlugin.getActiveWorkbenchWindow());
openFile(file);
}
}
private void createModuleInfoJava(IPackageFragmentRoot targetPkgFragmentRoot, IPackageFragmentRoot[] packageFragmentRoots) throws CoreException {
String fileContent= getModuleInfoFileContent(packageFragmentRoots);
IPackageFragment defaultPkg= targetPkgFragmentRoot.getPackageFragment(""); //$NON-NLS-1$
InfoFilesUtil.createInfoJavaFile(MODULE_INFO_JAVA_FILENAME, fileContent.toString(), defaultPkg, new NullProgressMonitor());
}
private String getModuleInfoFileContent(IPackageFragmentRoot[] packageFragmentRoots) throws CoreException {
List<String> exportedPackages= new ArrayList<>();
for (IPackageFragmentRoot packageFragmentRoot : packageFragmentRoots) {
for (IJavaElement child : packageFragmentRoot.getChildren()) {
if (child instanceof IPackageFragment) {
IPackageFragment pkgFragment= (IPackageFragment) child;
if (!pkgFragment.isDefaultPackage() && pkgFragment.getCompilationUnits().length != 0) {
exportedPackages.add(pkgFragment.getElementName());
}
}
}
}
IJavaProject javaProject= packageFragmentRoots[0].getJavaProject();
String[] requiredModules= JavaCore.getReferencedModules(javaProject);
IModuleDescription moduleDescription= javaProject.getModuleDescription();
String moduleName= moduleDescription != null ? moduleDescription.getElementName() : javaProject.getElementName();
StringBuilder fileContent= new StringBuilder();
fileContent.append("module "); //$NON-NLS-1$
fileContent.append(moduleName);
fileContent.append(" {"); //$NON-NLS-1$
for (String exportedPkg : exportedPackages) {
fileContent.append("exports "); //$NON-NLS-1$
fileContent.append(exportedPkg);
fileContent.append(";"); //$NON-NLS-1$
}
for (String requiredModule : requiredModules) {
fileContent.append("requires "); //$NON-NLS-1$
fileContent.append(requiredModule);
fileContent.append(';');
}
fileContent.append('}');
return fileContent.toString();
}
private void openFile(final IFile file) {
final IWorkbenchPage activePage= JavaPlugin.getActivePage();
if (activePage != null) {
final Display display= getDisplay();
if (display != null) {
display.asyncExec(new Runnable() {
@Override
public void run() {
try {
IDE.openEditor(activePage, file, true);
} catch (PartInitException e) {
JavaPlugin.log(e);
}
}
});
}
}
}
private Display getDisplay() {
Display display= Display.getCurrent();
if (display == null)
display= Display.getDefault();
return display;
}
}