Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
1bdc0b6
adicionando o comando da questão
mateusdsoc Jun 3, 2025
1336f24
criando classes bases
mateusdsoc Jun 6, 2025
7c6ff5d
criando classe bloco
mateusdsoc Jun 7, 2025
d8d450c
criando usuario
mateusdsoc Jun 7, 2025
bf074f2
criando classe diretorio e os respectivos métodos
mateusdsoc Jun 7, 2025
f877620
adicionando exceções
mateusdsoc Jun 7, 2025
76cd192
mudando metadados para deslocamento
mateusdsoc Jun 7, 2025
99dcafe
deleting metadados
mateusdsoc Jun 7, 2025
0f8fe82
criando deslocamento
mateusdsoc Jun 7, 2025
1782f2c
criando o rascunho do arquivo, ainda falta implementação de diretorio…
mateusdsoc Jun 7, 2025
8168757
criando arquivo
mateusdsoc Jun 8, 2025
c4b2329
criando diretorio
mateusdsoc Jun 8, 2025
4ffcf7f
criando metadados
mateusdsoc Jun 8, 2025
5e4e59f
criando método em metadados
mateusdsoc Jun 10, 2025
174c991
implementando em arquivo
mateusdsoc Jun 10, 2025
2072776
implementando em diretorio
mateusdsoc Jun 10, 2025
f657241
adicionando métodos de validação e o chmod em filesystem
mateusdsoc Jun 10, 2025
01789c2
tirando erro de filesys
mateusdsoc Jun 10, 2025
77c90c4
tirando imports nao usados
mateusdsoc Jun 10, 2025
6de23a6
implementando métodos para criação e escrita de arquivos, incluindo v…
RafaelMouraG Jun 15, 2025
9a2b722
refatorando métodos mkdir e cp para melhorar validações e tratamento …
RafaelMouraG Jun 16, 2025
6bc0875
base
tulio44 Jun 18, 2025
e4a5fb1
correção arquivo/diretorio/metadados
tulio44 Jun 18, 2025
08f2664
organizacao de arquivos
tulio44 Jun 18, 2025
0999209
revisao geral de codigo e modularizacao(tava com mta linha kkkk)
tulio44 Jun 18, 2025
93ac268
formatacao
tulio44 Jun 18, 2025
2ad37d8
alteração na classe usuario
mateusdsoc Jun 19, 2025
0a50736
deletando permissiontest
mateusdsoc Jun 19, 2025
45b2f20
implementando filesystemtest com funcionalidades do filesys para test…
mateusdsoc Jun 19, 2025
6819648
implementando usuariotest para testar as permissões e funcionalidade …
mateusdsoc Jun 19, 2025
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.Usuario;
import filesys.core.Offset;

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);
}
}
Binary file not shown.
7 changes: 7 additions & 0 deletions exception/BlocoVazioException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package exception;

public class BlocoVazioException extends RuntimeException {
public BlocoVazioException(String message) {
super(message);
}
}
2 changes: 1 addition & 1 deletion exception/PermissaoException.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package exception;

public class PermissaoException extends Exception {
public class PermissaoException extends RuntimeException {
public PermissaoException(String message) {
super(message);
}
Expand Down
18 changes: 18 additions & 0 deletions filesys/FileSys.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package filesys;

import filesys.core.Diretorio;

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;
}
}
19 changes: 12 additions & 7 deletions filesys/FileSystem.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package filesys;

import java.util.Map;

import exception.CaminhoJaExistenteException;
import exception.CaminhoNaoEncontradoException;
import exception.PermissaoException;
import filesys.core.Offset;

// Essa classe deve servir apenas como proxy para o FileSystemImpl
final public class FileSystem implements IFileSystem {

private final IFileSystem fileSystemImpl;

public FileSystem() {
fileSystemImpl = new FileSystemImpl();
public FileSystem(Map<String, Usuario> usuarios) {
this.fileSystemImpl = new FileSystemImpl(usuarios);
}

@Override
Expand All @@ -20,7 +23,8 @@ public void chmod(String caminho, String usuario, String usuarioAlvo, String per
}

@Override
public void mkdir(String caminho, String usuario) throws CaminhoJaExistenteException, PermissaoException {
public void mkdir(String caminho, String usuario)
throws CaminhoJaExistenteException, PermissaoException, CaminhoNaoEncontradoException {
fileSystemImpl.mkdir(caminho, usuario);
}

Expand All @@ -31,7 +35,8 @@ public void rm(String caminho, String usuario, boolean recursivo)
}

@Override
public void touch(String caminho, String usuario) throws CaminhoJaExistenteException, PermissaoException {
public void touch(String caminho, String usuario)
throws CaminhoJaExistenteException, CaminhoNaoEncontradoException, PermissaoException {
fileSystemImpl.touch(caminho, usuario);
}

Expand All @@ -42,14 +47,14 @@ public void write(String caminho, String usuario, boolean anexar, byte[] buffer)
}

@Override
public void read(String caminho, String usuario, byte[] buffer)
public void read(String caminho, String usuario, byte[] buffer, Offset offset)
throws CaminhoNaoEncontradoException, PermissaoException {
fileSystemImpl.read(caminho, usuario, buffer);
fileSystemImpl.read(caminho, usuario, buffer, offset);
}

@Override
public void mv(String caminhoAntigo, String caminhoNovo, String usuario)
throws CaminhoNaoEncontradoException, PermissaoException {
throws CaminhoNaoEncontradoException, PermissaoException, CaminhoJaExistenteException {
fileSystemImpl.mv(caminhoAntigo, caminhoNovo, usuario);
}

Expand Down
Loading