O histórico
Uma das funcionalidades de um produto em que estou trabalhando atualmente é processar um conjunto de arquivos compactados (contendo arquivos XML) que serão disponibilizados periodicamente em um local fixo (local local ou remoto - não importa realmente por enquanto) e despejar o conteúdo de cada arquivo XML em um banco de dados. Eu cuidei do design de um módulo de análise genérico que deveria ser capaz de acomodar a análise de qualquer tipo de arquivo, como eu expliquei na minha pergunta abaixo. Não há necessidade de dar uma olhada no link a seguir para responder à minha pergunta, mas definitivamente forneceria um contexto melhor para o problema
Projeto de analisador de arquivos genéricos em Java usando o padrão de estratégia
O objetivo
Eu quero poder acompanhar o status de cada arquivo XML e o status de cada arquivo compactado que contém os arquivos XML. Eu provavelmente posso ter diferentes status definidos para os arquivos XML, como NOVO, PROCESSANDO, CARREGANDO, COMPLETO ou FALHOU. Eu posso derivar o status de um arquivo compactado com base no status dos arquivos XML dentro do arquivo compactado. Por exemplo, o status do arquivo compactado é COMPLETA se nenhum arquivo XML dentro do arquivo compactado estiver em um estado FAILED ou o status do arquivo compactado for FAILED se o status de pelo menos um arquivo XML dentro do arquivo compactado for FAILED.
Uma possível solução
O modelo
Eu preciso manter o status de cada arquivo XML e o arquivo compactado. Eu terei que definir alguns POJOs para manter as informações sobre um arquivo XML como mostrado abaixo. Observe que não há necessidade de armazenar o status de um arquivo compactado, pois o status de um arquivo compactado pode ser derivado do status de seus arquivos XML.
public class FileInformation {
private String compressedFileName;
private String xmlFileName;
private long lastModifiedDate;
private int status;
public FileInformation(final String compressedFileName,
final String xmlFileName, final long lastModified, final int status) {
this.compressedFileName = compressedFileName;
this.xmlFileName = xmlFileName;
this.lastModifiedDate = lastModified;
this.status = status;
}
}
Eu posso então ter uma classe chamada StatusManager que agrega um mapa de instâncias de FileInformation e me fornece o status de um determinado arquivo a qualquer momento no tempo de vida da aplicação, conforme mostrado abaixo:
public class StatusManager {
private Map<String,FileInformation> processingMap = new HashMap<String,FileInformation>();
public void add(FileInformation fileInformation) {
fileInformation.setStatus(0); // 0 will indicates that the file is in NEW state. 1 will indicate that the file is in process and so on..
processingMap.put(fileInformation.getXmlFileName(),fileInformation);
}
public void update(String filename,int status) {
FileInformation fileInformation = processingMap.get(filename);
fileInformation.setStatus(status);
}
}
Isso cuida do modelo por uma questão de explicação.
Então, qual é a minha pergunta?
Editado após comentários de Loki e resposta de Eric: -
Gostaria de saber se há algum padrão de design existente ao qual posso me referir ao criar um design. Eu também gostaria de saber como devo proceder para projetar as classes de gerenciamento de status.
Estou mais interessado em entender como posso modelar as classes de gerenciamento de status. Não estou interessado em saber como os outros componentes serão atualizados sobre uma mudança de status no momento, como sugerido por Eric.