/******************************************************************************* * Copyright (c) 2010 BestSolution.at 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 * * Contributors: * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation ******************************************************************************/ package at.bestsolution.efxclipse.tooling.ui.wizards; import java.io.ByteArrayInputStream; import java.util.HashSet; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import at.bestsolution.efxclipse.tooling.ui.wizards.template.IGenerator; import at.bestsolution.efxclipse.tooling.ui.wizards.template.JDTElement; public abstract class AbstractNewJDTElementWizard<O extends JDTElement> extends Wizard implements INewWizard { protected IPackageFragmentRoot root; protected IPackageFragment fragment; private IFile file; public void init(IWorkbench workbench, IStructuredSelection selection) { IJavaElement jElement = getInitialJavaElement(selection); root = getFragmentRoot(jElement); fragment = getFragment(jElement); } private IPackageFragment getFragment(IJavaElement jElement) { if( jElement instanceof IPackageFragment ) { return (IPackageFragment) jElement; } return null; } protected IJavaElement getInitialJavaElement(IStructuredSelection selection) { IJavaElement jelem = null; if (selection != null && !selection.isEmpty()) { Object selectedElement = selection.getFirstElement(); if (selectedElement instanceof IAdaptable) { IAdaptable adaptable = (IAdaptable) selectedElement; jelem = (IJavaElement) adaptable.getAdapter(IJavaElement.class); if (jelem == null || !jelem.exists()) { jelem = null; IResource resource = (IResource) adaptable .getAdapter(IResource.class); if (resource != null && resource.getType() != IResource.ROOT) { while (jelem == null && resource.getType() != IResource.PROJECT) { resource = resource.getParent(); jelem = (IJavaElement) resource .getAdapter(IJavaElement.class); } if (jelem == null) { jelem = JavaCore.create(resource); // java project } } } } } return jelem; } protected IPackageFragmentRoot getFragmentRoot(IJavaElement elem) { IPackageFragmentRoot initRoot = null; if (elem != null) { initRoot = (IPackageFragmentRoot) elem .getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); try { if (initRoot == null || initRoot.getKind() != IPackageFragmentRoot.K_SOURCE) { IJavaProject jproject = elem.getJavaProject(); if (jproject != null) { initRoot = null; if (jproject.exists()) { IPackageFragmentRoot[] roots = jproject .getPackageFragmentRoots(); for (int i = 0; i < roots.length; i++) { if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) { initRoot = roots[i]; break; } } } if (initRoot == null) { initRoot = jproject.getPackageFragmentRoot(jproject .getResource()); } } } } catch (JavaModelException e) { // TODO e.printStackTrace(); } } return initRoot; } protected abstract IGenerator<O> getGenerator(); @SuppressWarnings("unchecked") public O getDomainClass() { return ((AbstractJDTElementPage<O>) getPages()[0]).getClazz(); } protected Set<String> getRequiredBundles() { Set<String> rv = new HashSet<String>(); rv.add("javax.inject"); return rv; } @Override public boolean performFinish() { O clazz = getDomainClass(); String content = getGenerator().generateContent(clazz).toString(); if( clazz.getFragmentRoot() == null ) { return false; } IFile file = createFile(); if( file != null ) { try { if (!file.exists()) { file.create(new ByteArrayInputStream(content.getBytes()), true, null); } else { if( MessageDialog.openQuestion(getShell(), "File exists", "The file " + file.getName() + " already exists. Would you like to proceed?") ) { file.setContents(new ByteArrayInputStream(content.getBytes()), IFile.FORCE | IFile.KEEP_HISTORY, null); } else { return false; } } IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), file); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return true; } protected abstract IFile createFile(); public IFile getFile() { return file; } }