/******************************************************************************* * 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.api.project.server; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.model.project.ProjectConfig; import java.util.ArrayList; import java.util.List; /** * Synchronizer for Project Configurations stored in Workspace Configuration with Agent's state * * @author gazarenkov */ public abstract class WorkspaceProjectsSyncer { /** * Synchronizes Project Config state on Agent and Master * @param projectRegistry project registry * @throws ServerException */ public final void sync(ProjectRegistry projectRegistry) throws ServerException { List<? extends ProjectConfig> remote = getProjects(); // check on removed List <ProjectConfig> removed = new ArrayList<>(); for(ProjectConfig r : remote) { if(projectRegistry.getProject(r.getPath()) == null) removed.add(r); } for(ProjectConfig r : removed) removeProject(r); // update or add for(RegisteredProject project : projectRegistry.getProjects()) { if(!project.isSynced() && !project.isDetected()) { final ProjectConfig config = new NewProjectConfigImpl(project.getPath(), project.getType(), project.getMixins(), project.getName(), project.getDescription(), project.getPersistableAttributes(), null, project.getSource()); boolean found = false; for(ProjectConfig r : remote) { if(r.getPath().equals(project.getPath())) { updateProject(config); found = true; } } if(!found) addProject(config); project.setSync(); } } } /** * @return projects from Workspace Config * @throws ServerException */ public abstract List<? extends ProjectConfig> getProjects() throws ServerException; /** * @return workspace ID */ public abstract String getWorkspaceId(); /** * Adds project to Workspace Config * @param project the project config * @throws ServerException */ protected abstract void addProject(ProjectConfig project) throws ServerException; /** * Updates particular project in Workspace Config * @param project the project config * @throws ServerException */ protected abstract void updateProject(ProjectConfig project) throws ServerException; /** * Removes particular project in Workspace Config * @param project the project config * @throws ServerException */ protected abstract void removeProject(ProjectConfig project) throws ServerException; }