Pregunta

He estado recorriendo Internet buscando un paquete / clase Java que me permita analizar el archivo UNIX / etc / group. Si bien realmente no sería tan difícil escribir esto desde cero, me sorprende mucho no encontrar algo que ya existe. Hay una clase de contraseña POSIX (consulte http: //www.bmsi. com / java / posix / docs / posix.Passwd.html ), pero no encuentro una clase similar para / etc / group. ¿Existe tal cosa?

¿Fue útil?

Solución

Aquí está mi código que tofubeer actualizó que actualicé nuevamente. El suyo no compiló. Falta la clase InvalidGroupException. Además, no se especificó ningún paquete. Cambió EMPTY_LIST a emptyList () para evitar la falta de parametrización.

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());
    }
}

Otros consejos

Aquí está el código que proporcionó John Ellinwood, pero que se hizo más seguro (edición: agregó los cambios de John, de manera ligeramente diferente, para mantenerlos sincronizados con los comentarios. Es bueno ver cómo dos personas implementan el mismo tipo de código).

Elegí lanzar excepciones en el caso de una línea no válida, simplemente podría devolver el valor nulo como lo hizo originalmente (no veo el punto de usar un archivo que tenga datos incorrectos ...).

El único " debe hacer " cámbielo envolviendo la lista de usuarios como UnmodifableList (o devolviendo una nueva copia de la lista), de lo contrario, un usuario malintencionado de este método podría agregar elementos a la lista de usuarios (llamar a getUserList y luego proceder a agregarle elementos o eliminarlos).

Dado que la clase de grupo es inmutable (todas las variables de instancia son finales) no hay temor de que un llamador las cambie.

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);
     }
}

En caso de que ejecutes este programa en cualquier lugar, excepto en tu propia máquina, leer / etc / group no es una buena idea.

El mundo real usa nis / ldap, etc. para mantener toda esta información ...

Es posible que desee envolver la familia getpwent / getgrent con JNI Puede obtener alguna implementación de java posix que los envuelve.

Espero que ayude ..

Java es independiente de la máquina, entonces no me sorprende por esto. La clase a la que te refieres no es estándar.

Creo que la misma razón que da para ocultar el archivo / etc / group a todos, puede darnos una pista para comprender la razón por la que Java no lo proporciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top