1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
// une map pour stocker les propriétés des personnes en mémoire, qui évitera qu'on relise les fichiers à chaque fois qu'on en a besoin
private static final ConcurrentHashMap<String, ConcurrentHashMap<String,String>> CACHE = new ConcurrentHashMap<>();
// lire les propriétés d'une personne
private static ConcurrentHashMap<String,String> lireProprietesPersonne(String nom) {
return CACHE.computeIfAbsent(nom, k-> lireFichierProprietesPersonne(nom));
}
private static ConcurrentHashMap<String,String> lireFichierProprietesPersonne(String nom) {
Path path = getCheminPersonne(nom);
Properties properties = new Properties();
if (Files.exists(path)) {
try (Reader reader = Files.newBufferedReader(path)) {
properties.load(reader);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
for(Map.Entry<Object, Object> entry : properties.entrySet()) {
map.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
return map;
}
private final static ConcurrentHashMap<String,Object> LOCKS = new ConcurrentHashMap<String,Object>();
// sauver les propriétés d'une personne
public static void sauverProprietesPersonne(String nom) {
ConcurrentHashMap<String, String> properties = CACHE.get(nom);
if( properties!=null ) {
sauverFichierProprietesPersonne(nom, properties);
}
}
public static void sauverProprietesPersonne(String nom, ConcurrentHashMap<String, String> properties) throws IOException {
CACHE.put(nom, Objects.requireNonNull(properties));
sauverFichierProprietesPersonne(nom, properties);
}
private static void sauverFichierProprietesPersonne(String nom, ConcurrentHashMap<String, String> properties) {
synchronized(LOCKS.computeIfAbsent(nom, k->new Object())) {
Path path = getCheminPersonne(nom);
Path dossier = path.getParent();
try {
if (!Files.exists(dossier)) {
Files.createDirectories(dossier);
}
Properties prop = new Properties();
prop.putAll(properties);
try (Writer writer = Files.newBufferedWriter(path)) {
prop.store(writer, "Properties of " + nom);
}
}
catch(IOException e) {
throw new UncheckedIOException(e);
}
}
}
public static void setProprietePersonne(String nomPersonne, String nomPropriete, String valeurPropriete)
throws IOException {
ConcurrentHashMap<String,String> properties = lireProprietesPersonne(nomPersonne);
if (valeurPropriete == null) {
properties.remove(nomPropriete);
} else {
properties.put(nomPropriete, valeurPropriete);
}
sauverProprietesPersonne(nomPersonne, properties);
}
public static String getProprietePersonne(String nomPersonne, String nomPropriete) throws IOException {
ConcurrentHashMap<String, String> properties = lireProprietesPersonne(nomPersonne);
return properties.get(nomPropriete);
} |
Partager