/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.hibernate.eclipse.console.actions;
import java.io.FileNotFoundException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.SelectionListenerAction;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.console.utils.ProjectUtils;
import org.jboss.tools.hibernate.runtime.spi.IPersistentClass;
import org.jboss.tools.hibernate.runtime.spi.IProperty;
import org.jboss.tools.hibernate.runtime.spi.IValue;
/**
* @author Dmitry Geraskov
*/
@SuppressWarnings("restriction")
public class OpenSourceAction extends SelectionListenerAction {
public static final String OPENSOURCE_ACTIONID = "actionid.opensource"; //$NON-NLS-1$
private String imageFilePath = "icons/images/java.gif"; //$NON-NLS-1$
public OpenSourceAction() {
super(HibernateConsoleMessages.OpenSourceAction_open_source_file);
setToolTipText(HibernateConsoleMessages.OpenSourceAction_open_source_file);
setEnabled( true );
setImageDescriptor(HibernateConsolePlugin.getImageDescriptor(imageFilePath));
setId(OPENSOURCE_ACTIONID);
}
public void run() {
IStructuredSelection sel = getStructuredSelection();
if (!(sel instanceof TreeSelection)) {
return;
}
TreePath[] paths = ((TreeSelection)sel).getPaths();
for (int i = 0; i < paths.length; i++) {
TreePath path = paths[i];
Object lastSegment = path.getLastSegment();
IPersistentClass persClass = getPersistentClass(lastSegment);
ConsoleConfiguration consoleConfig = (ConsoleConfiguration)(path.getSegment(0));
String fullyQualifiedName = null;
if (lastSegment instanceof IProperty){
Object prevSegment = path.getParentPath().getLastSegment();
if (prevSegment instanceof IProperty
&& ((IProperty)prevSegment).isComposite()){
fullyQualifiedName =((IValue)((IProperty) prevSegment).getValue()).getComponentClassName();
}
}
if (fullyQualifiedName == null && persClass != null){
fullyQualifiedName = persClass.getClassName();
}
try {
run(consoleConfig, lastSegment, fullyQualifiedName);
} catch (JavaModelException e) {
HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.OpenSourceAction_cannot_find_source_file, e);
} catch (PartInitException e) {
HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.OpenSourceAction_cannot_open_source_file, e);
} catch (FileNotFoundException e) {
HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.OpenSourceAction_cannot_find_source_file, e);
}
}
}
/**
* @param consoleConfig
* @param selection
* @param fullyQualifiedName
* @throws JavaModelException
* @throws PartInitException
* @throws FileNotFoundException
*/
public static IEditorPart run(ConsoleConfiguration consoleConfig, Object selection,
String fullyQualifiedName) throws JavaModelException, PartInitException, FileNotFoundException {
if (fullyQualifiedName == null) {
return null;
}
IJavaProject[] projs = ProjectUtils.findJavaProjects(consoleConfig);
String remainder = null;
IType type = null;
IJavaProject proj = null;
if (fullyQualifiedName.indexOf("$") > 0) { //$NON-NLS-1$
remainder = fullyQualifiedName.substring(fullyQualifiedName.indexOf("$") + 1); //$NON-NLS-1$
fullyQualifiedName = fullyQualifiedName.substring(0, fullyQualifiedName.indexOf("$")); //$NON-NLS-1$
for (int i = 0; i < projs.length && type == null; i++) {
proj = projs[i];
type = ProjectUtils.findType(proj, fullyQualifiedName);
}
while ( remainder.indexOf("$") > 0 ){ //$NON-NLS-1$
String subtype = remainder.substring(0, fullyQualifiedName.indexOf("$")); //$NON-NLS-1$
type = type.getType(subtype);
remainder = remainder.substring(fullyQualifiedName.indexOf("$") + 1); //$NON-NLS-1$
}
type = type.getType(remainder);
} else {
for (int i = 0; i < projs.length && type == null; i++) {
proj = projs[i];
type = ProjectUtils.findType(proj, fullyQualifiedName);
}
}
IJavaElement jElement = null;
if (selection instanceof IProperty){
final String selectionName =((IProperty)selection).getName();
final IType typeSave = type;
while (true) {
jElement = type.getField(selectionName);
if (jElement != null && jElement.exists()) {
break;
}
String parentClassName = ProjectUtils.getParentTypename(proj, type.getFullyQualifiedName());
if (parentClassName == null) {
break;
}
type = ProjectUtils.findType(proj, parentClassName);
for (int i = 0; i < projs.length && type == null; i++) {
proj = projs[i];
type = ProjectUtils.findType(proj, fullyQualifiedName);
}
if (type == null) {
break;
}
};
// do not find element - restore type
if (jElement == null || !jElement.exists()) {
type = typeSave;
}
}
if (jElement == null) {
jElement = type;
}
IEditorPart editorPart = JavaUI.openInEditor(type);
if (editorPart instanceof JavaEditor) {
JavaEditor jEditor = (JavaEditor)editorPart;
selectionToEditor(jElement, jEditor);
}
if (editorPart == null) {
String out = NLS.bind(HibernateConsoleMessages.OpenSourceAction_source_file_for_class_not_found, fullyQualifiedName);
throw new FileNotFoundException(out);
}
return editorPart;
}
private IPersistentClass getPersistentClass(Object selection){
if (selection instanceof IProperty){
return ((IProperty)selection).getPersistentClass();
} else if (selection instanceof IPersistentClass){
return (IPersistentClass)selection;
} else {
return null;
}
}
private static void selectionToEditor(IJavaElement jElement, JavaEditor jEditor) {
if (jEditor != null) {
jEditor.setSelection(jElement);
}
}
/*
* @see org.eclipse.jface.action.Action#getImageDescriptor()
*/
@Override
public ImageDescriptor getImageDescriptor() {
// TODO Auto-generated method stub
return super.getImageDescriptor();
}
}