blob: c2507f6255e09b65347c23218beb5bd5ae7c8d8d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 BEA Systems, Inc.
* 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:
* jgarms@bea.com - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.apt.core.internal;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IJavaProject;
/**
* Stores factories or libraries that were inaccessible when
* attempting to load annotation processors, and then handles
* reporting those errors to the user as markers in the problems pane.
* <p>
* This class is necessary due to deadlock possibilities in
* {@link AnnotationProcessorFactoryLoader}. We need to gather up
* the errors while holding a lock in that class,
* and then later report them outside the lock, via the
* reportFailureMarkers() method.
*/
public class LoadFailureHandler {
private final IProject _project;
private final List<String> _missingLibraries = new ArrayList<String>();
private final List<String> _failedFactories = new ArrayList<String>();
public LoadFailureHandler(IJavaProject proj) {
_project = proj.getProject();
}
public void addMissingLibrary(String lib) {
_missingLibraries.add(lib);
}
public void addFailedFactory(String factory) {
_failedFactories.add(factory);
}
public void reportFailureMarkers() {
reportFailureToLoadFactories();
reportMissingLibraries();
}
/**
* Enter problem markers for factory containers that could not be found on
* disk. This routine does not check whether markers already exist.
* See {@link AnnotationProcessorFactoryLoader} for information about
* the lifecycle of these markers.
*/
private void reportMissingLibraries() {
for (String fc : _missingLibraries) {
try {
String message = Messages.bind(
Messages.AnnotationProcessorFactoryLoader_factorypath_missingLibrary,
new String[] {fc, _project.getName()});
IMarker marker = _project.createMarker(AptPlugin.APT_LOADER_PROBLEM_MARKER);
marker.setAttributes(
new String[] {
IMarker.MESSAGE,
IMarker.SEVERITY,
IMarker.LOCATION
},
new Object[] {
message,
IMarker.SEVERITY_ERROR,
Messages.AnnotationProcessorFactoryLoader_factorypath
}
);
} catch (CoreException e) {
AptPlugin.log(e, "Unable to create APT build problem marker on project " + _project.getName()); //$NON-NLS-1$
}
}
}
/**
* Enter a marker for a factory class that could not be loaded.
* Note that if a jar is missing, we won't be able to load its factory
* names, and thus we won't even try loading its factory classes; but
* we can still fail to load a factory class if, for instance, the
* jar is corrupted or the factory constructor throws an exception.
* See {@link AnnotationProcessorFactoryLoader} for information about
* the lifecycle of these markers.
*/
private void reportFailureToLoadFactories() {
for (String factoryName : _failedFactories) {
try {
String message = Messages.bind(
Messages.AnnotationProcessorFactoryLoader_unableToLoadFactoryClass,
new String[] {factoryName, _project.getName()});
IMarker marker = _project.createMarker(AptPlugin.APT_LOADER_PROBLEM_MARKER);
marker.setAttributes(
new String[] {
IMarker.MESSAGE,
IMarker.SEVERITY,
IMarker.LOCATION
},
new Object[] {
message,
IStatus.ERROR,
Messages.AnnotationProcessorFactoryLoader_factorypath
}
);
} catch (CoreException e) {
AptPlugin.log(e, "Unable to create build problem marker"); //$NON-NLS-1$
}
}
}
@Override
public int hashCode() {
return _project.hashCode();
}
@Override
public boolean equals(Object o) {
if (!(o instanceof LoadFailureHandler)) return false;
LoadFailureHandler otherHandler = (LoadFailureHandler)o;
return _project.equals(otherHandler._project);
}
}