/******************************************************************************* * 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.vfs; import org.eclipse.che.api.core.ServerException; import java.util.concurrent.atomic.AtomicReference; public abstract class AbstractVirtualFileSystemProvider implements VirtualFileSystemProvider { protected final AtomicReference<VirtualFileSystem> fileSystemReference = new AtomicReference<>(); @Override public VirtualFileSystem getVirtualFileSystem(boolean create) throws ServerException { VirtualFileSystem fileSystem = fileSystemReference.get(); if (fileSystem == null && create) { VirtualFileSystem newFileSystem = createVirtualFileSystem(() -> fileSystemReference.set(null)); fileSystemReference.compareAndSet(null, newFileSystem); fileSystem = fileSystemReference.get(); } return fileSystem; } @Override public VirtualFileSystem getVirtualFileSystem() throws ServerException { return getVirtualFileSystem(true); } protected abstract VirtualFileSystem createVirtualFileSystem(CloseCallback closeCallback) throws ServerException; @Override public void close() throws ServerException { VirtualFileSystem virtualFileSystem = fileSystemReference.get(); if (virtualFileSystem != null) { virtualFileSystem.close(); } fileSystemReference.set(null); } public interface CloseCallback { void onClose(); } }