blob: 78f1567093baac2127e3ac62ae3fb22b8e390157 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2010 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.core.internal.project.registry;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.m2e.core.embedder.ArtifactKey;
import org.eclipse.m2e.core.project.MavenProjectChangedEvent;
/**
* Registry of all Maven workspace projects and their inter-dependencies. Dependencies are modelled as generic
* requirement/capability match and can represent any dependencies, not just Maven. The only way to change registry
* contents is via {@link #apply(MutableProjectRegistry)} call. This class is thread safe.
*
* @author Igor Fedorenko
*/
public class ProjectRegistry extends BasicProjectRegistry implements Serializable, IProjectRegistry {
private static final long serialVersionUID = 7296606601386638800L;
private transient int version;
public synchronized MavenProjectFacade getProjectFacade(IFile pom) {
return super.getProjectFacade(pom);
}
public synchronized MavenProjectFacade getProjectFacade(String groupId, String artifactId, String version) {
return super.getProjectFacade(groupId, artifactId, version);
}
public synchronized MavenProjectFacade[] getProjects() {
return super.getProjects();
}
public synchronized Map<ArtifactKey, Collection<IFile>> getWorkspaceArtifacts(String groupId, String artifactId) {
return super.getWorkspaceArtifacts(groupId, artifactId);
}
public synchronized List<MavenProjectChangedEvent> apply(MutableProjectRegistry newState)
throws StaleMutableProjectRegistryException {
if(newState.isStale()) {
throw new StaleMutableProjectRegistryException();
}
ArrayList<MavenProjectChangedEvent> events = new ArrayList<MavenProjectChangedEvent>();
// removed projects
for(MavenProjectFacade facade : workspacePoms.values()) {
if(!newState.workspacePoms.containsKey(facade.getPom())) {
MavenProjectChangedEvent event = new MavenProjectChangedEvent( //
facade.getPom(), //
MavenProjectChangedEvent.KIND_REMOVED, //
MavenProjectChangedEvent.FLAG_NONE, //
facade /*old*/, //
null /*new*/);
events.add(event);
}
}
// changed and new projects
for(MavenProjectFacade facade : newState.workspacePoms.values()) {
MavenProjectFacade old = workspacePoms.get(facade.getPom());
if(facade != old) { // not the same instance!
MavenProjectChangedEvent event;
if(old != null) {
int flags = hasDependencyChange(old.getPom(), newState) ? MavenProjectChangedEvent.FLAG_DEPENDENCIES
: MavenProjectChangedEvent.FLAG_NONE;
event = new MavenProjectChangedEvent(facade.getPom(), //
MavenProjectChangedEvent.KIND_CHANGED, //
flags, //
old /*old*/, //
facade /*new*/);
} else {
event = new MavenProjectChangedEvent(facade.getPom(), //
MavenProjectChangedEvent.KIND_ADDED, //
MavenProjectChangedEvent.FLAG_NONE, //
null /*old*/, //
facade /*new*/);
}
events.add(event);
}
}
replaceWith(newState);
version++ ;
return events;
}
public synchronized int getVersion() {
return version;
}
private boolean hasDependencyChange(IFile pom, MutableProjectRegistry newState) {
Set<RequiredCapability> oldRequirements = getProjectRequirements(pom);
Set<RequiredCapability> requirements = newState.getProjectRequirements(pom);
return ProjectRegistryManager.hasDiff(oldRequirements, requirements);
}
}