http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsLocalSecondaryFileSystemTestAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsLocalSecondaryFileSystemTestAdapter.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsLocalSecondaryFileSystemTestAdapter.java new file mode 100644 index 0000000..12714c4 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsLocalSecondaryFileSystemTestAdapter.java @@ -0,0 +1,141 @@ +/* + * 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.internal.processors.igfs; + +import org.apache.ignite.internal.util.typedef.T2; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.Map; + +/** + * Adapter for local secondary file system. + */ +public class IgfsLocalSecondaryFileSystemTestAdapter implements IgfsSecondaryFileSystemTestAdapter { + /** */ + private final String workDir; + + /** + * @param workDir Work dir. + */ + public IgfsLocalSecondaryFileSystemTestAdapter(final File workDir) { + this.workDir = workDir.getAbsolutePath(); + } + + /** {@inheritDoc} */ + @Override public String name() throws IOException { + return "local"; + } + + /** {@inheritDoc} */ + @Override public boolean exists(final String path) throws IOException { + return Files.exists(path(path)); + } + + /** {@inheritDoc} */ + @Override public boolean delete(final String path, final boolean recursive) throws IOException { + if (recursive) + return deleteRecursively(path(path)); + else + return path(path).toFile().delete(); + } + + /** {@inheritDoc} */ + @Override public void mkdirs(final String path) throws IOException { + Files.createDirectory(path(path)); + } + + /** {@inheritDoc} */ + @Override public void format() throws IOException { + try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(workDir))) { + for (Path innerPath : stream) + deleteRecursively(innerPath); + } + } + + /** {@inheritDoc} */ + @Override public Map<String, String> properties(final String path) throws IOException { + throw new UnsupportedOperationException("properties"); + } + + /** {@inheritDoc} */ + @Override public String permissions(String path) throws IOException { + throw new UnsupportedOperationException("permissions"); + } + + /** {@inheritDoc} */ + @Override public InputStream openInputStream(final String path) throws IOException { + return Files.newInputStream(path(path)); + } + + /** {@inheritDoc} */ + @Override public OutputStream openOutputStream(final String path, final boolean append) throws IOException { + if (append) + return Files.newOutputStream(path(path), StandardOpenOption.APPEND); + else + return Files.newOutputStream(path(path)); + } + + /** {@inheritDoc} */ + @Override public T2<Long, Long> times(String path) throws IOException { + throw new UnsupportedOperationException("times"); + } + + /** {@inheritDoc} */ + @Override public IgfsEx igfs() { + return null; + } + + /** + * Convert path. + * + * @param path String path. + * @return Java File API path. + */ + private Path path(String path) { + return Paths.get(workDir + path); + } + + /** + * Delete recursively. + * + * @param path Path. + * @throws IOException If failed. + */ + private boolean deleteRecursively(Path path) throws IOException { + if (Files.isDirectory(path)) { + try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) { + for (Path innerPath : stream) { + boolean res = deleteRecursively(innerPath); + + if (!res) + return false; + } + } + } + + return path.toFile().delete(); + } +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSecondaryFileSystemTestAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSecondaryFileSystemTestAdapter.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSecondaryFileSystemTestAdapter.java new file mode 100644 index 0000000..fe913df --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSecondaryFileSystemTestAdapter.java @@ -0,0 +1,118 @@ +/* + * 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.internal.processors.igfs; + +import org.apache.ignite.internal.util.typedef.T2; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Map; + +/** + * Universal interface to an underlying filesystem. + * Typically used for secondary filesystem. + * To be used solely in tests. + */ +public interface IgfsSecondaryFileSystemTestAdapter { + /** + * Gets name of the FS. + * @return name of this file system. + * @throws IOException in case of failure. + */ + String name() throws IOException; + + /** + * Answers if a file denoted by path exists. + * @param path path of the file to check. + * @return if the file exists. + * @throws IOException in case of failure. + */ + boolean exists(String path) throws IOException; + + /** + * Deletes a file or directory. + * @param path the path to delete. + * @param recursive instructs to delete a directory recursively. + * @return true on success, false otherwise. + * @throws IOException On failure. + */ + boolean delete(String path, boolean recursive) throws IOException; + + /** + * Makes directories, creating missing parent directories as needed. + * @param path the directory to create. + * @throws IOException On failure. + */ + void mkdirs(String path) throws IOException; + + /** + * Clears (formats) entire the filesystem. + * All the data in the filesystem are DESTROYED. + * @throws IOException On failure. + */ + void format() throws IOException; + + /** + * Gets properties (such as owner, group, and permissions) of a file. + * @param path the path to the file to get properties of. + * @return the properties. + */ + Map<String,String> properties(String path) throws IOException; + + /** + * Get permissions. + * + * @param path Path. + * @return Permissions. + * @throws IOException If failed. + */ + String permissions(String path) throws IOException; + + /** + * Opens input stream to read file contents. + * @param path the path to the file. + */ + InputStream openInputStream(String path) throws IOException; + + /** + * Opens output stream to write file contents. + * @param path the path to the file to be written. + * @param append if to append to the end of existing data. + * @return the OutputStream to write into. + * @throws IOException On failure. + */ + OutputStream openOutputStream(String path, boolean append) throws IOException; + + /** + * Get times for path. + * + * @param path Path. + * @return Times for path. + * @throws IOException If failed. + */ + T2<Long, Long> times(String path) throws IOException; + + /** + * Get underlying IGFS if it is possible. + * + * @return Underlying IGFS or null. + */ + @Nullable IgfsEx igfs(); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/UniversalFileSystemAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/UniversalFileSystemAdapter.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/UniversalFileSystemAdapter.java deleted file mode 100644 index 3f6d07e..0000000 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/UniversalFileSystemAdapter.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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.internal.processors.igfs; - -import org.apache.ignite.internal.util.typedef.T2; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Map; - -/** - * Universal interface to an underlying filesystem. - * Typically used for secondary filesystem. - * To be used solely in tests. - */ -public interface UniversalFileSystemAdapter { - /** - * Gets name of the FS. - * @return name of this file system. - * @throws IOException in case of failure. - */ - String name() throws IOException; - - /** - * Answers if a file denoted by path exists. - * @param path path of the file to check. - * @return if the file exists. - * @throws IOException in case of failure. - */ - boolean exists(String path) throws IOException; - - /** - * Deletes a file or directory. - * @param path the path to delete. - * @param recursive instructs to delete a directory recursively. - * @return true on success, false otherwise. - * @throws IOException On failure. - */ - boolean delete(String path, boolean recursive) throws IOException; - - /** - * Makes directories, creating missing parent directories as needed. - * @param path the directory to create. - * @throws IOException On failure. - */ - void mkdirs(String path) throws IOException; - - /** - * Clears (formats) entire the filesystem. - * All the data in the filesystem are DESTROYED. - * @throws IOException - */ - void format() throws IOException; - - /** - * Gets properties (such as owner, group, and permissions) of a file. - * @param path the path to the file to get properties of. - * @return the properties. - */ - Map<String,String> properties(String path) throws IOException; - - /** - * Opens input stream to read file contents. - * @param path the path to the file. - */ - InputStream openInputStream(String path) throws IOException; - - /** - * Opens output stream to write file contents. - * @param path the path to the file to be written. - * @param append if to append to the end of existing data. - * @return the OutputStream to write into. - * @throws IOException On failure. - */ - OutputStream openOutputStream(String path, boolean append) throws IOException; - - /** - * Get times for path. - * - * @param path Path. - * @return Times for path. - * @throws IOException If failed. - */ - T2<Long, Long> times(String path) throws IOException; - - /** - * Gets an entity of the given type (class) associated with this universal adapter. - * @param clazz The class representing the type we wish to adapt to. - * @param <T> The type we need to adapt to. - * @return the adapter object of the given type. - */ - <T> T unwrap(Class<T> clazz); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteIgfsTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteIgfsTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteIgfsTestSuite.java index dc1379f..44199d4 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteIgfsTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteIgfsTestSuite.java @@ -56,6 +56,10 @@ import org.apache.ignite.internal.processors.igfs.IgfsSizeSelfTest; import org.apache.ignite.internal.processors.igfs.IgfsStartCacheTest; import org.apache.ignite.internal.processors.igfs.IgfsStreamsSelfTest; import org.apache.ignite.internal.processors.igfs.IgfsTaskSelfTest; +import org.apache.ignite.internal.processors.igfs.IgfsLocalSecondaryFileSystemDualAsyncClientSelfTest; +import org.apache.ignite.internal.processors.igfs.IgfsLocalSecondaryFileSystemDualAsyncSelfTest; +import org.apache.ignite.internal.processors.igfs.IgfsLocalSecondaryFileSystemDualSyncClientSelfTest; +import org.apache.ignite.internal.processors.igfs.IgfsLocalSecondaryFileSystemDualSyncSelfTest; import org.apache.ignite.internal.processors.igfs.split.IgfsByteDelimiterRecordResolverSelfTest; import org.apache.ignite.internal.processors.igfs.split.IgfsFixedLengthRecordResolverSelfTest; import org.apache.ignite.internal.processors.igfs.split.IgfsNewLineDelimiterRecordResolverSelfTest; @@ -88,6 +92,11 @@ public class IgniteIgfsTestSuite extends TestSuite { suite.addTest(new TestSuite(IgfsDualSyncSelfTest.class)); suite.addTest(new TestSuite(IgfsDualAsyncSelfTest.class)); + suite.addTest(new TestSuite(IgfsLocalSecondaryFileSystemDualSyncSelfTest.class)); + suite.addTest(new TestSuite(IgfsLocalSecondaryFileSystemDualAsyncSelfTest.class)); + suite.addTest(new TestSuite(IgfsLocalSecondaryFileSystemDualSyncClientSelfTest.class)); + suite.addTest(new TestSuite(IgfsLocalSecondaryFileSystemDualAsyncClientSelfTest.class)); + suite.addTest(new TestSuite(IgfsSizeSelfTest.class)); suite.addTest(new TestSuite(IgfsAttributesSelfTest.class)); suite.addTest(new TestSuite(IgfsFileInfoSelfTest.class)); http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java index 0f17fa2..6b5c776 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java @@ -570,7 +570,7 @@ public class IgniteHadoopIgfsSecondaryFileSystem implements IgfsSecondaryFileSys /** {@inheritDoc} */ @Override public void stop() throws IgniteException { if (fsFactory instanceof LifecycleAware) - ((LifecycleAware)fsFactory).stop(); + ((LifecycleAware)fsFactory).stop(); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/hadoop/src/test/java/org/apache/ignite/igfs/Hadoop1DualAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/igfs/Hadoop1DualAbstractTest.java b/modules/hadoop/src/test/java/org/apache/ignite/igfs/Hadoop1DualAbstractTest.java index 6b83a3e..2c25a06 100644 --- a/modules/hadoop/src/test/java/org/apache/ignite/igfs/Hadoop1DualAbstractTest.java +++ b/modules/hadoop/src/test/java/org/apache/ignite/igfs/Hadoop1DualAbstractTest.java @@ -27,7 +27,6 @@ import org.apache.ignite.hadoop.util.KerberosUserNameMapper; import org.apache.ignite.hadoop.util.UserNameMapper; import org.apache.ignite.igfs.secondary.IgfsSecondaryFileSystem; import org.apache.ignite.internal.processors.igfs.IgfsDualAbstractSelfTest; -import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; import org.apache.ignite.lifecycle.LifecycleAware; import org.jetbrains.annotations.Nullable; @@ -101,7 +100,7 @@ public abstract class Hadoop1DualAbstractTest extends IgfsDualAbstractSelfTest { second.setFileSystemFactory(factory); - igfsSecondary = new HadoopFileSystemUniversalFileSystemAdapter(factory); + igfsSecondary = new HadoopIgfsSecondaryFileSystemTestAdapter(factory); return second; } http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopFileSystemUniversalFileSystemAdapter.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopFileSystemUniversalFileSystemAdapter.java b/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopFileSystemUniversalFileSystemAdapter.java deleted file mode 100644 index 5239054..0000000 --- a/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopFileSystemUniversalFileSystemAdapter.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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.igfs; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.Map; -import org.apache.hadoop.fs.FileStatus; -import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.permission.FsPermission; -import org.apache.ignite.configuration.FileSystemConfiguration; -import org.apache.ignite.hadoop.fs.HadoopFileSystemFactory; -import org.apache.ignite.internal.processors.hadoop.igfs.HadoopIgfsUtils; -import org.apache.ignite.internal.processors.igfs.IgfsUtils; -import org.apache.ignite.internal.processors.igfs.UniversalFileSystemAdapter; -import org.apache.ignite.internal.util.typedef.T2; - -/** - * Universal adapter wrapping {@link org.apache.hadoop.fs.FileSystem} instance. - */ -public class HadoopFileSystemUniversalFileSystemAdapter implements UniversalFileSystemAdapter { - /** File system factory. */ - private final HadoopFileSystemFactory factory; - - /** - * Constructor. - * @param factory File system factory. - */ - public HadoopFileSystemUniversalFileSystemAdapter(HadoopFileSystemFactory factory) { - assert factory != null; - - this.factory = factory; - } - - /** {@inheritDoc} */ - @Override public String name() throws IOException { - return get().getUri().toString(); - } - - /** {@inheritDoc} */ - @Override public boolean exists(String path) throws IOException { - return get().exists(new Path(path)); - } - - /** {@inheritDoc} */ - @Override public boolean delete(String path, boolean recursive) throws IOException { - return get().delete(new Path(path), recursive); - } - - /** {@inheritDoc} */ - @Override public void mkdirs(String path) throws IOException { - boolean ok = get().mkdirs(new Path(path)); - if (!ok) - throw new IOException("Failed to mkdirs: " + path); - } - - /** {@inheritDoc} */ - @Override public void format() throws IOException { - HadoopIgfsUtils.clear(get()); - } - - /** {@inheritDoc} */ - @Override public Map<String, String> properties(String path) throws IOException { - Path p = new Path(path); - - FileStatus status = get().getFileStatus(p); - - Map<String,String> m = new HashMap<>(3); // max size == 4 - - m.put(IgfsUtils.PROP_USER_NAME, status.getOwner()); - m.put(IgfsUtils.PROP_GROUP_NAME, status.getGroup()); - - FsPermission perm = status.getPermission(); - - m.put(IgfsUtils.PROP_PERMISSION, "0" + perm.getUserAction().ordinal() + perm.getGroupAction().ordinal() + - perm.getOtherAction().ordinal()); - - return m; - } - - /** {@inheritDoc} */ - @Override public InputStream openInputStream(String path) throws IOException { - return get().open(new Path(path)); - } - - /** {@inheritDoc} */ - @Override public OutputStream openOutputStream(String path, boolean append) throws IOException { - Path p = new Path(path); - - if (append) - return get().append(p); - else - return get().create(p, true/*overwrite*/); - } - - /** {@inheritDoc} */ - @Override public T2<Long, Long> times(String path) throws IOException { - FileStatus status = get().getFileStatus(new Path(path)); - - return new T2<>(status.getAccessTime(), status.getModificationTime()); - } - - /** {@inheritDoc} */ - @SuppressWarnings("unchecked") - @Override public <T> T unwrap(Class<T> cls) { - if (HadoopFileSystemFactory.class.isAssignableFrom(cls)) - return (T)factory; - - return null; - } - - /** - * Create file system. - * - * @return File system. - * @throws IOException If failed. - */ - private FileSystem get() throws IOException { - return factory.get(FileSystemConfiguration.DFLT_USER_NAME); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/5cf3bea3/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopIgfsSecondaryFileSystemTestAdapter.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopIgfsSecondaryFileSystemTestAdapter.java b/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopIgfsSecondaryFileSystemTestAdapter.java new file mode 100644 index 0000000..f7af6f0 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/igfs/HadoopIgfsSecondaryFileSystemTestAdapter.java @@ -0,0 +1,149 @@ +/* + * 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.igfs; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; +import org.apache.hadoop.fs.FileStatus; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.permission.FsPermission; +import org.apache.ignite.configuration.FileSystemConfiguration; +import org.apache.ignite.hadoop.fs.HadoopFileSystemFactory; +import org.apache.ignite.internal.processors.hadoop.igfs.HadoopIgfsUtils; +import org.apache.ignite.internal.processors.igfs.IgfsEx; +import org.apache.ignite.internal.processors.igfs.IgfsUtils; +import org.apache.ignite.internal.processors.igfs.IgfsSecondaryFileSystemTestAdapter; +import org.apache.ignite.internal.util.typedef.T2; + +/** + * Universal adapter wrapping {@link org.apache.hadoop.fs.FileSystem} instance. + */ +public class HadoopIgfsSecondaryFileSystemTestAdapter implements IgfsSecondaryFileSystemTestAdapter { + /** File system factory. */ + private final HadoopFileSystemFactory factory; + + /** + * Constructor. + * @param factory File system factory. + */ + public HadoopIgfsSecondaryFileSystemTestAdapter(HadoopFileSystemFactory factory) { + assert factory != null; + + this.factory = factory; + } + + /** {@inheritDoc} */ + @Override public String name() throws IOException { + return get().getUri().toString(); + } + + /** {@inheritDoc} */ + @Override public boolean exists(String path) throws IOException { + return get().exists(new Path(path)); + } + + /** {@inheritDoc} */ + @Override public boolean delete(String path, boolean recursive) throws IOException { + return get().delete(new Path(path), recursive); + } + + /** {@inheritDoc} */ + @Override public void mkdirs(String path) throws IOException { + boolean ok = get().mkdirs(new Path(path)); + if (!ok) + throw new IOException("Failed to mkdirs: " + path); + } + + /** {@inheritDoc} */ + @Override public void format() throws IOException { + HadoopIgfsUtils.clear(get()); + } + + /** {@inheritDoc} */ + @Override public Map<String, String> properties(String path) throws IOException { + Path p = new Path(path); + + FileStatus status = get().getFileStatus(p); + + Map<String,String> m = new HashMap<>(3); + + m.put(IgfsUtils.PROP_USER_NAME, status.getOwner()); + m.put(IgfsUtils.PROP_GROUP_NAME, status.getGroup()); + m.put(IgfsUtils.PROP_PERMISSION, permission(status)); + + return m; + } + + /** {@inheritDoc} */ + @Override public String permissions(String path) throws IOException { + return permission(get().getFileStatus(new Path(path))); + } + + /** + * Get permission for file status. + * + * @param status Status. + * @return Permission. + */ + private String permission(FileStatus status) { + FsPermission perm = status.getPermission(); + + return "0" + perm.getUserAction().ordinal() + perm.getGroupAction().ordinal() + perm.getOtherAction().ordinal(); + } + + /** {@inheritDoc} */ + @Override public InputStream openInputStream(String path) throws IOException { + return get().open(new Path(path)); + } + + /** {@inheritDoc} */ + @Override public OutputStream openOutputStream(String path, boolean append) throws IOException { + Path p = new Path(path); + + if (append) + return get().append(p); + else + return get().create(p, true/*overwrite*/); + } + + /** {@inheritDoc} */ + @Override public T2<Long, Long> times(String path) throws IOException { + FileStatus status = get().getFileStatus(new Path(path)); + + return new T2<>(status.getAccessTime(), status.getModificationTime()); + } + + /** {@inheritDoc} */ + @Override public IgfsEx igfs() { + return null; + } + + /** + * Create file system. + * + * @return File system. + * @throws IOException If failed. + */ + protected FileSystem get() throws IOException { + return factory.get(FileSystemConfiguration.DFLT_USER_NAME); + } +} \ No newline at end of file
