/******************************************************************************* * 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.java.server; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.model.project.ProjectConfig; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.notification.EventSubscriber; import org.eclipse.che.api.project.server.ProjectCreatedEvent; import org.eclipse.che.api.project.server.ProjectRegistry; import org.eclipse.che.api.project.server.notification.ProjectItemModifiedEvent; import org.eclipse.che.api.project.server.type.ProjectTypeRegistry; import org.eclipse.che.jdt.core.resources.ResourceChangedEvent; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.ITextFileBuffer; import org.eclipse.core.filebuffers.ITextFileBufferManager; import org.eclipse.core.filebuffers.LocationKind; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.internal.core.JavaModelManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; /** * @author Evgen Vidolob */ @Singleton public class ProjectListeners { private static final Logger LOG = LoggerFactory.getLogger(ProjectListeners.class); private final File workspace; private final ProjectRegistry projectRegistry; private final ProjectTypeRegistry projectTypeRegistry; @Inject public ProjectListeners(@Named("che.user.workspaces.storage") String workspacePath, EventService eventService, ProjectRegistry projectRegistry, ProjectTypeRegistry projectTypeRegistry) { this.projectRegistry = projectRegistry; this.projectTypeRegistry = projectTypeRegistry; workspace = new File(workspacePath); eventService.subscribe(new ProjectCreated()); eventService.subscribe(new EventSubscriber<ProjectItemModifiedEvent>() { @Override public void onEvent(ProjectItemModifiedEvent event) { handleEvent(event); } }); } public void handleEvent(ProjectItemModifiedEvent event) { final String eventPath = event.getPath(); if (!isJavaProject(event.getProject())) { return; } try { JavaModelManager.getJavaModelManager().deltaState.resourceChanged( new ResourceChangedEvent(workspace, event)); } catch (Throwable t) { //catch all exceptions that may be happened LOG.error("Can't update java model in " + eventPath, t); } if (event.getType() == ProjectItemModifiedEvent.EventType.UPDATED) { ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager(); ITextFileBuffer fileBuffer = manager.getTextFileBuffer(new Path(eventPath), LocationKind.IFILE); if (fileBuffer != null) { try { fileBuffer.revert(new NullProgressMonitor()); } catch (CoreException e) { LOG.error("Can't read file content: " + eventPath, e); } } } } private class ProjectCreated implements EventSubscriber<ProjectCreatedEvent> { @Override public void onEvent(ProjectCreatedEvent event) { if (!isJavaProject(event.getProjectPath())) { return; } try { JavaModelManager.getJavaModelManager().deltaState.resourceChanged(new ResourceChangedEvent(workspace, event)); } catch (Throwable t) { //catch all exceptions that may be happened LOG.error("Can't update java model " + event.getProjectPath(), t); } } } private boolean isJavaProject(String projectPath) { ProjectConfig project = projectRegistry.getProject(projectPath); String type = project.getType(); try { return projectTypeRegistry.getProjectType(type).isTypeOf("java"); } catch (NotFoundException e) { LOG.error("Can't find project " + projectPath, e); return false; } } }