org.apache.cactus.eclipse.runner.ui.CactifyActionDelegate.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.cactus.eclipse.runner.ui.CactifyActionDelegate.java

Source

/* 
 * ========================================================================
 * 
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * ========================================================================
 */
package org.apache.cactus.eclipse.runner.ui;

import org.apache.cactus.eclipse.runner.common.JarFilenameFilter;
import org.eclipse.core.internal.resources.Project;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IActionDelegate;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;

import java.io.File;
import java.util.Vector;

/**
 * Action delegate to cactify a project.
 * 
 * @version $Id: CactifyActionDelegate.java 238816 2004-02-29 16:36:46Z vmassol $
 */
public class CactifyActionDelegate implements IObjectActionDelegate {
    /**
     * The project selected by the user
     */
    private IJavaProject selectedProject;

    /**
     * The active part
     */
    private IWorkbenchPart part;

    /**
     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
     */
    public void setActivePart(IAction theAction, IWorkbenchPart theTargetPart) {
        this.part = theTargetPart;
    }

    /**
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    public void run(IAction theAction) {
        if (selectedProject != null) {
            CactusPlugin thePlugin = CactusPlugin.getDefault();
            File commonLibDir = null;
            File clientLibDir = null;

            try {
                commonLibDir = new File(Platform.asLocalURL(thePlugin.getBundle().getEntry(
                        "/" + CactusPlugin.CACTUS_LIBRARY_PATH + "/" + CactusPlugin.CACTUS_COMMON_LIBRARY_PATH))
                        .getPath());
                clientLibDir = new File(Platform.asLocalURL(thePlugin.getBundle().getEntry(
                        "/" + CactusPlugin.CACTUS_LIBRARY_PATH + "/" + CactusPlugin.CACTUS_CLIENT_LIBRARY_PATH))
                        .getPath());
            } catch (Exception ex) {
                CactusPlugin.log(ex);
            }

            IClasspathEntry[] commonEntries = getLibClassPathEntries(commonLibDir);
            IClasspathEntry[] clientEntries = getLibClassPathEntries(clientLibDir);
            IClasspathEntry[] allNewEntries = new IClasspathEntry[commonEntries.length + clientEntries.length];
            System.arraycopy(commonEntries, 0, allNewEntries, 0, commonEntries.length);
            System.arraycopy(clientEntries, 0, allNewEntries, commonEntries.length, clientEntries.length);
            try {

                IClasspathEntry[] existingEntries = selectedProject.getRawClasspath();
                selectedProject.setRawClasspath(merge(existingEntries, allNewEntries), null);
            } catch (Exception e) {
                CactusPlugin.displayErrorMessage(CactusMessages.getString("Cactify.message.error"), e.getMessage(),
                        null);
            }
        }
    }

    /**
     * @see IActionDelegate#selectionChanged(IAction, ISelection)
     */
    public void selectionChanged(IAction theAction, ISelection theSelection) {
        selectedProject = null;
        if (theSelection instanceof IStructuredSelection) {
            IStructuredSelection structuredSelection = (IStructuredSelection) theSelection;
            if (structuredSelection.size() == 1) {
                Object selectedResource = structuredSelection.getFirstElement();
                if (selectedResource instanceof org.eclipse.core.internal.resources.Project) {
                    Project project = (Project) selectedResource;
                    selectedProject = JavaCore.create(project);
                }
            }
        }
    }

    /**
     * Returns a list of entries of jars files contained
     * in the given directory. 
     * @param theDirectory the directory to list jars from
     * @return an array of jar entries
     */
    private IClasspathEntry[] getLibClassPathEntries(File theDirectory) {
        File[] jarFiles = theDirectory.listFiles(new JarFilenameFilter());
        IClasspathEntry[] result = new IClasspathEntry[jarFiles.length];
        for (int i = 0; i < jarFiles.length; i++) {
            File currentJarFile = jarFiles[i];
            result[i] = JavaCore.newLibraryEntry(new Path(currentJarFile.getAbsolutePath()), null, null);
        }
        return result;
    }

    /**
     * @param theFirstArray an array of classpath entries
     * @param theSecondArray an array of classpath entries
     * @return the fusion of the two given arrays 
     */
    private static IClasspathEntry[] merge(IClasspathEntry[] theFirstArray, IClasspathEntry[] theSecondArray) {

        Vector result = new Vector();
        for (int i = 0; i < theFirstArray.length; i++) {
            result.add(theFirstArray[i]);
        }
        for (int i = 0; i < theSecondArray.length; i++) {
            IClasspathEntry currentEntry = theSecondArray[i];
            String currentEntryFileName = currentEntry.getPath().toFile().getName();
            boolean entryAlreadyExists = false;
            boolean isFile = false;
            for (int j = 0; j < theFirstArray.length; j++) {
                IClasspathEntry comparedEntry = theFirstArray[j];
                isFile = comparedEntry.getPath().toFile().getAbsolutePath().endsWith(".jar");
                String comparedFileName = comparedEntry.getPath().toFile().getName();
                if (comparedEntry.getPath().equals(currentEntry.getPath())
                        || (comparedFileName.equals(currentEntryFileName) && isFile)) {
                    entryAlreadyExists = true;
                    break;
                }
            }
            if (!entryAlreadyExists) {
                result.add(currentEntry);
            }
        }
        return (IClasspathEntry[]) result.toArray(new IClasspathEntry[result.size()]);
    }

    public void setSelectedProject(IJavaProject selectedProject) {
        this.selectedProject = selectedProject;
    }
}