http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/2529a4c3/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpErrorStatusDataHandler.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpErrorStatusDataHandler.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpErrorStatusDataHandler.java
new file mode 100644
index 0000000..1498ba2
--- /dev/null
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpErrorStatusDataHandler.java
@@ -0,0 +1,83 @@
+/*
+ * 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.sshd.server.subsystem.sftp;
+
+import org.apache.sshd.common.subsystem.sftp.SftpHelper;
+
+/**
+ * Invoked in order to format failed commands messages
+ *
+ * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
+ */
+public interface SftpErrorStatusDataHandler {
+    SftpErrorStatusDataHandler DEFAULT = new SftpErrorStatusDataHandler() {
+        @Override
+        public String toString() {
+            return SftpErrorStatusDataHandler.class.getSimpleName() + 
"[DEFAULT]";
+        }
+    };
+
+    /**
+     * @param sftpSubsystem The SFTP subsystem instance
+     * @param id The command identifier
+     * @param e Thrown exception
+     * @param cmd The command that was attempted
+     * @param args The relevant command arguments - <B>Note:</B> provided only 
for
+     * <U>logging</U> purposes and subject to type and/or order change at any 
version
+     * @return The relevant sub-status to send as failure indication for the 
failed command
+     * @see SftpHelper#resolveSubstatus(Throwable)
+     */
+    default int resolveSubStatus(SftpSubsystemEnvironment sftpSubsystem, int 
id, Throwable e, int cmd, Object... args) {
+        return SftpHelper.resolveSubstatus(e);
+    }
+
+    /**
+     * @param sftpSubsystem The SFTP subsystem instance
+     * @param id The command identifier
+     * @param e Thrown exception
+     * @param subStatus The sub-status code obtained from invocation of
+     * {@link #resolveSubStatus(SftpSubsystemEnvironment, int, Throwable, int, 
Object...) resolveSubStatus}
+     * @param cmd The command that was attempted
+     * @param args The relevant command arguments - <B>Note:</B> provided only 
for
+     * <U>logging</U> purposes and subject to type and/or order change at any 
version
+     * @return The human readable text message that explains the failure reason
+     * @see SftpHelper#resolveStatusMessage(int)
+     */
+    default String resolveErrorMessage(
+            SftpSubsystemEnvironment sftpSubsystem, int id, Throwable e, int 
subStatus, int cmd, Object... args) {
+        return SftpHelper.resolveStatusMessage(subStatus);
+    }
+
+    /**
+     * @param sftpSubsystem The SFTP subsystem instance
+     * @param id The command identifier
+     * @param e Thrown exception
+     * @param subStatus The sub-status code obtained from invocation of
+     * {@link #resolveSubStatus(SftpSubsystemEnvironment, int, Throwable, int, 
Object...) resolveSubStatus}
+     * @param cmd The command that was attempted
+     * @param args The relevant command arguments - <B>Note:</B> provided only 
for
+     * <U>logging</U> purposes and subject to type and/or order change at any 
version
+     * @return The error message language tag - recommend returning empty 
string
+     */
+    default String resolveErrorLanguage(
+            SftpSubsystemEnvironment sftpSubsystem, int id, Throwable e, int 
subStatus, int cmd, Object... args) {
+        return "";
+    }
+}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/2529a4c3/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessor.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessor.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessor.java
index 8d4499e..86aa670 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessor.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessor.java
@@ -30,14 +30,36 @@ import java.nio.file.Files;
 import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.nio.file.attribute.FileAttribute;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
+import org.apache.sshd.common.util.GenericUtils;
+import org.apache.sshd.common.util.io.FileInfoExtractor;
 import org.apache.sshd.server.session.ServerSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public interface SftpFileSystemAccessor {
+    List<String> DEFAULT_UNIX_VIEW = Collections.singletonList("unix:*");
+
+    /**
+     * A {@link Map} of {@link FileInfoExtractor}s to be used to complete
+     * attributes that are deemed important enough to warrant an extra
+     * effort if not accessible via the file system attributes views
+     */
+    Map<String, FileInfoExtractor<?>> FILEATTRS_RESOLVERS =
+            GenericUtils.<String, 
FileInfoExtractor<?>>mapBuilder(String.CASE_INSENSITIVE_ORDER)
+                .put("isRegularFile", FileInfoExtractor.ISREG)
+                .put("isDirectory", FileInfoExtractor.ISDIR)
+                .put("isSymbolicLink", FileInfoExtractor.ISSYMLINK)
+                .put("permissions", FileInfoExtractor.PERMISSIONS)
+                .put("size", FileInfoExtractor.SIZE)
+                .put("lastModifiedTime", FileInfoExtractor.LASTMODIFIED)
+                .immutable();
+
     SftpFileSystemAccessor DEFAULT = new SftpFileSystemAccessor() {
         @Override
         public String toString() {

Reply via email to