Pessoal, to com um problema que é o seguinte:
Desenvolvi uma biblioteca para suportar alguns recursos que são reutilizados em diversas aplicações diferentes. Surgiu a necessidade de que essa biblioteca atualize alguns parâmetros dinamicamente, para que não sejam geradas novas versões do jar a cada alteração de informações.
Por exemplo (fictício),
Uma das funcionalidades da biblioteca é calcular o peso ideal e a fórmula do peso ideal é armazenada em um arquivo properties dentro dela (peso / (altura x altura)). Toda vez que essa lib é executada, ela consulta um host (http) que é o repositório das informações do arquivo properties e atualiza o arquivo local.
Nesse caso, se a formula do peso ideal fosse alterada, uma nova seria setada no arquivo properties à partir da informação do host.
Resumindo é isso, agora minhas dúvidas:
1 - A intenção é evitar visitas ao host, por isso o uso do arquivo properties local;
2 - Antes que sugiram, não é possível o uso de banco de dados.
3 - Consigo atualizar um arquivo properties que está empacotado dentro de um jar (que é o caso atual)?
4 - Essa é a melhor solução?
5 - Dicas de outras soluções?
[quote=gandja99]Pessoal, to com um problema que é o seguinte:
Desenvolvi uma biblioteca para suportar alguns recursos que são reutilizados em diversas aplicações diferentes. Surgiu a necessidade de que essa biblioteca atualize alguns parâmetros dinamicamente, para que não sejam geradas novas versões do jar a cada alteração de informações.
Por exemplo (fictício),
Uma das funcionalidades da biblioteca é calcular o peso ideal e a fórmula do peso ideal é armazenada em um arquivo properties dentro dela (peso / (altura x altura)). Toda vez que essa lib é executada, ela consulta um host (http) que é o repositório das informações do arquivo properties e atualiza o arquivo local.
Nesse caso, se a formula do peso ideal fosse alterada, uma nova seria setada no arquivo properties à partir da informação do host.
Resumindo é isso, agora minhas dúvidas:
1 - A intenção é evitar visitas ao host, por isso o uso do arquivo properties local;
2 - Antes que sugiram, não é possível o uso de banco de dados.
3 - Consigo atualizar um arquivo properties que está empacotado dentro de um jar (que é o caso atual)?
4 - Essa é a melhor solução?
5 - Dicas de outras soluções?
[/quote]
Não tente atualizar um .jar - no caso do Windows, por exemplo, não é possível mexer em um arquivo que está em uso.
Você pode deixar o .properties fora do .jar, por exemplo
Complicado atualizar o properties fora do jar, a biblioteca teria que saber o caminho do arquivo em cada ambiente onde será utilizado. Essa lib atende tanto a aplicação windows quanto android.
No caso do Android use o SQLite - pode ser uma coisa boba, uma tabela de apenas uma linha, mas mesmo isso já vale a pena.
Entendi, mas e quando não for android? Queria fazer algo genérico, que atendesse a todas as plataformas.
Uma aplicação genérica deve fazer MENOS, não MAIS.
No seu caso, você tem uma biblioteca que faz o cálculo, e deve escrever código para adaptar essa biblioteca a cada ambiente em que ela vai rodar.
Imagine só - você vai ter essa biblioteca rodando em um application server (WebSphere, WebLogic, Glassfish, Tomcat) e vai tentar fazer sua própria persistência, sendo que isso normalmente é proibido na maior parte dos application servers (que exigem que você use, por exemplo, um pool de conexões dado pelo application server). Ou então rodando no Android (onde não há nem mesmo JDBC e sim outra coisa).
A resposta para isso é mover a parte da persistência para fora da sua biblioteca.
[quote=entanglement]Uma aplicação genérica deve fazer MENOS, não MAIS.
No seu caso, você tem uma biblioteca que faz o cálculo, e deve escrever código para adaptar essa biblioteca a cada ambiente em que ela vai rodar.
Imagine só - você vai ter essa biblioteca rodando em um application server (WebSphere, WebLogic) e vai tentar fazer sua própria persistência, sendo que isso normalmente é proibido na maior parte dos application servers (que exigem que você use, por exemplo, um pool de conexões dado pelo application server).
A resposta para isso é mover a parte da persistência para fora da sua biblioteca. [/quote]
Ou eu não te entendi ou vc não entendeu, não tem persistência…
A biblioteca faz menos e não mais. Ela encapsula alguns cálculos que são comuns a diversas aplicações (às vezes a mesma aplicação em algumas plataformas diferentes), só que os calulos possuem valores de constantes que variam com o tempo, por exemplo, valor do salário mínimo.
A intenção é que ela atualize seus parâmetros de tempos em tempos (diariamente) e guarde essas informações localmente para não consultar o host com frequência. Como roda em diferentes plataformas, o uso de repositório que dependa de informações do ambiente não é uma boa ideia.
Não sei se o que estou tentando fazer é tecnicamente possível, mas estruturalmente não tem falha na solução. Encapsulei informações que são comuns a diversos “interessados” e informações referentes às suas ações devem permanecer junto a ela (biblioteca).
Mas atualizar configurações é uma forma de persistência. Não precisa de SQL mas é ainda uma forma de persistência.
No Java (SE) existe aquela API de “Preferences” que serve para persistir essas configurações (elas são persistidas de forma diferente no Linux e no Windows, mas o programador não sabe a diferença); no Android deve haver alguma outra coisa parecida com isso.
Infelizmente, você terá de ter pelo menos 2 classes (uma para Java SE, outra para Android) para fazer essa persistência de configurações.
[quote=entanglement]Mas atualizar configurações é uma forma de persistência. Não precisa de SQL mas é ainda uma forma de persistência.
No Java (SE) existe aquela API de “Preferences” que serve para persistir essas configurações (elas são persistidas de forma diferente no Linux e no Windows, mas o programador não sabe a diferença); no Android deve haver alguma outra coisa parecida com isso.
Infelizmente, você terá de ter pelo menos 2 classes (uma para Java SE, outra para Android) para fazer essa persistência de configurações. [/quote]
Opa, agora eu gostei!!! Não conhecia essa api, vou dar uma olhada nela.
Uma dúvida, após a execução de uma ação da biblioteca as “prefences” permanecem salvas ou devem ser setadas novamente?
Valeu pela dica!!
É… a api Preferences não guarda valor, só mantém em tempo de execução. Vou ter que repensar minha solução.
?
Eu uso para gravar configurações, tais como aquelas aplicações Windows que guardam coisas no registry. (Aliás, a API Preferences - java.util.prefs.Preferences - é implementada no Windows gravando-se no próprio Registry 
?
Eu uso para gravar configurações, tais como aquelas aplicações Windows que guardam coisas no registry. (Aliás, a API Preferences - java.util.prefs.Preferences - é implementada no Windows gravando-se no próprio Registry :)[/quote]
Ué… então fiz errado. Segue meu código de testes:
public class TestePreferences {
private Preferences prefe;
public TestePreferences()
{
prefe = Preferences.userRoot().node(this.getClass().getName());
}
public void setPreferences()
{
prefe.put("URL", "VALOR1");
}
public String getUrl()
{
String g = prefe.get("URL", "");
if(g.trim().length() == 0);
setPreferences();
g = prefe.get("URL", "");
return g;
}
}
Empacotei isso em um jar e executei à partir de outro projeto. Mas toda vez que executo o getUrl, o método prefe.get(“URL”,"") retorna “” (branco).
Foi mal, fiz besteira no meu código. Coloquei um ‘;’ na linha do if que bagunçou o coreto.
Funcionou sim, agora vamos ver como se comporta no android.