/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.maven.server.core.project; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.notification.EventSubscriber; import org.eclipse.che.api.project.server.notification.ProjectItemModifiedEvent; import org.eclipse.che.api.project.shared.dto.event.PomModifiedEventDto; import org.eclipse.che.commons.schedule.executor.ThreadPullLauncher; import org.eclipse.che.ide.maven.tools.Model; import org.eclipse.che.plugin.maven.server.core.EclipseWorkspaceProvider; import org.eclipse.che.plugin.maven.server.core.MavenWorkspace; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.internal.ui.JavaPlugin; import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * @author Evgen Vidolob */ @Singleton public class PomChangeListener { private final MavenWorkspace mavenWorkspace; private final EclipseWorkspaceProvider eclipseWorkspaceProvider; private final String workspacePath; private CopyOnWriteArraySet<String> projectToUpdate = new CopyOnWriteArraySet<>(); @Inject public PomChangeListener(EventService eventService, MavenWorkspace mavenWorkspace, EclipseWorkspaceProvider eclipseWorkspaceProvider, ThreadPullLauncher launcher, @Named("che.user.workspaces.storage") String workspacePath) { this.mavenWorkspace = mavenWorkspace; this.eclipseWorkspaceProvider = eclipseWorkspaceProvider; this.workspacePath = workspacePath; launcher.scheduleWithFixedDelay(this::updateProms, 20, 3, TimeUnit.SECONDS); eventService.subscribe(new EventSubscriber<ProjectItemModifiedEvent>() { @Override public void onEvent(ProjectItemModifiedEvent event) { String eventPath = event.getPath(); if (!event.isFolder() && eventPath.endsWith("pom.xml")) { //TODO update only pom file that in root of project // if(event.getProject().equals(eventPath.substring(0, eventPath.lastIndexOf("pom.xml") - 1))) { if (pomIsValid(eventPath)) { projectToUpdate.add(new Path(eventPath).removeLastSegments(1).toOSString()); } // } } } }); eventService.subscribe(new EventSubscriber<PomModifiedEventDto>() { @Override public void onEvent(PomModifiedEventDto event) { String eventPath = event.getPath(); if (pomIsValid(eventPath)) { projectToUpdate.add(new Path(eventPath).removeLastSegments(1).toOSString()); } } }); } private boolean pomIsValid(String path) { try { Model.readFrom(new File(workspacePath, path)); } catch (Exception e) { JavaPlugin.log(e); return false; } return true; } // @ScheduleDelay(initialDelay = 30, delay = 3) protected void updateProms() { try { if (projectToUpdate.size() == 0) { return; } Set<String> projects = new HashSet<>(projectToUpdate); projectToUpdate.clear(); IWorkspace workspace = eclipseWorkspaceProvider.get(); List<IProject> projectsList = projects.stream().map(project -> workspace.getRoot().getProject(project)).collect(Collectors.toList()); mavenWorkspace.update(projectsList); } catch (Throwable t) { JavaPlugin.log(t); } } }