blob: 006f4caeac3a04b5723d33d10518238e3b7f3e1a [file] [log] [blame]
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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.jetbrains.idea.maven.server;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.model.*;
import org.jetbrains.idea.maven.project.MavenConsole;
import org.jetbrains.idea.maven.utils.MavenLog;
import org.jetbrains.idea.maven.utils.MavenProcessCanceledException;
import org.jetbrains.idea.maven.utils.MavenProgressIndicator;
import java.io.File;
import java.rmi.NoSuchObjectException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServerEmbedder> {
private Customization myCustomization;
public MavenEmbedderWrapper(@Nullable RemoteObjectWrapper<?> parent) {
super(parent);
}
@Override
protected synchronized void onWrappeeCreated() throws RemoteException {
super.onWrappeeCreated();
if (myCustomization != null) {
doCustomize();
}
}
public void customizeForResolve(MavenConsole console, MavenProgressIndicator indicator) {
setCustomization(console, indicator, null, false, false);
perform(new Retriable<Object>() {
@Override
public Object execute() throws RemoteException {
doCustomize();
return null;
}
});
}
public void customizeForResolve(MavenWorkspaceMap workspaceMap, MavenConsole console, MavenProgressIndicator indicator, boolean alwaysUpdateSnapshot) {
setCustomization(console, indicator, workspaceMap, false, alwaysUpdateSnapshot);
perform(new Retriable<Object>() {
@Override
public Object execute() throws RemoteException {
doCustomize();
return null;
}
});
}
public void customizeForStrictResolve(MavenWorkspaceMap workspaceMap,
MavenConsole console,
MavenProgressIndicator indicator) {
setCustomization(console, indicator, workspaceMap, true, false);
perform(new Retriable<Object>() {
@Override
public Object execute() throws RemoteException {
doCustomize();
return null;
}
});
}
private synchronized void doCustomize() throws RemoteException {
getOrCreateWrappee().customize(myCustomization.workspaceMap,
myCustomization.failOnUnresolvedDependency,
myCustomization.console,
myCustomization.indicator,
myCustomization.alwaysUpdateSnapshot);
}
@NotNull
public MavenServerExecutionResult resolveProject(@NotNull final VirtualFile file,
@NotNull final Collection<String> activeProfiles,
@NotNull final Collection<String> inactiveProfiles)
throws MavenProcessCanceledException {
return perform(new RetriableCancelable<MavenServerExecutionResult>() {
@Override
public MavenServerExecutionResult execute() throws RemoteException, MavenServerProcessCanceledException {
return getOrCreateWrappee().resolveProject(new File(file.getPath()), activeProfiles, inactiveProfiles);
}
});
}
@Nullable
public String evaluateEffectivePom(@NotNull final VirtualFile file,
@NotNull final Collection<String> activeProfiles,
@NotNull final Collection<String> inactiveProfiles) throws MavenProcessCanceledException {
return perform(new RetriableCancelable<String>() {
@Override
public String execute() throws RemoteException, MavenServerProcessCanceledException {
return getOrCreateWrappee()
.evaluateEffectivePom(new File(file.getPath()), new ArrayList<String>(activeProfiles), new ArrayList<String>(inactiveProfiles));
}
});
}
@NotNull
public MavenArtifact resolve(@NotNull final MavenArtifactInfo info,
@NotNull final List<MavenRemoteRepository> remoteRepositories) throws MavenProcessCanceledException {
return perform(new RetriableCancelable<MavenArtifact>() {
@Override
public MavenArtifact execute() throws RemoteException, MavenServerProcessCanceledException {
return getOrCreateWrappee().resolve(info, remoteRepositories);
}
});
}
@NotNull
public List<MavenArtifact> resolveTransitively(
@NotNull final List<MavenArtifactInfo> artifacts,
@NotNull final List<MavenRemoteRepository> remoteRepositories) throws MavenProcessCanceledException {
return perform(new RetriableCancelable<List<MavenArtifact>>() {
@Override
public List<MavenArtifact> execute() throws RemoteException, MavenServerProcessCanceledException {
return getOrCreateWrappee().resolveTransitively(artifacts, remoteRepositories);
}
});
}
public Collection<MavenArtifact> resolvePlugin(@NotNull final MavenPlugin plugin,
@NotNull final List<MavenRemoteRepository> repositories,
@NotNull final NativeMavenProjectHolder nativeMavenProject,
final boolean transitive) throws MavenProcessCanceledException {
int id;
try {
id = nativeMavenProject.getId();
}
catch (RemoteException e) {
// do not call handleRemoteError here since this error occurred because of previous remote error
return Collections.emptyList();
}
try {
return getOrCreateWrappee().resolvePlugin(plugin, repositories, id, transitive);
}
catch (RemoteException e) {
// do not try to reconnect here since we have lost NativeMavenProjectHolder anyway.
handleRemoteError(e);
return Collections.emptyList();
}
catch (MavenServerProcessCanceledException e) {
throw new MavenProcessCanceledException();
}
}
@NotNull
public MavenServerExecutionResult execute(@NotNull final VirtualFile file,
@NotNull final Collection<String> activeProfiles,
@NotNull final Collection<String> inactiveProfiles,
@NotNull final List<String> goals) throws MavenProcessCanceledException {
return perform(new RetriableCancelable<MavenServerExecutionResult>() {
@Override
public MavenServerExecutionResult execute() throws RemoteException, MavenServerProcessCanceledException {
return getOrCreateWrappee()
.execute(new File(file.getPath()), activeProfiles, inactiveProfiles, goals, Collections.<String>emptyList(), false, false);
}
});
}
@NotNull
public MavenServerExecutionResult execute(@NotNull final VirtualFile file,
@NotNull final Collection<String> activeProfiles,
@NotNull final Collection<String> inactiveProfiles,
@NotNull final List<String> goals,
@NotNull final List<String> selectedProjects,
final boolean alsoMake,
final boolean alsoMakeDependents) throws MavenProcessCanceledException {
return perform(new RetriableCancelable<MavenServerExecutionResult>() {
@Override
public MavenServerExecutionResult execute() throws RemoteException, MavenServerProcessCanceledException {
return getOrCreateWrappee()
.execute(new File(file.getPath()), activeProfiles, inactiveProfiles, goals, selectedProjects, alsoMake, alsoMakeDependents);
}
});
}
public void reset() {
MavenServerEmbedder w = getWrappee();
if (w == null) return;
try {
w.reset();
}
catch (RemoteException e) {
handleRemoteError(e);
}
resetCustomization();
}
public void release() {
MavenServerEmbedder w = getWrappee();
if (w == null) return;
try {
w.release();
}
catch (RemoteException e) {
handleRemoteError(e);
}
resetCustomization();
}
public void clearCaches() {
MavenServerEmbedder w = getWrappee();
if (w == null) return;
try {
w.clearCaches();
}
catch (RemoteException e) {
handleRemoteError(e);
}
}
public void clearCachesFor(MavenId projectId) {
MavenServerEmbedder w = getWrappee();
if (w == null) return;
try {
w.clearCachesFor(projectId);
}
catch (RemoteException e) {
handleRemoteError(e);
}
}
private synchronized void setCustomization(MavenConsole console,
MavenProgressIndicator indicator,
MavenWorkspaceMap workspaceMap,
boolean failOnUnresolvedDependency,
boolean alwaysUpdateSnapshot) {
resetCustomization();
myCustomization = new Customization(MavenServerManager.wrapAndExport(console),
MavenServerManager.wrapAndExport(indicator),
workspaceMap,
failOnUnresolvedDependency,
alwaysUpdateSnapshot);
}
private synchronized void resetCustomization() {
if (myCustomization == null) return;
try {
UnicastRemoteObject.unexportObject(myCustomization.console, true);
}
catch (NoSuchObjectException e) {
MavenLog.LOG.warn(e);
}
try {
UnicastRemoteObject.unexportObject(myCustomization.indicator, true);
}
catch (NoSuchObjectException e) {
MavenLog.LOG.warn(e);
}
myCustomization = null;
}
private static class Customization {
private final MavenServerConsole console;
private final MavenServerProgressIndicator indicator;
private final MavenWorkspaceMap workspaceMap;
private final boolean failOnUnresolvedDependency;
private final boolean alwaysUpdateSnapshot;
private Customization(MavenServerConsole console,
MavenServerProgressIndicator indicator,
MavenWorkspaceMap workspaceMap,
boolean failOnUnresolvedDependency,
boolean alwaysUpdateSnapshot) {
this.console = console;
this.indicator = indicator;
this.workspaceMap = workspaceMap;
this.failOnUnresolvedDependency = failOnUnresolvedDependency;
this.alwaysUpdateSnapshot = alwaysUpdateSnapshot;
}
}
}