/************************************************************************************* * Copyright (c) 2015 Red Hat, Inc. and others. * 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: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.batch.internal.core.scanner.lib; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import org.jboss.tools.batch.core.BatchCorePlugin; import org.jboss.tools.batch.core.IBatchProject; import org.jboss.tools.batch.internal.core.impl.BatchProject; import org.jboss.tools.batch.internal.core.impl.BatchProjectFactory; import org.jboss.tools.batch.internal.core.scanner.BatchArchiveDetector; import org.jboss.tools.common.EclipseUtil; import org.jboss.tools.jst.web.kb.internal.IKbProjectExtension; /** * * @author Viacheslav Kabanovich * */ public class ClassPathMonitor extends AbstractClassPathMonitor { IBatchProject batchProject; IPath[] srcs = new IPath[0]; Set<IPath> removedPaths = new HashSet<IPath>(); public ClassPathMonitor(IBatchProject project) { batchProject = project; } public JarSet process() { JarSet newJars = new JarSet(); for (String p: syncProcessedPaths()) { synchronized (removedPaths) { removedPaths.add(new Path(p)); } } Set<String> processed = new HashSet<String>(); synchronized(this) { processed.addAll(processedPaths); } for (int i = 0; i < paths.size(); i++) { String p = paths.get(i); if(!requestForLoad(p)) continue; removedPaths.add(new Path(p)); String fileName = new File(p).getName(); if(Libs.SYSTEM_JAR_SET.contains(fileName)) continue; detectBatchModule(p, newJars); } validateProjectDependencies(); return newJars; } public void setSrcs(IPath[] newSrcs) { Set<IPath> ss = new HashSet<IPath>(); for (IPath s: newSrcs) { ss.add(s); } for (IPath s: srcs) { if(!ss.contains(s)) { synchronized (removedPaths) { removedPaths.add(s); } } } srcs = newSrcs; } public void applyRemovedPaths() { synchronized (removedPaths) { for (IPath p: removedPaths) { ((BatchProject)batchProject).pathRemoved(p); } removedPaths.clear(); } } public void validateProjectDependencies() { List<IBatchProject> ps = null; try { ps = getProjects(batchProject.getProject()); } catch (CoreException e) { BatchCorePlugin.pluginLog().logError(e); } if(ps != null) { Set<IKbProjectExtension> set = batchProject.getUsedProjects(); Set<IKbProjectExtension> removable = new HashSet<IKbProjectExtension>(); removable.addAll(set); removable.removeAll(ps); ps.removeAll(set); for (IBatchProject p : ps) { batchProject.addUsedProject(p); } for (IKbProjectExtension p : removable) { batchProject.removeUsedProject(p); } } } public boolean hasToUpdateProjectDependencies() { List<IBatchProject> ps = null; try { ps = getProjects(batchProject.getProject()); } catch (CoreException e) { BatchCorePlugin.pluginLog().logError(e); } if(ps != null) { Set<IKbProjectExtension> set = batchProject.getUsedProjects(); Set<IKbProjectExtension> removable = new HashSet<IKbProjectExtension>(); removable.addAll(set); removable.removeAll(ps); ps.removeAll(set); return !ps.isEmpty() || !removable.isEmpty(); } return false; } public static List<IBatchProject> getProjects(IProject project) throws CoreException { List<IBatchProject> list = new ArrayList<IBatchProject>(); IJavaProject javaProject = EclipseUtil.getJavaProject(project); if(javaProject != null) { IClasspathEntry[] es = javaProject.getResolvedClasspath(true); for (int i = 0; i < es.length; i++) { if(es[i].getEntryKind() == IClasspathEntry.CPE_PROJECT) { IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(es[i].getPath().lastSegment()); if(p == null || !p.isAccessible()) continue; IBatchProject sp = BatchProjectFactory.getBatchProject(p, false); if(sp != null) list.add(sp); } } } return list; } private void detectBatchModule(String path, JarSet newJars) { newJars.getFileSystems().add(path); int archiveType = BatchArchiveDetector.getInstance().getBatchArchive(path); if(archiveType == BatchArchiveDetector.UNRESOLVED) { try { archiveType = BatchArchiveDetector.getInstance().resolve(path, batchProject); } catch (JavaModelException e) { BatchCorePlugin.pluginLog().logError(e); return; } } if(archiveType != BatchArchiveDetector.NOT_ARCHIVE) { newJars.getBatchModules().add(path); } } @Override public IProject getProjectResource() { return batchProject.getProject(); } public synchronized void libraryChanged(String path) { super.libraryChanged(path); removedPaths.add(new Path(path)); } }