/******************************************************************************* | |
* Copyright (c) 2009 by SAP AG, Walldorf. | |
* 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: | |
* SAP AG - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.jst.ws.jaxws.dom.runtime.persistence; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.NullProgressMonitor; | |
import org.eclipse.jdt.core.ICompilationUnit; | |
import org.eclipse.jdt.core.IJavaModel; | |
import org.eclipse.jdt.core.IJavaProject; | |
import org.eclipse.jdt.core.IPackageFragment; | |
import org.eclipse.jdt.core.IPackageFragmentRoot; | |
import org.eclipse.jdt.core.JavaModelException; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.api.WsDOMLoadCanceledException; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.internal.plugin.JaxWsDomRuntimeMessages; | |
public class WorkspaceCUFinder implements ICompilationUnitFinder | |
{ | |
private final IJavaModel javaModel; | |
private final IProjectSelector[] selectors; | |
public WorkspaceCUFinder(IJavaModel javaModel, IProjectSelector[] selectors) { | |
if (javaModel == null) { | |
throw new NullPointerException("javaModel");//$NON-NLS-1$ | |
} | |
this.javaModel = javaModel; | |
if (selectors == null) { | |
throw new NullPointerException("selector");//$NON-NLS-1$ | |
} | |
this.selectors = selectors; | |
} | |
public void find(final IProgressMonitor monitor, final ICompilationUnitHandler cuHandler) throws CoreException, WsDOMLoadCanceledException | |
{ | |
cuHandler.started(); | |
if (monitor != null) { | |
monitor.beginTask(JaxWsDomRuntimeMessages.JAXWS_DOM_LOADING, assumeWork()); | |
} | |
try { | |
for (IJavaProject prj : javaModel.getJavaProjects()) | |
{ | |
if (monitor!=null && monitor.isCanceled()) { | |
throw new WsDOMLoadCanceledException("JAX-WS DOM loading canceled", JaxWsDomRuntimeMessages.WorkspaceCUFinder_LOADING_CANCELED); //$NON-NLS-1$ | |
} | |
if (approve(prj)) | |
{ | |
cuHandler.handle(prj); | |
parseProject(prj, monitor, cuHandler); | |
} | |
} | |
cuHandler.finished(); | |
} finally { | |
if (monitor != null) { | |
monitor.done(); | |
} | |
} | |
} | |
protected int assumeWork() throws CoreException, WsDOMLoadCanceledException | |
{ | |
final CountingCUHandler countingHandler = new CountingCUHandler(); | |
for (IJavaProject prj : javaModel.getJavaProjects()) { | |
if (approve(prj)) { | |
parseProject(prj, new NullProgressMonitor(), countingHandler); | |
} | |
} | |
return countingHandler.count; | |
} | |
private void parseProject(final IJavaProject prj, final IProgressMonitor monitor, final ICompilationUnitHandler cuHandler) throws JavaModelException, WsDOMLoadCanceledException | |
{ | |
for (IPackageFragment packageFragment : prj.getPackageFragments()) | |
{ | |
if (packageFragment.getKind() != IPackageFragmentRoot.K_SOURCE) { | |
continue; | |
} | |
for (ICompilationUnit cu : packageFragment.getCompilationUnits()) | |
{ | |
if (monitor!=null && monitor.isCanceled()) { | |
throw new WsDOMLoadCanceledException("JAX-WS DOM loading canceled",JaxWsDomRuntimeMessages.WorkspaceCUFinder_LOADING_CANCELED); //$NON-NLS-1$ | |
} | |
cuHandler.handle(cu); | |
if (monitor != null) { | |
monitor.worked(1); | |
} | |
} | |
} | |
} | |
private boolean approve(IJavaProject prj) { | |
for (IProjectSelector selector : selectors) { | |
if (selector.approve(prj)) { | |
return true; | |
} | |
} | |
return false; | |
} | |
/** | |
* This handler counts the compilation units | |
* | |
* @author Georgi Vachkov | |
*/ | |
protected class CountingCUHandler implements ICompilationUnitHandler | |
{ | |
private int count; | |
public void started() { | |
count = 0; | |
} | |
public void handle(ICompilationUnit cu) { | |
count++; | |
} | |
public void finished() { /* no processing needed */ } | |
public void handle(IJavaProject jprj) { /* no processing needed */ } | |
} | |
} |