/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.properties.extension; import static org.teiid.designer.ui.UiConstants.PLUGIN_ID; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IContainer; 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.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.teiid.designer.core.util.VdbHelper; import org.teiid.designer.core.util.VdbHelper.VdbFolders; import org.teiid.designer.core.workspace.ModelUtil; import org.teiid.designer.ui.explorer.ModelExplorerLabelProvider; import org.teiid.designer.ui.util.ErrorHandler; /** * Chooser Dialog for selecting a VdbFile from the Workspace - either * 1) selects a udf jar from the udf jar folder (lib) * 2) selects a 'user file' from the user files folder (otherFiles) */ public class ChooseVdbFileFromWorkspaceDialog extends ElementTreeSelectionDialog { /** * Constructor * @param shell the Shell * @param title Dialog Title * @param message Dialog Message * @param project the current project, for scoping the selections * @param vdbFolder type of folder being analysed */ ChooseVdbFileFromWorkspaceDialog( final Shell shell, final String title, final String message, final IProject project, final VdbFolders vdbFolder ) { super(shell, new ModelExplorerLabelProvider(), new ChooseFileDialogContentProvider(project, vdbFolder)); setTitle(title); setMessage(message); setAllowMultiple(false); setInput(new IProject[] {project}); setValidator(new ISelectionStatusValidator() { @Override public IStatus validate( final Object[] selection ) { if (selection.length == 1 && selection[0] instanceof IFile) return new Status(IStatus.OK, PLUGIN_ID, null); return new Status(IStatus.ERROR, PLUGIN_ID, null); } }); } } /* * Workspace File Chooser Dialog - Content provider */ final class ChooseFileDialogContentProvider implements ITreeContentProvider { private IProject[] projects; private VdbFolders vdbFolder; /** * @param project the supplied project * @param vdbFolder type of folder */ public ChooseFileDialogContentProvider(IProject project, VdbFolders vdbFolder) { this.projects = new IProject[]{project}; this.vdbFolder = vdbFolder; } @Override public final void dispose() { } @Override public final IResource[] getChildren( final Object element ) { IContainer container = (IContainer)element; final List<IResource> children = new ArrayList<IResource>(); try { for (final IResource resource : container.members()) { if ((resource instanceof IContainer && hasChildren(resource)) || (resource instanceof IFile && validFile((IFile)resource))) children.add(resource); } } catch (final CoreException error) { ErrorHandler.toExceptionDialog(error); } return children.toArray(new IResource[children.size()]); } @Override public Object[] getElements( final Object inputElement ) { return projects; } @Override public boolean hasChildren( final Object element ) { if(element instanceof IFile) return false; IContainer container = (IContainer)element; // only return the appropriate folder contents if(container instanceof IFolder && vdbFolder != null) { if(VdbFolders.UDF.equals(vdbFolder) && !VdbFolders.UDF.getReadFolder().equals(container.getName())) { return false; } } try { for (final IResource resource : container.members()) if (resource instanceof IContainer) { if (hasChildren(resource)) return true; } else if (validFile((IFile)resource)) return true; } catch (final CoreException error) { ErrorHandler.toExceptionDialog(error); } return false; } @Override public final Object getParent( final Object element ) { return ((IResource)element).getParent(); } boolean validFile( final IFile file ) { String ext = file.getFileExtension(); switch(vdbFolder) { case UDF: if (ext == null) return false; ext = ext.toLowerCase(); return VdbHelper.JAR_EXT.equals(ext); case OTHER_FILES: // Deny jar files as they are udf if (VdbHelper.JAR_EXT.equals(ext)) return false; return !ModelUtil.isModelFile(file); } return true; } @Override public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { } }