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
18 changes: 11 additions & 7 deletions Main.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import filesys.IFileSystem;
import core.Usuario;

import java.util.Scanner;
import java.util.*;
import java.io.FileNotFoundException;

import exception.PermissaoException;
Expand Down Expand Up @@ -51,6 +52,7 @@ public static void main(String[] args) {
// 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.
List<Usuario> usuarios = new ArrayList<>();
try {
Scanner userScanner = new Scanner(new java.io.File("users/users"));
while (userScanner.hasNextLine()) {
Expand All @@ -68,6 +70,8 @@ public static void main(String[] args) {
*/
System.out.println(userListed + " " + dir + " " + dirPermission); // Somente imprime o usuário, diretório e permissão

usuarios.add(new Usuario(userListed, dirPermission, dir));//Adicionar usuario


} else {
System.out.println("Formato ruim no arquivo de usuários. Linha: " + line);
Expand All @@ -84,15 +88,15 @@ public static void main(String[] args) {
// 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(usuarios);

// // 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);
} catch (CaminhoJaExistenteException | PermissaoException e) {
System.out.println(e.getMessage());
}

// Menu interativo.
menu();
Expand Down
58 changes: 58 additions & 0 deletions core/Arquivo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package core;

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

public class Arquivo extends ElementoFS {
private final List<byte[]> blocos;
private long bytesTotais;

public Arquivo(String nome, String permissoes, String dono) {
super(nome, permissoes, dono);
this.blocos = new ArrayList<>();
this.bytesTotais = 0;
}

public void adicionarBloco(byte[] dados) {
blocos.add(dados);
bytesTotais += dados.length;
}

public List<byte[]> getBlocos() {
return blocos;
}

public long getBytesTotais() {
return bytesTotais;
}

public void removerBloco(int idx) {
if (idx < 0 || idx >= blocos.size())
throw new IndexOutOfBoundsException("Índice inválido para remoção de bloco.");
byte[] removido = blocos.remove(idx);
bytesTotais -= removido.length;
}

public void limpar() {
blocos.clear();
bytesTotais = 0;
}

@Override
public boolean isArquivo() {
return true;
}

@Override
public String toString() {
return "[ARQ] " + nomeDiretorio + " | Dono: " + donoDiretorio + " | Perm: " + permissoesPadrao + " | Tam: " + bytesTotais + " bytes";
}

public void inserirElemento(ElementoFS filho) {
throw new UnsupportedOperationException("Arquivo não pode conter elementos.");
}

public void excluirElemento(String nome) {
throw new UnsupportedOperationException("Arquivo não possui elementos para remover.");
}
}
22 changes: 22 additions & 0 deletions core/Bloco.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package core;

public class Bloco {
public static final int TAMANHO_PADRAO = 4096; // 4KB
private byte[] dados;

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

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

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

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

import java.util.HashMap;
import java.util.Map;

public class Diretorio extends ElementoFS {
private Diretorio pai;
private final Map<String, ElementoFS> conteudo;
private final Map<String, String> permissoesUsuario;

public Diretorio(String nome, String permissoes, String dono) {
super(nome, permissoes, dono);
if (permissoes == null || permissoes.length() != 3)
throw new IllegalArgumentException("Permissões devem ter 3 caracteres (rwx)");
this.conteudo = new HashMap<>();
this.permissoesUsuario = new HashMap<>();
}

public void definirPermissao(String usuario, String permissoes) {
if (permissoes == null || permissoes.length() != 3)
throw new IllegalArgumentException("Permissões devem ter 3 caracteres (rwx)");
permissoesUsuario.put(usuario, permissoes);
}

public boolean possuiPermissao(String usuario, char tipo) {
if ("root".equals(usuario)) return true;
if (usuario.equals(donoDiretorio)) return permissoesPadrao.indexOf(tipo) >= 0;
String perm = permissoesUsuario.get(usuario);
if (perm != null && perm.indexOf(tipo) >= 0) return true;
if (pai != null) return pai.possuiPermissao(usuario, tipo);
return false;
}

public String permissoesDoUsuario(String usuario) {
if ("root".equals(usuario)) return "rwx";
if (usuario.equals(donoDiretorio)) return permissoesPadrao;
return permissoesUsuario.getOrDefault(usuario, "---");
}

public void inserirElemento(ElementoFS elemento) {//adiciona FILHO
if (conteudo.containsKey(elemento.getNomeDiretorio()))
throw new IllegalArgumentException("Elemento já existe: " + elemento.getNomeDiretorio());
if (elemento instanceof Diretorio) {
((Diretorio) elemento).setPai(this);
}
conteudo.put(elemento.getNomeDiretorio(), elemento);
}

public void excluirElemento(String nome) {//exclui FILHO
conteudo.remove(nome);
}

public Map<String, ElementoFS> getConteudo() {
return conteudo;
}

public Diretorio getPai() {
return pai;
}

public void setPai(Diretorio pai) {
this.pai = pai;
}

@Override
public boolean isArquivo() {
return false;
}

@Override
public String toString() {
return "[DIR] " + nomeDiretorio + " | Dono: " + donoDiretorio + " | Perm: " + permissoesPadrao;
}
}
39 changes: 39 additions & 0 deletions core/ElementoFS.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package core;

public abstract class ElementoFS {
protected String nomeDiretorio;
protected String permissoesPadrao;
protected String donoDiretorio;

public ElementoFS(String nomeDiretorio, String permissoesPadrao, String donoDiretorio) {
this.nomeDiretorio = nomeDiretorio;
this.permissoesPadrao = permissoesPadrao;
this.donoDiretorio = donoDiretorio;
}

public String getNomeDiretorio() {
return nomeDiretorio;
}

public void setNomeDiretorio(String nomeDiretorio) {
this.nomeDiretorio = nomeDiretorio;
}

public String getPermissoesPadrao() {
return permissoesPadrao;
}

public void setPermissoesPadrao(String permissoesPadrao) {
this.permissoesPadrao = permissoesPadrao;
}

public String getDonoDiretorio() {
return donoDiretorio;
}

public void setDonoDiretorio(String donoDiretorio) {
this.donoDiretorio = donoDiretorio;
}

public abstract boolean isArquivo();
}
53 changes: 53 additions & 0 deletions core/Offset.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package core;

public class Offset {
private int posicao;
private int limite;

public Offset() {
this.posicao = 0;
this.limite = Integer.MAX_VALUE;
}

public Offset(int inicial) {
this.posicao = inicial;
this.limite = Integer.MAX_VALUE;
}

public Offset(int inicial, int limite) {
this.posicao = inicial;
this.limite = limite;
}

public int getPosicao() {
return posicao;
}

public void setPosicao(int posicao) {
if (posicao < 0) {
throw new IllegalArgumentException("Offset não pode ser negativo.");
}
if (posicao > limite) {
throw new IllegalArgumentException("Offset excede o limite permitido (" + limite + ").");
}
this.posicao = posicao;
}

public void avancar(int quantidade) {
setPosicao(this.posicao + quantidade);
}

public void zerar() {
this.posicao = 0;
}

public int getLimite() {
return limite;
}

public void setLimite(int limite) {
if (limite < 0) throw new IllegalArgumentException("Limite deve ser positivo.");
this.limite = limite;
if (posicao > limite) posicao = limite;
}
}
31 changes: 31 additions & 0 deletions core/Permissao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package core;

import java.util.HashMap;
import java.util.Map;

public class Permissao {
// Mapeia usuários para suas permissões
private Map<String, String> mapaPermissoes;

public Permissao() {
this.mapaPermissoes = new HashMap<>();
}

public void atribuirPermissao(String usuario, String permissao) {
mapaPermissoes.put(usuario, permissao); // exemplos: "rw", "r", "-"
}

public boolean leituraPermitida(String usuario) {
String p = mapaPermissoes.getOrDefault(usuario, "");
return p.contains("r");
}

public boolean escritaPermitida(String usuario) {
String p = mapaPermissoes.getOrDefault(usuario, "");
return p.contains("w");
}

public String consultarPermissao(String usuario) {
return mapaPermissoes.getOrDefault(usuario, "-");
}
}
42 changes: 42 additions & 0 deletions core/Usuario.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package core;

public class Usuario {
private String identificador;
private String pastaBase;
private String nivelAcesso;

public Usuario(String identificador, String nivelAcesso, String pastaBase) {
this.setIdentificador(identificador);
this.setNivelAcesso(nivelAcesso);
this.setPastaBase(pastaBase);
}

public String getIdentificador() {
return identificador;
}

public String getNivelAcesso() {
return nivelAcesso;
}

public void setNivelAcesso(String nivelAcesso) {
this.nivelAcesso = nivelAcesso;
}

public void setIdentificador(String identificador) {
this.identificador = identificador;
}

public void setPastaBase(String pastaBase) {
this.pastaBase = pastaBase;
}

@Override
public String toString() {
return "Usuario{" +
"identificador='" + identificador + '\'' +
", nivelAcesso='" + nivelAcesso + '\'' +
", pastaBase='" + pastaBase + '\'' +
'}';
}
}
7 changes: 5 additions & 2 deletions filesys/FileSystem.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package filesys;

import java.util.List;

import core.Usuario;
import exception.CaminhoJaExistenteException;
import exception.CaminhoNaoEncontradoException;
import exception.PermissaoException;
Expand All @@ -9,8 +12,8 @@ final public class FileSystem implements IFileSystem {

private final IFileSystem fileSystemImpl;

public FileSystem() {
fileSystemImpl = new FileSystemImpl();
public FileSystem(List<Usuario> usuarios) {
fileSystemImpl = new FileSystemImpl(usuarios);
}

@Override
Expand Down
Loading