/*******************************************************************************
* Copyright (c) 2012-2015 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.api.project.server;
import org.eclipse.che.api.core.notification.EventService;
import org.eclipse.che.api.core.notification.EventSubscriber;
import org.eclipse.che.api.vfs.server.observation.MoveEvent;
import org.eclipse.che.api.vfs.server.observation.RenameEvent;
import org.eclipse.che.api.vfs.server.observation.VirtualFileEvent;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @author andrew00x
*/
@Singleton
@Deprecated
public final class ProjectEventService {
private final EventService eventService;
private final Set<VirtualFileEventSubscriber> subscribers;
@Inject
public ProjectEventService(EventService eventService) {
this.eventService = eventService;
subscribers = new CopyOnWriteArraySet<>();
}
public boolean addListener(String workspace, String project, ProjectEventListener listener) {
final VirtualFileEventSubscriber subscriber = new VirtualFileEventSubscriber(workspace, project, listener);
if (subscribers.add(subscriber)) {
eventService.subscribe(subscriber);
return true;
}
return false;
}
public boolean removeListener(String workspace, String project, ProjectEventListener listener) {
VirtualFileEventSubscriber mySubscriber = null;
for (VirtualFileEventSubscriber subscriber : subscribers) {
if (workspace.equals(subscriber.workspace) && project.equals(subscriber.project) && listener.equals(subscriber.listener)) {
mySubscriber = subscriber;
break;
}
}
if (mySubscriber != null) {
subscribers.remove(mySubscriber);
eventService.unsubscribe(mySubscriber);
return true;
}
return false;
}
private static class VirtualFileEventSubscriber implements EventSubscriber<VirtualFileEvent> {
final String workspace;
final String project;
final ProjectEventListener listener;
String projectPath;
VirtualFileEventSubscriber(String workspace, String project, ProjectEventListener listener) {
this.workspace = workspace;
this.project = project;
this.listener = listener;
projectPath = project;
if (!projectPath.startsWith("/")) {
projectPath = '/' + projectPath;
}
if (!projectPath.endsWith("/")) {
projectPath = projectPath + '/';
}
}
@Override
public void onEvent(VirtualFileEvent event) {
final VirtualFileEvent.ChangeType eventType = event.getType();
final String eventWorkspace = event.getWorkspaceId();
if (workspace.equals(eventWorkspace)) {
final String eventPath = event.getPath();
if (eventPath.startsWith(projectPath)) {
if (eventType == VirtualFileEvent.ChangeType.CONTENT_UPDATED) {
listener.onEvent(new ProjectEvent(ProjectEvent.EventType.UPDATED, workspace, project,
eventPath.substring(projectPath.length()), event.isFolder()));
} else if (eventType == VirtualFileEvent.ChangeType.CREATED) {
listener.onEvent(new ProjectEvent(ProjectEvent.EventType.CREATED, workspace, project,
eventPath.substring(projectPath.length()), event.isFolder()));
} else if (eventType == VirtualFileEvent.ChangeType.DELETED) {
listener.onEvent(new ProjectEvent(ProjectEvent.EventType.DELETED, workspace, project,
eventPath.substring(projectPath.length()), event.isFolder()));
} else if (eventType == VirtualFileEvent.ChangeType.MOVED) {
listener.onEvent(new ProjectEvent(ProjectEvent.EventType.CREATED, workspace, project,
eventPath.substring(projectPath.length()), event.isFolder()));
} else if (eventType == VirtualFileEvent.ChangeType.RENAMED) {
listener.onEvent(new ProjectEvent(ProjectEvent.EventType.CREATED, workspace, project,
eventPath.substring(projectPath.length()), event.isFolder()));
}
}
String eventOldPath = null;
// rename and move are treated as create and delete
if (eventType == VirtualFileEvent.ChangeType.MOVED) {
eventOldPath = ((MoveEvent)event).getOldPath();
} else if (eventType == VirtualFileEvent.ChangeType.RENAMED) {
eventOldPath = ((RenameEvent)event).getOldPath();
}
if (eventOldPath != null && eventOldPath.startsWith(projectPath)) {
listener.onEvent(new ProjectEvent(ProjectEvent.EventType.DELETED, workspace, project,
eventOldPath.substring(projectPath.length()), event.isFolder()));
}
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof VirtualFileEventSubscriber)) {
return false;
}
final VirtualFileEventSubscriber other = (VirtualFileEventSubscriber)o;
return listener.equals(other.listener) && project.equals(other.project) && workspace.equals(other.workspace);
}
@Override
public int hashCode() {
int hashCode = 7;
hashCode = 31 * hashCode + workspace.hashCode();
hashCode = 31 * hashCode + project.hashCode();
hashCode = 31 * hashCode + listener.hashCode();
return hashCode;
}
}
}