/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.stunner.bpmn.backend.legacy.repository;
import java.util.Collection;
import org.uberfire.java.nio.file.NoSuchFileException;
/**
* Repository is responsible for managing its components that are as follows:
* <ul>
* <li>Asset - component that can be of any type and is stored in a custom location</li>
* </ul>
*/
public interface Repository {
/**
* Returns name used to identify this repository.
*/
public String getName();
/**
* Retrieves all directories stored under <code>startAt</code> location.
* NOTE: Directory should be always relative to the repository root
* @param startAt - location where directories should be fetched from
* @return - list of directories
*/
Collection<Directory> listDirectories(String startAt);
/**
* Retrieves all directories stored under <code>startAt</code> location including all sub folders.
* NOTE: Directory should be always relative to the repository root
* @param startAt - location where directories should be fetched from
* @param filter - filter that allows to narrow the results
* @return - list of assets found
*/
Collection<Asset> listAssetsRecursively(String startAt,
Filter filter);
/**
* Stores new directory in given location, in case of sub folders existence in the location
* all sub folders are created as well.
* @param location - location in the repository to be created
* @return - returns identifier of the new directory
*/
Directory createDirectory(String location);
/**
* Examines repository if given directory exists in the repository
* NOTE: Directory should be always relative to the repository root
* @param directory - directory to check
* @return - true if and only if given directory exists
*/
boolean directoryExists(String directory);
/**
* Deletes directory from repository including its content
* NOTE: Directory should be always relative to the repository root
* @param directory - directory to be deleted
* @param failIfNotEmpty - indicates if delete operation should fail in case given directory is not empty
*/
boolean deleteDirectory(String directory,
boolean failIfNotEmpty);
/**
* Copy directory given by <code>uniqueId</code> into destination given by <code>location</code>
* @param sourceDirectory - source directory path relative to repository root
* @param location - destination where directory will be copied to
* @return - true when copy operation was successful otherwise false
*/
boolean copyDirectory(String sourceDirectory,
String location);
/**
* Moves directory given by <code>uniqueId</code> into destination given by <code>location</code>
* and renames it with given <code>name</code>
* @param sourceDirectory - source directory path relative to repository root
* @param location - final destination where directory should be moved to
* @param name - name of the directory after move, if null is given name is not changed
* @return - returns true if move operation was successful otherwise false
*/
boolean moveDirectory(String sourceDirectory,
String location,
String name);
/**
* Retrieves all assets stored in the given location.
* NOTE: This will not load the actual content of the asset but only its meta data
* @param location - location that assets should be collected from
* @return - list of available assets
*/
Collection<Asset> listAssets(String location);
/**
* Retrieves all assets stored in the given location.
* NOTE: This will not load the actual content of the asset but only its meta data
* @param location - location that assets should be collected from
* @param filter - allows to defined filter criteria to fetch only assets of interest
* @return - list of available assets
*/
Collection<Asset> listAssets(String location,
Filter filter);
/**
* Loads an asset given by the <code>assetUniqueId</code> including actual content of the asset.
* @param assetUniqueId - unique identifier of the asset to load
* @return return loaded asset including content
* @throws NoSuchFileException - throws in case of asset given by id does not exist
*/
Asset loadAsset(String assetUniqueId) throws NoSuchFileException;
/**
* Loads an asset given by the <code>path</code> including actual content of the asset.
* @param path - complete path of the asset to load (relative to the repository root)
* @return return loaded asset including content
* @throws NoSuchFileException - throws in case of asset given by id does not exist
*/
Asset loadAssetFromPath(String path) throws NoSuchFileException;
/**
* Stores given asset in the repository. <code>asset</code> need to have all meta data and content available
* for the operation to successfully complete.
* @param asset - asset to be stored
* @return returns asset unique identifier that can be used to locate it
*/
String createAsset(Asset asset);
/**
* Updates content of the asset
* @param asset - asset to be stored with new content in it, all other data (like name, location) should be same
* @return - returns uniqueId of the asset
* @throws NoSuchFileException - throws in case of asset given by id does not exist
*/
String updateAsset(Asset asset,
String commitMessage,
String sessionId) throws NoSuchFileException;
/**
* Deletes asset from repository identified by <code>assetUniqueId</code> if exists
* @param assetUniqueId - unique identifier of the asset
* @return return true if and only if operation completed successfully otherwise false
*/
boolean deleteAsset(String assetUniqueId);
/**
* Deletes asset from repository given by the <code>path</code> if exists
* @param path - complete path of the asset to delete
* @return return true if and only if operation completed successfully otherwise false
*/
boolean deleteAssetFromPath(String path);
/**
* Examines repository if asset given by the <code>assetUniqueId</code> exists
* @param assetUniqueId - unique identifier of the asset
* @return true if and only if asset exists otherwise false
*/
boolean assetExists(String assetUniqueId);
/**
* Copy asset given by <code>uniqueId</code> into destination given by <code>location</code>
* @param uniqueId - source asset unique id
* @param location - destination where asset will be copied to
* @return - true when copy operation was successful otherwise false
*/
boolean copyAsset(String uniqueId,
String location);
/**
* Moves asset given by <code>uniqueId</code> into destination given by <code>location</code>
* and renames it with given <code>name</code>
* @param uniqueId - source asset unique id
* @param location - final destination where asset should be moved to
* @param name - name of the asset after move, if null is given name is not changed
* @return - returns true if move operation was successful otherwise false
*/
boolean moveAsset(String uniqueId,
String location,
String name);
}