Package org.jnode.fs.nfs.command

Source Code of org.jnode.fs.nfs.command.NFSHostNameArgument

/*
* $Id$
*
* Copyright (C) 2003-2013 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.fs.nfs.command;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.List;

import org.jnode.driver.console.CompletionInfo;
import org.jnode.net.nfs.Protocol;
import org.jnode.net.nfs.nfs2.mount.ExportEntry;
import org.jnode.net.nfs.nfs2.mount.Mount1Client;
import org.jnode.net.nfs.nfs2.mount.MountException;
import org.jnode.shell.CommandLine.Token;
import org.jnode.shell.syntax.Argument;
import org.jnode.shell.syntax.CommandSyntaxException;

public class NFSHostNameArgument extends Argument<String> {

    public NFSHostNameArgument(String name, int flags, String description) {
        super(name, flags, new String[0], description);
    }

    public void doComplete(CompletionInfo completions, String partial, int flags) {
        int index = partial.indexOf(':');
        if (index <= 0) {
            return;
        }

        String hostName = partial.substring(0, index);
        final InetAddress host;
        try {
            host = InetAddress.getByName(hostName);
        } catch (UnknownHostException e) {
            return;
        }

        String partialDirectory = partial.substring(index + 1);

        List<ExportEntry> exportEntryList;
        try {
            exportEntryList = AccessController.doPrivileged(
                    new PrivilegedExceptionAction<List<ExportEntry>>() {
                        public List<ExportEntry> run() throws IOException, MountException {
                            Mount1Client client =
                                new Mount1Client(host, Protocol.TCP, -1, -1);
                            List<ExportEntry> exportEntryList;
                            try {
                                exportEntryList = client.export();
                            } finally {
                                if (client != null) {
                                    try {
                                        client.close();
                                    } catch (IOException e) {
                                        // squash
                                    }
                                }
                            }
                            return exportEntryList;
                        }
                    });
        } catch (PrivilegedActionException e) {
            return;
        }

        for (int i = 0; i < exportEntryList.size(); i++) {
            ExportEntry exportEntry = exportEntryList.get(i);
            if (exportEntry.getDirectory().startsWith(partialDirectory)) {
                completions.addCompletion(hostName + ":" + exportEntry.getDirectory());
            }
        }
    }

    public InetAddress getAddress() throws UnknownHostException {
        String value = getValue();
        if (value == null) {
            return null;
        }
        int index = value.indexOf(':');
        return InetAddress.getByName(index == -1 ? value : value.substring(0, index));
    }

    public String getRemoteDirectory() {
        String value = getValue();
        if (value == null) {
            return null;
        }
        int index = value.indexOf(':');
        return (index == -1 || index == value.length() - 1) ? null : value.substring(index + 1);
    }

    @Override
    protected String argumentKind() {
        return "hostname:directory";
    }

    @Override
    protected String doAccept(Token value, int flags) throws CommandSyntaxException {
        int index = value.text.indexOf(':');
        if (index == -1) {
            throw new CommandSyntaxException("missing ':'");
        } else if (index == 0) {
            throw new CommandSyntaxException("no hostname before ':'");
        } else if (index == value.text.length() - 1) {
            throw new CommandSyntaxException("no directory after ':'");
        } else {
            return value.text;
        }
    }
}
TOP

Related Classes of org.jnode.fs.nfs.command.NFSHostNameArgument

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.