Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 71 additions & 40 deletions Main.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import filesys.IFileSystem;
import filesys.Offset;
import filesys.Usuario;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.io.FileNotFoundException;

Expand All @@ -13,8 +17,8 @@
// SINTA-SE LIVRE PARA ALTERAR A CLASSE MAIN
public class Main {

// Constantes úteis para a versão interativa.
// Para esse tipo de execução, o tamanho max do buffer de
// Constantes úteis para a versão interativa.
// Para esse tipo de execução, o tamanho max do buffer de
// leitura pode ser menor.
private static final String ROOT_USER = "root";
private static final String ROOT_DIR = "/";
Expand All @@ -29,28 +33,33 @@ public class Main {
// Usuário que está executando o programa
private static String user;

// O sistema de arquivos é inteiramente virtual, ou seja, será reiniciado a cada execução do programa.
// Logo, não é necessário salvar os arquivos em disco. O sistema será uma simulação em memória.
// O sistema de arquivos é inteiramente virtual, ou seja, será reiniciado a cada
// execução do programa.
// Logo, não é necessário salvar os arquivos em disco. O sistema será uma
// simulação em memória.
public static void main(String[] args) {
// Usuário que está executando o programa.
// Para quaisquer operações que serão feitas por esse usuário em um caminho /path/**,
// Para quaisquer operações que serão feitas por esse usuário em um caminho
// /path/**,
// deve-se checar se o usuário tem permissão de escrita (r) neste caminho.
if (args.length < 2) {
System.out.println("Usuário não fornecido");
return;
}
user = args[1];

// Carrega a lista de usuários do sistema a partir de arquivo
// Formato do arquivo users:
// username dir permission
// username dir permission
// Exemplo:
// maria /** rw-
// luzia /** rwx
// maria /** rw-
// luzia /** rwx
// Essa permissão vale para o diretório raiz e sub diretórios.
// A partir do momento que um usuário cria outro diretório ou arquivo,
// a permissão desse usuário é de leitura, escrita e execução nesse novo diretório/arquivo,
// A partir do momento que um usuário cria outro diretório ou arquivo,
// a permissão desse usuário é de leitura, escrita e execução nesse novo
// diretório/arquivo,
// e sempre será rwx para o usuário root.
Map<String, Usuario> usuariosMap = new HashMap<>();
try {
Scanner userScanner = new Scanner(new java.io.File("users/users"));
while (userScanner.hasNextLine()) {
Expand All @@ -61,13 +70,18 @@ public static void main(String[] args) {
String userListed = parts[0];
String dir = parts[1];
String dirPermission = parts[2];

/* A FAZER:
* Processar a permissão de todos os usuários existentes por diretório.
* Por enquanto esse código somente imprime as permissões contidas no arquivo users.
*/
System.out.println(userListed + " " + dir + " " + dirPermission); // Somente imprime o usuário, diretório e permissão

/*
* A FAZER:
* Processar a permissão de todos os usuários existentes por diretório.
* Por enquanto esse código somente imprime as permissões contidas no arquivo
* users. --- FEITO
*/
System.out.println(userListed + " " + dir + " " + dirPermission); // Somente imprime o usuário,
// diretório e permissão
Usuario usuario = usuariosMap.getOrDefault(userListed, new Usuario(userListed));
usuario.adicionarPermissao(dir, dirPermission);
usuariosMap.put(userListed, usuario);

} else {
System.out.println("Formato ruim no arquivo de usuários. Linha: " + line);
Expand All @@ -80,19 +94,21 @@ public static void main(String[] args) {

return;
}

// Finalmente cria o Sistema de Arquivos
// Lista de usuários é imutável durante a execução do programa
// Obs: Como passar a lista de usuários para o FileSystem?
fileSystem = new FileSystem(/*usuários?*/);
fileSystem = new FileSystem(usuariosMap);

// // DESCOMENTE O BLOCO ABAIXO PARA CRIAR O DIRETÓRIO RAIZ ANTES DE RODAR O MENU
// // DESCOMENTE O BLOCO ABAIXO PARA CRIAR O DIRETÓRIO RAIZ ANTES DE RODAR O
// MENU
// // Cria o diretório raiz do sistema. Root sempre tem permissão total "rwx"
// try {
// fileSystem.mkdir(ROOT_DIR, ROOT_USER);
// } catch (CaminhoJaExistenteException | PermissaoException e) {
// System.out.println(e.getMessage());
// }
try {
fileSystem.mkdir(ROOT_DIR, ROOT_USER);
fileSystem.mkdir("/home", ROOT_USER);
} catch (CaminhoJaExistenteException | PermissaoException | CaminhoNaoEncontradoException e) {
System.out.println(e.getMessage());
}

// Menu interativo.
menu();
Expand Down Expand Up @@ -152,7 +168,7 @@ public static void menu() {
return;
default:
System.out.println("Comando inválido!");
}
}
} catch (CaminhoNaoEncontradoException | CaminhoJaExistenteException | PermissaoException e) {
System.out.println("Erro: " + e.getMessage());
}
Expand All @@ -171,14 +187,14 @@ public static void chmod() throws CaminhoNaoEncontradoException, PermissaoExcept
String usuarioAlvo = scanner.nextLine();
System.out.println("Insira a permissão (formato: 3 caracteres\"rwx\"):");
String permissoes = scanner.nextLine();

fileSystem.chmod(caminho, user, usuarioAlvo, permissoes);
}

public static void mkdir() throws CaminhoJaExistenteException, PermissaoException {
public static void mkdir() throws CaminhoJaExistenteException, PermissaoException, CaminhoNaoEncontradoException {
System.out.println("Insira o caminho do diretório a ser criado:");
String caminho = scanner.nextLine();

fileSystem.mkdir(caminho, user);
}

Expand All @@ -187,14 +203,14 @@ public static void rm() throws CaminhoNaoEncontradoException, PermissaoException
String caminho = scanner.nextLine();
System.out.println("Remover recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.rm(caminho, user, recursivo);
}

public static void touch() throws CaminhoJaExistenteException, PermissaoException {
public static void touch() throws CaminhoJaExistenteException, CaminhoNaoEncontradoException, PermissaoException {
System.out.println("Insira o caminho do arquivo a ser criado:");
String caminho = scanner.nextLine();

fileSystem.touch(caminho, user);
}

Expand All @@ -206,24 +222,39 @@ public static void write() throws CaminhoNaoEncontradoException, PermissaoExcept
System.out.println("Insira o conteúdo a ser escrito:");
String content = scanner.nextLine();
byte[] buffer = content.getBytes();

fileSystem.write(caminho, user, anexar, buffer);
}

public static void read() throws CaminhoNaoEncontradoException, PermissaoException {
System.out.println("Insira o caminho do arquivo a ser lido:");
String caminho = scanner.nextLine();
byte[] buffer = new byte[READ_BUFFER_SIZE]; // Exemplo de tamanho de buffer por load/leitura . O que acontece se o Buffer for menor que o conteúdo a ser lido?

fileSystem.read(caminho, user, buffer); // Lógica para ler arquivos maiores que o buffer deve ser implementada.
byte[] buffer = new byte[READ_BUFFER_SIZE];

Offset offset = new Offset(0);
int offsetAnterior;
int bytesLidos;

System.out.println("Conteúdo lido:");
do {
offsetAnterior = offset.getValue();
fileSystem.read(caminho, user, buffer, offset);
bytesLidos = offset.getValue() - offsetAnterior;

if (bytesLidos > 0)
System.out.write(buffer, 0, bytesLidos);
} while (bytesLidos > 0);

System.out.flush();
System.out.println();
}

public static void mv() throws CaminhoNaoEncontradoException, PermissaoException {
public static void mv() throws CaminhoNaoEncontradoException, CaminhoJaExistenteException, PermissaoException {
System.out.println("Insira o caminho do arquivo a ser movido:");
String caminhoAntigo = scanner.nextLine();
System.out.println("Insira o novo caminho do arquivo:");
String caminhoNovo = scanner.nextLine();

fileSystem.mv(caminhoAntigo, caminhoNovo, user);
}

Expand All @@ -232,7 +263,7 @@ public static void ls() throws CaminhoNaoEncontradoException, PermissaoException
String caminho = scanner.nextLine();
System.out.println("Listar recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.ls(caminho, user, recursivo);
}

Expand All @@ -243,7 +274,7 @@ public static void cp() throws CaminhoNaoEncontradoException, PermissaoException
String caminhoDestino = scanner.nextLine();
System.out.println("Copiar recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.cp(caminhoOrigem, caminhoDestino, user, recursivo);
}
}
28 changes: 28 additions & 0 deletions filesys/Arquivo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package filesys;

import java.util.ArrayList;
import java.util.List;

public class Arquivo {
private MetaDados metaDados;
private List<Bloco> blocos;
public static int TAMANHO_BLOCO = 64;

public Arquivo(String nome, String dono) {
this.metaDados = new MetaDados(nome, dono);
this.blocos = new ArrayList<>();
}

public MetaDados getMetaDados() {
return metaDados;
}

public List<Bloco> getBlocos() {
return blocos;
}

public void adicionarBloco(Bloco bloco) {
blocos.add(bloco);
metaDados.setTamanho(metaDados.getTamanho() + bloco.getDados().length);
}
}
17 changes: 17 additions & 0 deletions filesys/Bloco.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package filesys;

public class Bloco {
private byte[] dados;

public Bloco(int tamanho) {
this.dados = new byte[tamanho];
}

public byte[] getDados() {
return dados;
}

public void setDados(byte[] dados) {
this.dados = dados;
}
}
57 changes: 57 additions & 0 deletions filesys/Diretorio.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package filesys;

import java.util.ArrayList;
import java.util.List;

public class Diretorio {
private MetaDados metaDados;
private List<Arquivo> arquivos;
private List<Diretorio> subdiretorios;

public Diretorio(String nome, String dono) {
this.metaDados = new MetaDados(nome, dono);
this.arquivos = new ArrayList<>();
this.subdiretorios = new ArrayList<>();
}

public MetaDados getMetaDados() {
return metaDados;
}

public List<Arquivo> getArquivos() {
return arquivos;
}

public List<Diretorio> getSubdiretorios() {
return subdiretorios;
}

public void adicionarArquivo(Arquivo a) {
arquivos.add(a);
}

public void adicionarSubdiretorio(Diretorio d) {
subdiretorios.add(d);
}

public Diretorio buscarSubdiretorio(String nome) {
return subdiretorios.stream()
.filter(d -> d.getMetaDados().getNome().equals(nome))
.findFirst().orElse(null);
}

public Arquivo buscarArquivo(String nome) {
return arquivos.stream()
.filter(a -> a.getMetaDados().getNome().equals(nome))
.findFirst().orElse(null);
}

public void removerArquivo(String nome) {
arquivos.removeIf(a -> a.getMetaDados().getNome().equals(nome));
}

public void removerSubdiretorio(String nome) {
subdiretorios.removeIf(d -> d.getMetaDados().getNome().equals(nome));
}

}
16 changes: 16 additions & 0 deletions filesys/FileSys.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package filesys;

public class FileSys {
private Diretorio raiz;

public FileSys(String dono) {
this.raiz = new Diretorio("/", dono);
}

public Diretorio getRaiz() {
return raiz;
}
public void setRaiz(Diretorio raiz) {
this.raiz = raiz;
}
}
Loading