All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.mevenide.netbeans.SubprojectProviderImpl Maven / Gradle / Ivy

The newest version!
/* ==========================================================================
 * Copyright 2005 Mevenide Team
 *
 * Licensed 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.codehaus.mevenide.netbeans;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.apache.maven.artifact.Artifact;
import org.codehaus.mevenide.netbeans.api.ProjectURLWatcher;
import org.codehaus.mevenide.netbeans.queries.MavenFileOwnerQueryImpl;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.spi.project.SubprojectProvider;
import org.openide.ErrorManager;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.WeakListeners;

/**
 * finds subprojects (projects this one depends on) that are locally available
 * and can be build as one unit. Uses maven multiproject infrastructure. (maven.multiproject.includes)
 * @author  Milos Kleint ([email protected])
 */
public class SubprojectProviderImpl implements SubprojectProvider {

    private NbMavenProject project;
    private List listeners;
    private ChangeListener listener2;

    /** Creates a new instance of SubprojectProviderImpl */
    public SubprojectProviderImpl(NbMavenProject proj) {
        project = proj;
        listeners = new ArrayList();
        ProjectURLWatcher.addPropertyChangeListener(proj, new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                if (NbMavenProject.PROP_PROJECT.equals(evt.getPropertyName())) {
                    fireChange();
                }
            }
        });
        listener2 = new ChangeListener() {

            public void stateChanged(ChangeEvent event) {
                fireChange();
            }
        };
        MavenFileOwnerQueryImpl.getInstance().addChangeListener(
                WeakListeners.change(listener2,
                MavenFileOwnerQueryImpl.getInstance()));
    }

    public Set getSubprojects() {
        Set projects = new HashSet();
        File basedir = FileUtil.toFile(project.getProjectDirectory());
        addProjectModules(basedir, projects, project.getOriginalMavenProject().getModules());
        addOpenedCandidates(projects);
        projects.remove(project);
        return projects;
    }

    private void addOpenedCandidates(Set resultset) {
        Set opened = MavenFileOwnerQueryImpl.getInstance().getOpenedProjects();
        List compileArtifacts = project.getOriginalMavenProject().getCompileArtifacts();
        List artPaths = new ArrayList();
        for (Artifact ar : compileArtifacts) {
            artPaths.add(project.getArtifactRelativeRepositoryPath(ar));
        }
        for (NbMavenProject prj : opened) {
            String prjpath = prj.getArtifactRelativeRepositoryPath();
            if (artPaths.contains(prjpath)) {
                resultset.add(prj);
            }
        }
    }

    private boolean isProcessed(Set resultset, FileObject projectDir) {

        for (Project p : resultset) {
            if (p.getProjectDirectory().equals(projectDir)) {
                return true;
            }
        }

        return false;
    }

    private void addProjectModules(File basedir, Set resultset, List modules) {
        if (modules == null || modules.size() == 0) {
            return;
        }
        Iterator it = modules.iterator();
        while (it.hasNext()) {
            String path = (String) it.next();
            File sub = new File(basedir, path);
            File projectFile = FileUtil.normalizeFile(sub);
            if (projectFile.exists()) {
                FileObject projectDir = FileUtil.toFileObject(projectFile);
                if (projectDir != null && !isProcessed(resultset, projectDir)) {
                    Project proj = processOneSubproject(projectDir);
                    NbMavenProject mv = proj != null ? proj.getLookup().lookup(NbMavenProject.class) : null;
                    if (mv != null) {
                        // ignore the pom type projects when resolving subprojects..
                        // maybe make an user settable option??
                        if (!ProjectURLWatcher.TYPE_POM.equalsIgnoreCase(mv.getProjectWatcher().getPackagingType())) {
                            resultset.add(proj);
                        }
                        addProjectModules(FileUtil.toFile(mv.getProjectDirectory()),
                                resultset, mv.getOriginalMavenProject().getModules());
                    }
                } else {
                    // HUH?
                    ErrorManager.getDefault().log("fileobject not found=" + sub); //NOI18N
                }

            } else {
                ErrorManager.getDefault().log("project file not found=" + sub); //NOI18N
            }



        }
    }

    private Project processOneSubproject(FileObject projectDir) {


        try {
            return ProjectManager.getDefault().findProject(projectDir);
        } catch (IOException exc) {
            ErrorManager.getDefault().notify(exc);
        }

        return null;
    }

    public synchronized void addChangeListener(ChangeListener changeListener) {
        listeners.add(changeListener);
    }

    public synchronized void removeChangeListener(ChangeListener changeListener) {
        listeners.remove(changeListener);
    }

    private void fireChange() {
        List lists = new ArrayList();
        synchronized (this) {
            lists.addAll(listeners);
        }
        for (ChangeListener listener : lists) {
            listener.stateChanged(new ChangeEvent(this));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy