blob: e916cfa36e5dd9182554d6f0096cfc56ecfa06bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.camel.component.box.api;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import com.box.sdk.BoxAPIConnection;
import com.box.sdk.BoxAPIException;
import com.box.sdk.BoxFolder;
import com.box.sdk.BoxItem;
import com.box.sdk.BoxSharedLink;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Box Folders Manager
*
* <p>
* Provides operations to manage Box folders.
*
*
*
*/
public class BoxFoldersManager {
private static final Logger LOG = LoggerFactory.getLogger(BoxFoldersManager.class);
/**
* Box connection to authenticated user account.
*/
private BoxAPIConnection boxConnection;
/**
* Create folder manager to manage folders of Box connection's authenticated
* user.
*
* @param boxConnection
* - Box connection to authenticated user account.
*/
public BoxFoldersManager(BoxAPIConnection boxConnection) {
this.boxConnection = boxConnection;
}
/**
* Return the root folder of authenticated user.
*
* @return The root folder of authenticated user.
*/
public BoxFolder getRootFolder() {
try {
LOG.debug("Getting root folder");
return BoxFolder.getRootFolder(boxConnection);
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Return the Box folder referenced by <code>path</code>.
*
* @param path
* - Sequence of Box folder names from root folder to returned
* folder.
*
* @return The Box folder referenced by <code>path</code> or
* <code>null</code> if folder is not found.
*/
public BoxFolder getFolder(String... path) {
try {
LOG.debug("Getting folder at path={}", Arrays.toString(path));
BoxFolder folder = BoxFolder.getRootFolder(boxConnection);
if (path == null || path.length == 0) {
// Return root folder if path is null or empty.
return folder;
}
searchPath: for (int folderIndex = 0; folderIndex < path.length; folderIndex++) {
for (BoxItem.Info itemInfo : folder) {
if (itemInfo instanceof BoxFolder.Info && itemInfo.getName().equals(path[folderIndex])) {
folder = (BoxFolder) itemInfo.getResource();
continue searchPath;
}
}
// Failed to find named folder in path: return null
return null;
}
return folder;
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Returns a specific range of child items in folder and specifies which
* fields of each item to retrieve.
*
* @param folderId
* - the id of folder.
* @param offset
* - the index of first child item to retrieve; if
* <code>null</code> all child items are retrieved.
* @param limit
* - the maximum number of children to retrieve after the offset;
* if <code>null</code> all child items are retrieved.
* @param fields
* - the item fields to retrieve for each child item; if
* <code>null</code> all item fields are retrieved.
* @return The Items in folder
*/
public Collection<BoxItem.Info> getFolderItems(String folderId, Long offset, Long limit, String... fields) {
try {
LOG.debug("Getting folder items in folder(id=" + folderId + ") at offset=" + offset + " and limit=" + limit
+ " with fields=" + Arrays.toString(fields));
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
BoxFolder folder = new BoxFolder(boxConnection, folderId);
if (fields == null) {
fields = new String[0];
}
if (offset != null && limit != null) {
return folder.getChildrenRange(offset, limit, fields);
} else {
Collection<BoxItem.Info> folderItems = new ArrayList<>();
Iterable<BoxItem.Info> iterable;
if (fields.length > 0) {
iterable = folder.getChildren(fields);
} else {
iterable = folder.getChildren();
}
for (BoxItem.Info itemInfo : iterable) {
folderItems.add(itemInfo);
}
return folderItems;
}
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Create a folder in parent folder with given <code>parentFolderId</code>.
*
* @param parentFolderId
* - the id of parent folder.
* @param folderName
* the name of created folder.
* @return The created folder.
*/
public BoxFolder createFolder(String parentFolderId, String folderName) {
try {
LOG.debug("Creating folder with name '" + folderName + "' in parent_folder(id=" + parentFolderId + ")");
if (parentFolderId == null) {
throw new IllegalArgumentException("Parameter 'parentFolderId' can not be null");
}
if (folderName == null) {
throw new IllegalArgumentException("Paramerer 'folderName' can not be null");
}
BoxFolder parentFolder = new BoxFolder(boxConnection, parentFolderId);
return parentFolder.createFolder(folderName).getResource();
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Create a folder specified by path from parent folder with given <code>parentFolderId</code>,
* creating intermediate directories as required.
*
* @param parentFolderId
* - the id of parent folder.
* @param path
* - Sequence of Box folder names from parent folder to returned
* folder.
* @return The last folder in path, no fault will be thrown if it already exists.
*/
public BoxFolder createFolder(String parentFolderId, String... path) {
try {
LOG.debug("Creating folder with path '" + Arrays.toString(path) + "' in parent_folder(id=" + parentFolderId + ")");
if (parentFolderId == null) {
throw new IllegalArgumentException("Parameter 'parentFolderId' can not be null");
}
if (path == null) {
throw new IllegalArgumentException("Paramerer 'path' can not be null");
}
BoxFolder folder = new BoxFolder(boxConnection, parentFolderId);
searchPath: for (int folderIndex = 0; folderIndex < path.length; folderIndex++) {
for (BoxItem.Info itemInfo : folder) {
if (itemInfo instanceof BoxFolder.Info && itemInfo.getName().equals(path[folderIndex])) {
folder = (BoxFolder) itemInfo.getResource();
continue searchPath;
}
}
folder = folder.createFolder(path[folderIndex]).getResource();
}
return folder;
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Copy folder to destination folder while optionally giving it a new name.
*
* @param folderId
* - the id of folder to copy.
* @param destinationFolderId
* - the id of the destination folder.
* @param newName
* - the new name for copied folder; if <code>newName</code> is
* <code>null</code>, the copied folder has same name as the
* original.
* @return The copied folder.
*/
public BoxFolder copyFolder(String folderId, String destinationFolderId, String newName) {
try {
LOG.debug("Copying folder(id=" + folderId + ") to destination_folder(id=" + destinationFolderId + ")"
+ (newName == null ? "" : " with new name '" + newName + "'"));
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
if (destinationFolderId == null) {
throw new IllegalArgumentException("Parameter 'destinationFolderId' can not be null");
}
BoxFolder folderToCopy = new BoxFolder(boxConnection, folderId);
BoxFolder destinationFolder = new BoxFolder(boxConnection, destinationFolderId);
if (newName == null) {
return folderToCopy.copy(destinationFolder).getResource();
} else {
return folderToCopy.copy(destinationFolder, newName).getResource();
}
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Move folder to destination folder while optionally giving it a new name.
*
* @param folderId
* - the id of folder to move.
* @param destinationFolderId
* - the id of the destination folder.
* @param newName
* - the new name of moved folder; if <code>newName</code> is
* <code>null</code>, the moved folder has same name as the
* original.
* @return The moved folder.
*/
public BoxFolder moveFolder(String folderId, String destinationFolderId, String newName) {
try {
LOG.debug("Moving folder(id=" + folderId + ") to destination_folder(id=" + destinationFolderId + ")"
+ (newName == null ? "" : " with new name '" + newName + "'"));
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
if (destinationFolderId == null) {
throw new IllegalArgumentException("Parameter 'destinationFolderId' can not be null");
}
BoxFolder folderToMove = new BoxFolder(boxConnection, folderId);
BoxFolder destinationFolder = new BoxFolder(boxConnection, destinationFolderId);
if (newName == null) {
return (BoxFolder) folderToMove.move(destinationFolder).getResource();
} else {
return (BoxFolder) folderToMove.move(destinationFolder, newName).getResource();
}
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Rename folder giving it the name <code>newName</code>
*
* @param folderId
* - the id of folder to rename.
* @param newFolderName
* - the new name of folder.
* @return The renamed folder.
*/
public BoxFolder renameFolder(String folderId, String newFolderName) {
try {
LOG.debug("Renaming folder(id=" + folderId + ") to '" + newFolderName + "'");
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
if (newFolderName == null) {
throw new IllegalArgumentException("Parameter 'newFolderName' can not be null");
}
BoxFolder folderToRename = new BoxFolder(boxConnection, folderId);
folderToRename.rename(newFolderName);
return folderToRename;
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Delete folder.
*
* @param folderId
* - the id of folder to delete.
*/
public void deleteFolder(String folderId) {
try {
LOG.debug("Deleting folder(id={})", folderId);
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
BoxFolder folder = new BoxFolder(boxConnection, folderId);
folder.delete(true);
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Get folder information.
*
* @param folderId
* - the id of folder.
* @param fields
* - the information fields to retrieve; if <code>null</code> all
* information fields are retrieved.
* @return The folder information.
*/
public BoxFolder.Info getFolderInfo(String folderId, String... fields) {
try {
LOG.debug("Getting info for folder(id={})", folderId);
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
BoxFolder folder = new BoxFolder(boxConnection, folderId);
if (fields == null || fields.length == 0) {
return folder.getInfo();
} else {
return folder.getInfo(fields);
}
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Update folder information.
*
* @param folderId
* - the id of folder to update.
* @param info
* - the updated information
* @return The updated folder.
*/
public BoxFolder updateFolderInfo(String folderId, BoxFolder.Info info) {
try {
LOG.debug("Updating info for folder(id={})", folderId);
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
if (info == null) {
throw new IllegalArgumentException("Parameter 'info' can not be null");
}
BoxFolder folder = new BoxFolder(boxConnection, folderId);
folder.updateInfo(info);
return folder;
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
/**
* Create a shared link to folder.
*
* @param folderId
* - the id of folder to create shared link on.
* @param access
* - the access level of the shared link.
* @param unshareDate
* - the date and time at which time the created shared link will
* expire; if <code>unsharedDate</code> is <code>null</code> then
* a non-expiring link is created.
* @param permissions
* - the permissions of the created link; if
* <code>permissions</code> is <code>null</code> then the created
* shared link is create with default permissions.
* @return The created shared link.
*/
public BoxSharedLink createFolderSharedLink(String folderId, BoxSharedLink.Access access, Date unshareDate,
BoxSharedLink.Permissions permissions) {
try {
LOG.debug("Creating shared link for folder(id=" + folderId + ") with access=" + access
+ (unshareDate == null ? ""
: " unsharedDate=" + DateFormat.getDateTimeInstance().format(unshareDate)
+ " permissions=" + permissions));
if (folderId == null) {
throw new IllegalArgumentException("Parameter 'folderId' can not be null");
}
if (access == null) {
throw new IllegalArgumentException("Parameter 'access' can not be null");
}
BoxFolder folder = new BoxFolder(boxConnection, folderId);
return folder.createSharedLink(access, unshareDate, permissions);
} catch (BoxAPIException e) {
throw new RuntimeException(
String.format("Box API returned the error code %d\n\n%s", e.getResponseCode(), e.getResponse()), e);
}
}
}