/*******************************************************************************
* Copyright (c) 2007-2010 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.editor.check;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.jboss.tools.common.log.LogHelper;
import org.jboss.tools.common.model.options.Preference;
import org.jboss.tools.jsf.ui.JsfUIMessages;
import org.jboss.tools.jst.web.kb.IKbProject;
import org.jboss.tools.jst.web.kb.internal.KbBuilderMarker;
import org.jboss.tools.jst.web.kb.internal.KbProject;
import org.jboss.tools.jst.web.ui.WebUiPlugin;
import org.jboss.tools.jst.web.ui.internal.editor.util.FileUtil;
/**
*
* @author yzhishko
*
*/
public class ProjectNaturesChecker implements IResourceChangeListener {
private ProjectNaturesPartListener partListener = new ProjectNaturesPartListener();
private static final String SEARCH_CLASS = "javax.faces.webapp.FacesServlet"; //$NON-NLS-1$
public static final QualifiedName IS_JSF_CHECK_NEED = new QualifiedName(
"", JsfUIMessages.IS_JSF_CHECK_NEED); //$NON-NLS-1$
private Set<IProject> projectsCollection;
private static ProjectNaturesChecker checker;
public static ProjectNaturesChecker getInstance() {
if (checker == null) {
checker = new ProjectNaturesChecker();
}
return checker;
}
private ProjectNaturesChecker() {
projectsCollection = new HashSet<IProject>(0);
// ResourcesPlugin.getWorkspace().addResourceChangeListener(this,
// IResourceChangeEvent.POST_CHANGE);
IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
if(windows != null) for (IWorkbenchWindow window: windows) {
window.getPartService().addPartListener(partListener);
}
PlatformUI.getWorkbench().addWindowListener(new WindowListener());
}
public void resourceChanged(final IResourceChangeEvent event) {
Display display = Display.getDefault();
if (display != null) {
display.asyncExec(new Runnable() {
public void run() {
handleResourceChangeEvent(event);
}
});
}
}
public void checkNatures(IProject project) throws CoreException {
if (project != null && project.isAccessible()) {
addProject(project);
boolean isKBNaturesCheck = Preference.SHOW_NATURE_WARNING.getValue().equals("yes");
KbProject.checkKBBuilderInstalled(project);
String missingNature = checkMissingNatures(project);
if (missingNature != null) {
ProjectNaturesInfoDialog dialog = null;
if (KbProject.NATURE_ID.equals(missingNature) && isKBNaturesCheck) {
dialog = new KBNaturesInfoDialog(project);
}
if (dialog != null) {
dialog.open();
}
}
}
}
private String checkMissingNatures(IProject project) throws CoreException {
if (getKBProblemMarker(project) != null) {
return IKbProject.NATURE_ID;
}
return null;
}
private void handleResourceChangeEvent(IResourceChangeEvent changeEvent) {
IResourceDelta[] affectedChildren = changeEvent.getDelta().getAffectedChildren();
for (int i = 0; i < affectedChildren.length; i++) {
IResourceDelta resourceDelta = affectedChildren[i];
if (resourceDelta.getResource() instanceof IProject) {
IProject project = (IProject) resourceDelta.getResource();
try {
if (resourceDelta.getKind() == IResourceDelta.ADDED) {
processAddProject(project);
} else if (resourceDelta.getKind() == IResourceDelta.REMOVED) {
processRemoveProject(project);
} else {
updateProjectJSFPersistents(project);
}
} catch (CoreException e) {
LogHelper.logError(WebUiPlugin.PLUGIN_ID, e);
}
}
}
}
public IProject getProject(IProject project) {
return projectsCollection.contains(project) ? project : null;
}
public void addProject(IProject project) {
if (!projectsCollection.contains(project)) {
projectsCollection.add(project);
}
}
public void dispose() {
partListener = null;
projectsCollection.clear();
}
private void processAddProject(IProject project) throws CoreException {
addProject(project);
updateProjectJSFPersistents(project);
}
private void processRemoveProject(IProject project) {
projectsCollection.remove(project);
}
private void updateProjectJSFPersistents(IProject project) throws CoreException {
if (project.isAccessible()) {
IJavaElement javaElement = null;
try {
javaElement = FileUtil.searchForClass(JavaCore.create(project), SEARCH_CLASS);
} finally {
if (javaElement == null) {
project.setPersistentProperty(IS_JSF_CHECK_NEED, Boolean.FALSE.toString());
} else {
project.setPersistentProperty(IS_JSF_CHECK_NEED, Boolean.TRUE.toString());
}
}
}
}
private IMarker getKBProblemMarker(IProject project) throws CoreException {
IMarker kbProblemMarker = null;
IMarker[] markers = project.findMarkers(null, false, 1);
for (IMarker marker : markers ) {
if (KbBuilderMarker.KB_BUILDER_PROBLEM_MARKER_TYPE.equals(marker.getType())) {
kbProblemMarker = marker;
break;
}
}
return kbProblemMarker;
}
class WindowListener implements IWindowListener {
public void windowActivated(IWorkbenchWindow window) {
}
public void windowDeactivated(IWorkbenchWindow window) {
}
public void windowClosed(IWorkbenchWindow window) {
window.getPartService().removePartListener(partListener);
}
public void windowOpened(IWorkbenchWindow window) {
window.getPartService().addPartListener(partListener);
}
}
}