diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.ui/src/org')
7 files changed, 301 insertions, 68 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/jface/JarFileViewerFilter.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/jface/ArchiveFileViewerFilter.java index e6b2bc014d..3f66b67618 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/jface/JarFileViewerFilter.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/jface/ArchiveFileViewerFilter.java @@ -14,27 +14,31 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.jpt.ui.JptUiPlugin; /** * This filter will deny showing any file that are not JAR files or folders * that don't contain any JAR files in its sub-hierarchy. */ -public class JarFileViewerFilter +public class ArchiveFileViewerFilter extends ViewerFilter { - public JarFileViewerFilter() { + private static final String[] archiveExtensions= { "jar", "zip" }; //$NON-NLS-1$ + + + public ArchiveFileViewerFilter() { super(); } - @Override public boolean select( Viewer viewer, Object parentElement, Object element) { if (element instanceof IFile) { - return isJarFile((IFile) element); + return isArchivePath(((IFile)element).getFullPath()); } else if (element instanceof IFolder) { IFolder folder = (IFolder) element; @@ -47,15 +51,21 @@ public class JarFileViewerFilter } catch (CoreException ce) { // just skip this one, then + JptUiPlugin.log(ce); } } return false; } - /* there doesn't seem to be a very good way of determining if a file is an - * actual jar file, so for now, if it's a file => true. - */ - protected boolean isJarFile(IFile file) { - return true; - } + public static boolean isArchivePath(IPath path) { + String ext= path.getFileExtension(); + if (ext != null && ext.length() != 0) { + for (int i= 0; i < archiveExtensions.length; i++) { + if (ext.equalsIgnoreCase(archiveExtensions[i])) { + return true; + } + } + } + return false; + } } diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/JptUiPersistenceMessages.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/JptUiPersistenceMessages.java index f0a120274a..8675b04527 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/JptUiPersistenceMessages.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/JptUiPersistenceMessages.java @@ -21,6 +21,9 @@ public class JptUiPersistenceMessages { public static String Boolean_False; public static String Boolean_True; + + public static String ArchiveFileSelectionDialog_jarPathHelpLabel; + public static String ArchiveFileSelectionDialog_jarPathLabel; public static String PersistenceEditor_page_help; public static String PersistenceEditor_sourceTab; diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/ArchiveFileSelectionDialog.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/ArchiveFileSelectionDialog.java new file mode 100644 index 0000000000..6be91cd9c9 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/ArchiveFileSelectionDialog.java @@ -0,0 +1,226 @@ +/******************************************************************************* + * Copyright (c) 2009 Oracle. + * 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: + * Oracle - initial API and implementation + *******************************************************************************/ +package org.eclipse.jpt.ui.internal.persistence.details; + +import java.util.Collections; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.draw2d.graph.Path; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jpt.core.JptCorePlugin; +import org.eclipse.jpt.ui.JptUiPlugin; +import org.eclipse.jpt.ui.internal.jface.ArchiveFileViewerFilter; +import org.eclipse.jpt.ui.internal.persistence.JptUiPersistenceMessages; +import org.eclipse.jpt.ui.internal.swt.TextFieldModelAdapter; +import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; +import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; +import org.eclipse.ui.dialogs.ISelectionStatusValidator; +import org.eclipse.ui.model.WorkbenchContentProvider; +import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.ui.views.navigator.ResourceComparator; +import org.eclipse.wst.common.componentcore.ComponentCore; +import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualContainer; +import org.eclipse.wst.common.componentcore.resources.IVirtualFile; +import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; +import org.eclipse.wst.common.componentcore.resources.IVirtualResource; + +public class ArchiveFileSelectionDialog + extends ElementTreeSelectionDialog +{ + private final WritablePropertyValueModel<String> jarPathModel; + + private DeploymentPathCalculator pathCalculator; + + + public ArchiveFileSelectionDialog(Shell parent) { + this(parent, new SimpleDeploymentPathCalculator()); + } + + public ArchiveFileSelectionDialog(Shell parent, DeploymentPathCalculator pathCalculator) { + super(parent, new WorkbenchLabelProvider(), new WorkbenchContentProvider()); + this.pathCalculator = pathCalculator; + setComparator(new ResourceComparator(ResourceComparator.NAME)); + addFilter(new ArchiveFileViewerFilter()); + setValidator(new ArchiveFileSelectionValidator()); + this.jarPathModel = new SimplePropertyValueModel<String>(); + } + + + @Override + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite) super.createDialogArea(parent); + + Label helpLabel = new Label(composite, SWT.WRAP); + helpLabel.setText(JptUiPersistenceMessages.ArchiveFileSelectionDialog_jarPathHelpLabel); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.widthHint = 400; + helpLabel.setLayoutData(gd); + + Composite subComposite = new Composite(composite, SWT.NONE); + subComposite.setLayout(new GridLayout(2, false)); + subComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Label jarPathLabel = new Label(subComposite, SWT.NONE); + jarPathLabel.setFont(composite.getFont()); + jarPathLabel.setText(JptUiPersistenceMessages.ArchiveFileSelectionDialog_jarPathLabel); + + Text jarPathText = new Text(subComposite, SWT.BORDER); + jarPathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + TextFieldModelAdapter.adapt(jarPathModel, jarPathText); + + return composite; + } + + @Override + protected TreeViewer doCreateTreeViewer(Composite parent, int style) { + TreeViewer treeViewer = super.doCreateTreeViewer(parent, style); + + treeViewer.addSelectionChangedListener( + new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + updateJarPathModel(event.getSelection()); + } + }); + + return treeViewer; + } + + protected void updateJarPathModel(ISelection selection) { + Object selectedObj = ((IStructuredSelection) selection).getFirstElement(); + if (selectedObj instanceof IFile) { + this.jarPathModel.setValue(calculateDeployPath((IFile) selectedObj)); + } + else { + this.jarPathModel.setValue(""); + } + } + + protected String calculateDeployPath(IFile archiveFile) { + return this.pathCalculator.calculateDeploymentPath(archiveFile); + } + + @Override + protected void computeResult() { + setResult(Collections.singletonList(this.jarPathModel.getValue())); + } + + + private static class ArchiveFileSelectionValidator + implements ISelectionStatusValidator + { + public ArchiveFileSelectionValidator() { + super(); + } + + + public IStatus validate(Object[] selection) { + int nSelected= selection.length; + if (nSelected == 0 || (nSelected > 1)) { + return new Status(IStatus.ERROR, JptUiPlugin.PLUGIN_ID, ""); //$NON-NLS-1$ + } + for (int i= 0; i < selection.length; i++) { + Object curr= selection[i]; + if (curr instanceof IFile) { + return new Status(IStatus.OK, JptUiPlugin.PLUGIN_ID, ""); //$NON-NLS-1$ + } + } + return new Status(IStatus.ERROR, JptUiPlugin.PLUGIN_ID, ""); //$NON-NLS-1$ + } + } + + + public static interface DeploymentPathCalculator + { + String calculateDeploymentPath(IFile file); + } + + + public static class SimpleDeploymentPathCalculator + implements DeploymentPathCalculator + { + public String calculateDeploymentPath(IFile file) { + return file.getName(); + } + } + + + public static class ModuleDeploymentPathCalculator + extends SimpleDeploymentPathCalculator + { + @Override + public String calculateDeploymentPath(IFile file) { + // first look for virtual component that matches this file, returning + // the path to that virtual component + IVirtualComponent vComponent = ComponentCore.createComponent(file.getProject()); + if (vComponent != null) { + IVirtualFolder vFolder = vComponent.getRootFolder(); + IVirtualFile vFile = findVirtualFile(vFolder, file); + if (vFile != null) { + return calculatePersistenceRootRelativePath(vFile); + } + } + + // then default to simple behavior + return super.calculateDeploymentPath(file); + } + + protected IVirtualFile findVirtualFile(IVirtualContainer vContainer, IFile realFile) { + try { + for (IVirtualResource vResource : vContainer.members()) { + if (vResource.getType() == IVirtualResource.FILE) { + IVirtualFile vFile = (IVirtualFile) vResource; + if (realFile.equals(vFile.getUnderlyingFile())) { + return vFile; + } + } + else { + IVirtualFile vFile = findVirtualFile((IVirtualContainer) vResource, realFile); + if (vFile != null) { + return vFile; + } + } + } + } + catch (CoreException ce) { + JptUiPlugin.log(ce); + } + + return null; + } + + protected String calculatePersistenceRootRelativePath(IVirtualFile vFile) { + IProject project = vFile.getProject(); + IPath puRootPath = JptCorePlugin.getJarDeploymentRootPath(project); + + IPath path = vFile.getRuntimePath().makeRelativeTo(puRootPath); + + return path.toString(); + } + } +} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java index 5f18aa2439..661fcb016f 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/GenericPersistenceUnitGeneralComposite.java @@ -100,5 +100,17 @@ public class GenericPersistenceUnitGeneralComposite extends PersistenceUnitGener new GenericPersistenceUnitMappingFilesComposite(this, container); } + + protected void initializeJarFilesPane(Composite container) { + container = addCollapsableSection( + container, + JptUiPersistenceMessages.PersistenceUnitGeneralComposite_jarFiles + ); + + updateGridData(container); + updateGridData(container.getParent()); + + new GenericPersistenceUnitJarFilesComposite(this, container); + } } diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/GenericPersistenceUnitJarFilesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/GenericPersistenceUnitJarFilesComposite.java new file mode 100644 index 0000000000..f695596c98 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/GenericPersistenceUnitJarFilesComposite.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2009 Oracle. + * 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: + * Oracle - initial API and implementation + *******************************************************************************/ +package org.eclipse.jpt.ui.internal.persistence.details; + +import org.eclipse.jpt.core.context.persistence.PersistenceUnit; +import org.eclipse.jpt.ui.internal.widgets.Pane; +import org.eclipse.swt.widgets.Composite; + +public class GenericPersistenceUnitJarFilesComposite + extends PersistenceUnitJarFilesComposite +{ + public GenericPersistenceUnitJarFilesComposite( + Pane<? extends PersistenceUnit> parentPane, + Composite parent) { + + super(parentPane, parent); + } +} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java index 0c63df1137..1bd355472f 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitGeneralComposite.java @@ -232,19 +232,6 @@ public abstract class PersistenceUnitGeneralComposite extends FormPane<Persisten new PersistenceUnitClassesComposite(this, container); } - protected void initializeJarFilesPane(Composite container) { - - container = addCollapsableSection( - container, - JptUiPersistenceMessages.PersistenceUnitGeneralComposite_jarFiles - ); - - updateGridData(container); - updateGridData(container.getParent()); - - new PersistenceUnitJarFilesComposite(this, container); - } - protected void updateGridData(Composite container) { GridData gridData = new GridData(); diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java index 0f979b4bf4..05c0c9ae15 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/persistence/details/PersistenceUnitJarFilesComposite.java @@ -10,12 +10,7 @@ package org.eclipse.jpt.ui.internal.persistence.details; import java.util.ListIterator; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; @@ -24,7 +19,6 @@ import org.eclipse.jpt.core.context.persistence.PersistenceUnit; import org.eclipse.jpt.ui.JptUiPlugin; import org.eclipse.jpt.ui.internal.JpaHelpContextIds; import org.eclipse.jpt.ui.internal.JptUiIcons; -import org.eclipse.jpt.ui.internal.jface.JarFileViewerFilter; import org.eclipse.jpt.ui.internal.persistence.JptUiPersistenceMessages; import org.eclipse.jpt.ui.internal.util.SWTUtil; import org.eclipse.jpt.ui.internal.widgets.AddRemoveListPane; @@ -43,10 +37,6 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; -import org.eclipse.ui.dialogs.ISelectionStatusValidator; -import org.eclipse.ui.model.WorkbenchContentProvider; -import org.eclipse.ui.model.WorkbenchLabelProvider; -import org.eclipse.ui.views.navigator.ResourceComparator; /** * Here the layout of this pane: @@ -69,7 +59,8 @@ import org.eclipse.ui.views.navigator.ResourceComparator; * @version 2.0 * @since 2.0 */ -public class PersistenceUnitJarFilesComposite extends Pane<PersistenceUnit> +public abstract class PersistenceUnitJarFilesComposite + extends Pane<PersistenceUnit> { /** * Creates a new <code>PersistenceUnitJPAMappingDescriptorsComposite</code>. @@ -77,8 +68,9 @@ public class PersistenceUnitJarFilesComposite extends Pane<PersistenceUnit> * @param parentPane The parent pane of this one * @param parent The parent container */ - public PersistenceUnitJarFilesComposite(Pane<? extends PersistenceUnit> parentPane, - Composite parent) { + public PersistenceUnitJarFilesComposite( + Pane<? extends PersistenceUnit> parentPane, + Composite parent) { super(parentPane, parent, false); } @@ -188,42 +180,22 @@ public class PersistenceUnitJarFilesComposite extends Pane<PersistenceUnit> private void addJarFileRef(ObjectListSelectionModel listSelectionModel) { IProject project = getSubject().getJpaProject().getProject(); - ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog( - getShell(), - new WorkbenchLabelProvider(), - new WorkbenchContentProvider() - ); - + ElementTreeSelectionDialog dialog = new ArchiveFileSelectionDialog( + getShell(), buildJarFileDeploymentPathCalculator()); + dialog.setHelpAvailable(false); - dialog.setValidator(buildValidator()); dialog.setTitle(JptUiPersistenceMessages.PersistenceUnitMappingFilesComposite_jarFileDialog_title); dialog.setMessage(JptUiPersistenceMessages.PersistenceUnitMappingFilesComposite_jarFileDialog_message); - dialog.addFilter(new JarFileViewerFilter()); dialog.setInput(project); - dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); - + SWTUtil.show( dialog, buildSelectionDialogPostExecution(listSelectionModel) ); } - private ISelectionStatusValidator buildValidator() { - return new ISelectionStatusValidator() { - public IStatus validate(Object[] selection) { - if (selection.length == 0) { - return new Status(IStatus.ERROR, JptUiPlugin.PLUGIN_ID, ""); - } - - for (Object item : selection) { - if (item instanceof IFolder) { - return new Status(IStatus.ERROR, JptUiPlugin.PLUGIN_ID, ""); - } - } - - return new Status(IStatus.OK, JptUiPlugin.PLUGIN_ID, ""); - } - }; + protected ArchiveFileSelectionDialog.DeploymentPathCalculator buildJarFileDeploymentPathCalculator() { + return new ArchiveFileSelectionDialog.ModuleDeploymentPathCalculator(); } private PostExecution<ElementTreeSelectionDialog> buildSelectionDialogPostExecution( @@ -235,15 +207,12 @@ public class PersistenceUnitJarFilesComposite extends Pane<PersistenceUnit> } for (Object result : dialog.getResult()) { - IFile file = (IFile) result; - // TODO - move to deploy path location - IPath filePath = file.getProjectRelativePath(); - String fileName = filePath.toPortableString(); - if (jarFileRefExists(fileName)) { + String filePath = (String) result; + if (jarFileRefExists(filePath)) { continue; } JarFileRef jarFileRef = getSubject().addJarFileRef(); - jarFileRef.setFileName(fileName); + jarFileRef.setFileName(filePath); listSelectionModel.addSelectedValue(jarFileRef); } |