Есть ли пакет Java для чтения файла UNIX / etc / group? - PullRequest
1 голос
/ 06 марта 2009

Я искал в Интернете поиски пакета / класса Java, которые позволили бы мне проанализировать файл UNIX / etc / group. Хотя на самом деле было бы не так сложно написать это с нуля, я очень удивлен, что не нашел что-то уже там. Существует класс POSIX passwd (см. http://www.bmsi.com/java/posix/docs/posix.Passwd.html),, но я не нахожу подобный класс для / etc / group. Существует ли такая вещь?

Ответы [ 4 ]

4 голосов
/ 06 марта 2009

Вот код, предоставленный Джоном Эллинвудом, но сделанный более безопасным (правка: добавлены изменения Джона, немного по-другому, чтобы затем синхронизировать их с комментариями. Приятно видеть, как два человека реализуют один и тот же код).

Я решил выбрасывать исключения в случае неверной строки, вы можете просто вернуть null, как он это делал изначально (я не вижу смысла в использовании файла с неверными данными ...).

Единственное «должно сделать» - изменить его, обернув userList как UnmodifableList (или вернуть новую копию списка), в противном случае злонамеренный пользователь этого метода может добавить что-либо в userList (вызвать getUserList и затем перейти к добавлению элементов в это или удалить предметы из него).

Поскольку класс Group является неизменным (все переменные экземпляра являются окончательными), нет опасений, что вызывающая сторона изменит их.

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Group
{
    private final int gid;
    private final String name;
    private final String passwd;
    private final List<String> userList;

    public static Group parseGroup(final String groupLine)
        throws InvalidGroupException
    {
        final String   line;
        final String[] parts;

        if(groupLine == null)
        {
            throw new IllegalArgumentException("groupLine cannot be null");
        }

        line = groupLine.trim();

        if(line.startsWith("#") || line.isEmpty())
        {
             return null;
        }

        parts = line.split(":");

        if(parts.length < 3)
        {
            throw new InvalidGroupException(groupLine + "must be in the format of name:passwd:gid[:userlist]", line);
        }

        try
        {
            final Group        group;
            final String       name;
            final String       passwd;
            final int          gid;
            final List<String> userList;

            name   = parts[0];
            passwd = parts[1];
            gid    = Integer.parseInt(parts[2]);

            if(parts.length == 4)
            {
                userList = Arrays.asList(parts[3].split(","));
            }
            else
            {
                userList = Collections.emptyList();
            }

            group = new Group(name, passwd, gid, userList);

            return group;
        }
        catch(final NumberFormatException ex)
        {
            throw new InvalidGroupException(groupLine + " gid must be a number", line);
        }
    }

    public Group(final String nm, final String pw, final int id, final List<String> users)
    {
        name     = nm;
        passwd   = pw;
        gid      = id;
        userList = Collections.unmodifiableList(new ArrayList<String>(users));
    }

    public int getGid()
    {
        return (gid);
    }

    public String getName()
    {
        return (name);
    }

    public String getPasswd()
    {
        return (passwd);
    }

    public List<String> getUserList()
    {
        return (userList);
    }

    @Override
    public String toString()
    {
        final StringBuilder sb;

        sb = new StringBuilder();
        sb.append(name);
        sb.append(":");
        sb.append(passwd);
        sb.append(":");
        sb.append(gid);
        sb.append(":");

        for(final String user : userList)
        {
            sb.append(user);
            sb.append(",");
        }

        sb.setLength(sb.length() - 1);

        return (sb.toString());
    }
}

public class InvalidGroupException
    extends Exception
{
     private static final long serialVersionUID = 1L;
     private final String line;

     public InvalidGroupException(final String msg, final String ln)
     {
         super(msg);

         line = ln;
     }

     public String getLine()
     {
         return (line);
     }
}
4 голосов
/ 06 марта 2009

Вот мой код, который обновил tofubeer, который я обновил снова. Его не скомпилировать. отсутствует класс InvalidGroupException. Кроме того, пакет не был указан. Переключил EMPTY_LIST на emptyList (), чтобы избежать отсутствия параметризации.

package fileutils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class GroupReader2 {
    public static class InvalidGroupException extends Exception {
        private static final long serialVersionUID = 1L;

        public InvalidGroupException(String string) {
            super(string);
        }
    }

    public static GroupReader2 parseGroup(final String groupLine)
            throws InvalidGroupException {
        final String line;
        final String[] parts;

        if (groupLine == null) {
            throw new IllegalArgumentException("groupLine cannot be null");
        }

        line = groupLine.trim();

        if (line.startsWith("#") || line.isEmpty()) {
            return null;
        }

        parts = line.split(":");

        if (parts.length < 3) {
            throw new InvalidGroupException(groupLine
                    + "must be in the format of name:passwd:gid[:userlist]");
        }

        try {
            final GroupReader2 group;
            final String name;
            final String passwd;
            final int gid;
            final List<String> userList;

            name = parts[0];
            passwd = parts[1];
            gid = Integer.parseInt(parts[2]);

            if (parts.length == 4) {
                userList = Arrays.asList(parts[3].split(","));
            } else {
                userList = Collections.emptyList();
            }

            group = new GroupReader2(name, passwd, gid, userList);

            return group;
        } catch (final NumberFormatException ex) {
            throw new InvalidGroupException(groupLine + " gid must be a number");
        }
    }

    private final int gid;
    private final String name;
    private final String passwd;

    private final List<String> userList;

    public GroupReader2(final String nm, final String pw, final int id,
            final List<String> users) {
        name = nm;
        passwd = pw;
        gid = id;
        userList = Collections.unmodifiableList(new ArrayList<String>(users));
    }

    public int getGid() {
        return (gid);
    }

    public String getName() {
        return (name);
    }

    public String getPasswd() {
        return (passwd);
    }

    public List<String> getUserList() {
        return (userList);
    }

    @Override
    public String toString() {
        final StringBuilder sb;

        sb = new StringBuilder();
        sb.append(name);
        sb.append(":");
        sb.append(passwd);
        sb.append(":");
        sb.append(gid);
        sb.append(":");

        for (final String user : userList) {
            sb.append(user);
            sb.append(",");
        }

        sb.setLength(sb.length() - 1);

        return (sb.toString());
    }
}
2 голосов
/ 06 марта 2009

В случае, если вы собираетесь запускать эту программу где угодно, кроме своей машины, чтение / etc / group не очень хорошая идея.

Реальный мир использует nis / ldap и т. Д. Для хранения всей этой информации.

Возможно, вы захотите обернуть семью getpwent / getgrent в JNI Вы можете получить некоторую реализацию java для posix, которая обернет их.

Надеюсь, это поможет ..

0 голосов
/ 06 марта 2009

Java независима от машины, тогда я не удивляюсь этому. Класс, на который вы ссылаетесь, не является стандартным.

Я думаю, что та же самая причина, по которой скрывается файл / etc / group от всех, может дать нам ключ к пониманию причины, по которой Java этого не предоставляет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...