blob: e2ef3f24cb5ee1dbc648d40c47f0a0041c33602f [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.ignite.examples.igfs;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collection;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteFileSystem;
import org.apache.ignite.Ignition;
import org.apache.ignite.igfs.IgfsException;
import org.apache.ignite.igfs.IgfsInputStream;
import org.apache.ignite.igfs.IgfsPath;
import org.jetbrains.annotations.Nullable;
/**
* Example that shows usage of {@link org.apache.ignite.IgniteFileSystem} API. It starts a node with {@code IgniteFs}
* configured and performs several file system operations (create, write, append, read and delete
* files, create, list and delete directories).
* <p>
* Remote nodes should always be started with configuration file which includes
* IGFS: {@code 'ignite.sh examples/config/filesystem/example-igfs.xml'}.
* <p>
* Alternatively you can run {@link IgfsNodeStartup} in another JVM which will start
* node with {@code examples/config/filesystem/example-igfs.xml} configuration.
*/
public final class IgfsExample {
/**
* Executes example.
*
* @param args Command line arguments, none required.
* @throws Exception If example execution failed.
*/
public static void main(String[] args) throws Exception {
Ignite ignite = Ignition.start("examples/config/filesystem/example-igfs.xml");
System.out.println();
System.out.println(">>> IGFS example started.");
try {
// Get an instance of Ignite File System.
IgniteFileSystem fs = ignite.fileSystem("igfs");
// Working directory path.
IgfsPath workDir = new IgfsPath("/examples/fs");
// Cleanup working directory.
delete(fs, workDir);
// Create empty working directory.
mkdirs(fs, workDir);
// Print information for working directory.
printInfo(fs, workDir);
// File path.
IgfsPath filePath = new IgfsPath(workDir, "file.txt");
// Create file.
create(fs, filePath, new byte[] {1, 2, 3});
// Print information for file.
printInfo(fs, filePath);
// Append more data to previously created file.
append(fs, filePath, new byte[] {4, 5});
// Print information for file.
printInfo(fs, filePath);
// Read data from file.
read(fs, filePath);
// Delete file.
delete(fs, filePath);
// Print information for file.
printInfo(fs, filePath);
// Create several files.
for (int i = 0; i < 5; i++)
create(fs, new IgfsPath(workDir, "file-" + i + ".txt"), null);
list(fs, workDir);
}
finally {
Ignition.stop(false);
}
}
/**
* Deletes file or directory. If directory
* is not empty, it's deleted recursively.
*
* @param fs IGFS.
* @param path File or directory path.
* @throws IgniteException In case of error.
*/
private static void delete(IgniteFileSystem fs, IgfsPath path) throws IgniteException {
assert fs != null;
assert path != null;
if (fs.exists(path)) {
boolean isFile = fs.info(path).isFile();
try {
fs.delete(path, true);
System.out.println();
System.out.println(">>> Deleted " + (isFile ? "file" : "directory") + ": " + path);
}
catch (IgfsException e) {
System.out.println();
System.out.println(">>> Failed to delete " + (isFile ? "file" : "directory") + " [path=" + path +
", msg=" + e.getMessage() + ']');
}
}
else {
System.out.println();
System.out.println(">>> Won't delete file or directory (doesn't exist): " + path);
}
}
/**
* Creates directories.
*
* @param fs IGFS.
* @param path Directory path.
* @throws IgniteException In case of error.
*/
private static void mkdirs(IgniteFileSystem fs, IgfsPath path) throws IgniteException {
assert fs != null;
assert path != null;
try {
fs.mkdirs(path);
System.out.println();
System.out.println(">>> Created directory: " + path);
}
catch (IgfsException e) {
System.out.println();
System.out.println(">>> Failed to create a directory [path=" + path + ", msg=" + e.getMessage() + ']');
}
System.out.println();
}
/**
* Creates file and writes provided data to it.
*
* @param fs IGFS.
* @param path File path.
* @param data Data.
* @throws IgniteException If file can't be created.
* @throws IOException If data can't be written.
*/
private static void create(IgniteFileSystem fs, IgfsPath path, @Nullable byte[] data)
throws IgniteException, IOException {
assert fs != null;
assert path != null;
try (OutputStream out = fs.create(path, true)) {
System.out.println();
System.out.println(">>> Created file: " + path);
if (data != null) {
out.write(data);
System.out.println();
System.out.println(">>> Wrote data to file: " + path);
}
}
System.out.println();
}
/**
* Opens file and appends provided data to it.
*
* @param fs IGFS.
* @param path File path.
* @param data Data.
* @throws IgniteException If file can't be created.
* @throws IOException If data can't be written.
*/
private static void append(IgniteFileSystem fs, IgfsPath path, byte[] data) throws IgniteException, IOException {
assert fs != null;
assert path != null;
assert data != null;
assert fs.info(path).isFile();
try (OutputStream out = fs.append(path, true)) {
System.out.println();
System.out.println(">>> Opened file: " + path);
out.write(data);
}
System.out.println();
System.out.println(">>> Appended data to file: " + path);
}
/**
* Opens file and reads it to byte array.
*
* @param fs IgniteFs.
* @param path File path.
* @throws IgniteException If file can't be opened.
* @throws IOException If data can't be read.
*/
private static void read(IgniteFileSystem fs, IgfsPath path) throws IgniteException, IOException {
assert fs != null;
assert path != null;
assert fs.info(path).isFile();
byte[] data = new byte[(int)fs.info(path).length()];
try (IgfsInputStream in = fs.open(path)) {
in.read(data);
}
System.out.println();
System.out.println(">>> Read data from " + path + ": " + Arrays.toString(data));
}
/**
* Lists files in directory.
*
* @param fs IGFS.
* @param path Directory path.
* @throws IgniteException In case of error.
*/
private static void list(IgniteFileSystem fs, IgfsPath path) throws IgniteException {
assert fs != null;
assert path != null;
assert fs.info(path).isDirectory();
Collection<IgfsPath> files = fs.listPaths(path);
if (files.isEmpty()) {
System.out.println();
System.out.println(">>> No files in directory: " + path);
}
else {
System.out.println();
System.out.println(">>> List of files in directory: " + path);
for (IgfsPath f : files)
System.out.println(">>> " + f.name());
}
System.out.println();
}
/**
* Prints information for file or directory.
*
* @param fs IGFS.
* @param path File or directory path.
* @throws IgniteException In case of error.
*/
private static void printInfo(IgniteFileSystem fs, IgfsPath path) throws IgniteException {
System.out.println();
System.out.println("Information for " + path + ": " + fs.info(path));
}
}