org.eclipse.jst.j2ee.internal.ui.AddJavaBuildPathEntriesWizardFragment.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.j2ee.internal.ui.AddJavaBuildPathEntriesWizardFragment.java

Source

/******************************************************************************
 * Copyright (c) 2010 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:
 *    Konstantin Komissarchik - initial implementation and ongoing maintenance
 ******************************************************************************/

package org.eclipse.jst.j2ee.internal.ui;

import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.checkForComponentDependencyAttribute;
import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.getDefaultRuntimePath;
import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.isClassFolderEntry;
import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.modifyDependencyPath;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants.DependencyAttributeType;
import org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyExtensions;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
import org.eclipse.jst.j2ee.internal.ui.J2EEModuleDependenciesPropertyPage.ClasspathEntryProxy;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;

@SuppressWarnings("restriction")

public final class AddJavaBuildPathEntriesWizardFragment

        extends WizardFragment

{
    public static final String PROP_SELECTION = "selection"; //$NON-NLS-1$

    private IWizardHandle wizard;
    private TreeViewer viewer;
    private IJavaProject jproj;

    public AddJavaBuildPathEntriesWizardFragment() {
        setComplete(false);
    }

    @Override
    public boolean hasComposite() {
        return true;
    }

    @Override
    public Composite createComposite(final Composite parent, final IWizardHandle handle) {
        this.wizard = handle;

        handle.setTitle(Resources.title);
        handle.setDescription(Resources.description);
        handle.setImageDescriptor(JavaPluginImages.DESC_WIZBAN_ADD_LIBRARY);

        final Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout());

        this.viewer = new TreeViewer(composite, SWT.MULTI | SWT.BORDER);

        final GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 390;
        gd.heightHint = 185;

        this.viewer.getTree().setLayoutData(gd);

        this.viewer.setContentProvider(new BuildPathEntriesContentProvider());
        this.viewer.setLabelProvider(new BuildPathEntriesLabelProvider());

        this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(final SelectionChangedEvent event) {
                handleSelectionChanged();
            }
        });

        this.viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(final DoubleClickEvent event) {
                handleDoubleClick();
            }
        });

        final IProject proj = (IProject) getTaskModel().getObject(IReferenceWizardConstants.PROJECT);
        this.jproj = JavaCore.create(proj);

        this.viewer.setInput(new Object());

        return composite;
    }

    private void handleSelectionChanged() {
        final List<IClasspathEntry> list = new ArrayList<IClasspathEntry>();
        final IStructuredSelection selection = (IStructuredSelection) this.viewer.getSelection();
        final IVirtualComponent virtualComponent = ComponentCore.createComponent(this.jproj.getProject());
        final boolean isWebApp = JavaEEProjectUtilities.isDynamicWebProject(this.jproj.getProject());

        for (Iterator<?> itr = selection.iterator(); itr.hasNext();) {
            final Object obj = itr.next();

            if (obj instanceof IClasspathEntry) {
                final IClasspathEntry cpeOriginal = (IClasspathEntry) obj;

                IPath runtimePath = null;
                if (virtualComponent == null) {
                    runtimePath = getDefaultRuntimePath(isWebApp, isClassFolderEntry(cpeOriginal));
                } else {
                    runtimePath = getDefaultRuntimePath(virtualComponent, cpeOriginal);
                }
                final IClasspathEntry cpeTagged = modifyDependencyPath(cpeOriginal, runtimePath);

                list.add(cpeTagged);
            } else {
                list.clear();
                break;
            }
        }

        getTaskModel().putObject(PROP_SELECTION, list);

        setComplete(!list.isEmpty());
        this.wizard.update();
    }

    private void handleDoubleClick() {
        advanceToNextPageOrFinish();
    }

    private IJavaProject getJavaProject() {
        return this.jproj;
    }

    public static String getClasspathEntryText(final IJavaProject jproj, final IClasspathEntry cpe) {
        final int type = cpe.getEntryKind();

        if (type == IClasspathEntry.CPE_CONTAINER) {
            try {
                final IClasspathContainer container = JavaCore.getClasspathContainer(cpe.getPath(), jproj);
                return container.getDescription();
            } catch (Exception e) {
                J2EEUIPlugin.logError(e);
            }
        } else if (type == IClasspathEntry.CPE_LIBRARY) {
            final IPath path = cpe.getPath();

            final StringBuilder buf = new StringBuilder();
            buf.append(path.lastSegment());
            buf.append(" - "); //$NON-NLS-1$
            buf.append(path.removeLastSegments(1).toOSString());

            return buf.toString();
        }

        return cpe.getPath().toPortableString();
    }

    public static Image getClasspathEntryImage(final IJavaProject jproj, final IClasspathEntry cpe) {
        final int type = cpe.getEntryKind();
        final String imgId;

        if (type == IClasspathEntry.CPE_CONTAINER) {
            imgId = ISharedImages.IMG_OBJS_LIBRARY;
        } else if (type == IClasspathEntry.CPE_LIBRARY) {
            imgId = ISharedImages.IMG_OBJS_JAR;
        } else if (type == IClasspathEntry.CPE_VARIABLE) {
            imgId = ISharedImages.IMG_OBJS_CLASSPATH_VAR_ENTRY;
        } else {
            imgId = null;
        }

        return (imgId == null ? null : JavaUI.getSharedImages().getImage(imgId));
    }

    private final class BuildPathEntriesContentProvider

            implements ITreeContentProvider

    {
        public Object[] getElements(final Object input) {
            final List<IClasspathEntry> elements = new ArrayList<IClasspathEntry>();
            final List<?> filteredContainerIds = ClasspathDependencyExtensions.get()
                    .getFilteredClasspathContainerIDs();

            try {
                for (IClasspathEntry cpe : getJavaProject().getRawClasspath()) {
                    final int type = cpe.getEntryKind();
                    final IPath path = cpe.getPath();
                    boolean relevant = false;

                    if (type == IClasspathEntry.CPE_CONTAINER) {
                        if (path.segmentCount() > 0 && !filteredContainerIds.contains(path.segment(0))) {
                            relevant = true;
                        }
                    } else if (type == IClasspathEntry.CPE_LIBRARY || type == IClasspathEntry.CPE_VARIABLE) {
                        relevant = true;
                    }

                    if (relevant) {
                        if (checkForComponentDependencyAttribute(cpe,
                                DependencyAttributeType.CLASSPATH_COMPONENT_NONDEPENDENCY) != null) {
                            relevant = false;
                        }
                    }

                    if (relevant) {
                        boolean found = false;

                        for (Object directive : (List<?>) getTaskModel()
                                .getObject(IReferenceWizardConstants.ALL_DIRECTIVES)) {
                            if (directive instanceof ClasspathEntryProxy) {
                                final ClasspathEntryProxy proxy = (ClasspathEntryProxy) directive;

                                if (type == proxy.entry.getEntryKind() && path.equals(proxy.entry.getPath())) {
                                    found = true;
                                    break;
                                }
                            }
                        }

                        if (found) {
                            relevant = false;
                        }
                    }

                    if (relevant) {
                        elements.add(cpe);
                    }
                }
            } catch (CoreException e) {
                J2EEUIPlugin.logError(e);
            }

            return elements.toArray();
        }

        public boolean hasChildren(final Object element) {
            return (element instanceof IClasspathEntry)
                    && (((IClasspathEntry) element).getEntryKind() == IClasspathEntry.CPE_CONTAINER);
        }

        public Object[] getChildren(final Object parent) {
            if (parent instanceof IClasspathEntry) {
                final IClasspathEntry cpe = (IClasspathEntry) parent;

                if (cpe.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
                    final List<ChildClasspathEntry> children = new ArrayList<ChildClasspathEntry>();

                    try {
                        final IClasspathContainer container = JavaCore.getClasspathContainer(cpe.getPath(),
                                getJavaProject());

                        if (container != null) {
                            for (IClasspathEntry child : container.getClasspathEntries()) {
                                children.add(new ChildClasspathEntry(cpe, child));
                            }
                        }
                    } catch (Exception e) {
                        J2EEUIPlugin.logError(e);
                    }

                    return children.toArray();
                }
            }

            return new Object[0];
        }

        public Object getParent(final Object element) {
            if (element instanceof ChildClasspathEntry) {
                return ((ChildClasspathEntry) element).parent;
            }

            return null;
        }

        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        }

        public void dispose() {
        }
    }

    private final class BuildPathEntriesLabelProvider

            extends LabelProvider

    {
        @Override
        public String getText(final Object element) {
            final IClasspathEntry cpe;

            if (element instanceof IClasspathEntry) {
                cpe = (IClasspathEntry) element;
            } else {
                cpe = ((ChildClasspathEntry) element).entry;
            }

            return getClasspathEntryText(getJavaProject(), cpe);
        }

        @Override
        public Image getImage(final Object element) {
            final IClasspathEntry cpe;

            if (element instanceof IClasspathEntry) {
                cpe = (IClasspathEntry) element;
            } else {
                cpe = ((ChildClasspathEntry) element).entry;
            }

            return getClasspathEntryImage(getJavaProject(), cpe);
        }
    }

    private static final class ChildClasspathEntry {
        public final IClasspathEntry parent;
        public final IClasspathEntry entry;

        public ChildClasspathEntry(final IClasspathEntry parent, final IClasspathEntry entry) {
            this.parent = parent;
            this.entry = entry;
        }
    }

    public static final class Resources extends NLS {
        public static String title;
        public static String description;

        static {
            initializeMessages(AddJavaBuildPathEntriesWizardFragment.class.getName(), Resources.class);
        }
    }

}