/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
Set set;
Iterator it;
it = set.iterator();
set = listeRegistre.entrySet();
it = set.iterator();
while(it.hasNext()){
Map.Entry me = (Map.Entry)it.next();
System.out.println(me.getKey() + " : " + me.getValue() );
}
System.out.println(nbRature + " ratures.");
*/
package hordes;
import java.beans.*;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import javax.swing.JOptionPane;
/**
* @author Shewbacca
*/
public class NewBean implements Serializable {
/*
*
* private void addResult(File f) {
try{
if (f != null) {
BufferedReader buff = new BufferedReader(new FileReader(f));
try {
String string = "", line;
while ((line = buff.readLine()) != null) {
string = string + line + "\n";
}
int begin, end, value, nbRature = 0;
String rech1, rech2, rech3, find, substring;
Pattern p, p2, p3;
Matcher m, m2;
rech1 = "(Aucune rature n'a été faite)|(1 entrée a été raturée)|(\\d+ entrées ont été raturées)";
rech2 = "\\d+";
rech3 = "(il y a )|(il manque )";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
p3 = Pattern.compile(rech3);
m = p.matcher(string);
m.find();
if (m.group().equals("Aucune rature n'a été faite")) {
nbRature = 0;
} else if (m.group().equals("1 entrée a été raturée")) {
nbRature = 1;
} else if (m.group().equals("entrées ont été raturées")) {
m2 = p2.matcher(m.group());
m2.find();
nbRature = Integer.parseInt(m2.group());
} else {
System.out.println("Fichier non valide !");
}
m2 = p2.matcher(m.group());
m2.find();
nbRature = Integer.parseInt(m2.group());
m.usePattern(p3);
while(m.find()) {
m.usePattern(p2);
m.find();
value = Integer.parseInt(m.group());
m.usePattern(p3);
m.find();
begin = m.end();
m.usePattern(Pattern.compile("( \\.)|( et )"));
m.find();
end = m.start();
find = string.substring(begin, end);
}
} finally {
buff.close();
}
}
} catch (IOException ioe) {
System.out.println("Erreur --" + ioe.toString());
}
}
*/
private PropertyChangeSupport propertySupport;
protected Map<String, Integer> listeRegistre = new HashMap<String, Integer>();
protected Map<String, Integer> listeBanque = new HashMap<String, Integer>();
protected Map<String, Integer> listeResult = new HashMap<String, Integer>();
protected String stringBanque;
protected String stringRegistre;
protected String stringResult;
// public static final String PROP_STRINGBANQUE = "stringBanque";
public static final String PROP_STRINGREGISTRE = "stringRegistre";
public String analyse() throws LigneRegistreNonPrevue {
String result;
int nbRature;
try {
verif();
reinitialise();
analyseBanque();
nbRature = analyseRegistre();
result = compare(nbRature);
return result;
} catch (LigneRegistreNonPrevue ex) {
throw new LigneRegistreNonPrevue(ex);
}
}
private void verif() throws LigneRegistreNonPrevue {
int i = 0;
String subStr;
String[] strSplit;
String[] casReferences =
{"a produit", // Atelier
"a pris", // Prise en banque ou vol réussit
"a donné", // Dépot en banque
"a utilisé :", // Chantier construit
"a récupéré", // Bannissement
"a rapporté", // Apprivoiseur
"a été découvert", // Don de plan avec Architectoire
"a tenté de voler", // Vol échoué
"dans le potager"}; // Potager
String cas = "((" + casReferences[0] + ")";
for (int j = 1; j<casReferences.length; j++) {
cas = cas + "|(" + casReferences[j] + ")";
if (j == casReferences.length - 1) {
cas = cas + ")";
}
}
Pattern p, p2, p3;
Matcher m, m2, m3;
strSplit = stringRegistre.split("\n");
p = Pattern.compile("\\[\\].*\n"); // Une ligne qui traite d'items
p2 = Pattern.compile(cas);
p3 = Pattern.compile("$", Pattern.MULTILINE);
m = p.matcher(stringRegistre);
while (m.find()) { // Pour chaque ligne qui parle d'item
subStr = stringRegistre.substring(0, m.end());
m3 = p3.matcher(subStr);
i = -1;
while (m3.find()) { i++; }
m2 = p2.matcher(strSplit[i-1]);
if (m2.find() == false) { // Mais que l'on ne trouve pas quelque chose que l'on connait
subStr = stringRegistre.substring(0, m.end());
String[] choices={ "Annuler", "Ignorer"};
String message = "Découverte d'un cas non référencé :\n<html>\"<i>" + strSplit[i-1] + "</i>\"</html>\nLigne " + i + " du registre.";
int retour = JOptionPane.showOptionDialog(null,
message,
"Attention !",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE,
null,
choices,
null);
try {
if( retour == JOptionPane.CLOSED_OPTION || (retour>=0 && retour<choices.length && choices[retour].equals("Annuler"))) {
throw new LigneRegistreNonPrevue(message);
}
} catch (LigneRegistreNonPrevue ex) {
throw new LigneRegistreNonPrevue(ex);
}
}
}
}
private void reinitialise() {
listeRegistre.clear();
listeBanque.clear();
}
private void analyseBanque() {
int begin, end;
String rech1, rech2, rech3, rech4, rech5, find;
Pattern p, p2, p3, p4, p5;
Matcher m, m2;
rech1 = "js.HordeTip.showTip\\(this,'[ \t]*";
rech2 = "[ \t]*<img src="";
rech3 = "(broken.*[\n]+.*)?(<span class=\"count\">\\d+</span>)?([\n]+</a>[\n]+</li>)";
rech4 = "<span class=\"count\">";
rech5 = "broken";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
p3 = Pattern.compile(rech3);
p4 = Pattern.compile(rech4);
p5 = Pattern.compile(rech5);
m = p.matcher(stringBanque);
while(m.find()) {
begin = m.end();
m.usePattern(p2);
m.find();
end = m.start();
find = stringBanque.substring(begin, end); // nom de l'item
m.usePattern(p3);
m.find();
m2 = p5.matcher(m.group());
if (m2.find()) { // On rajoute l'état "cassé(e)" si nécessaire
find = find + " cassé(e)";
}
m2 = p4.matcher(m.group());
if (m2.find()) {
m2 = Pattern.compile("\\d+").matcher(m.group());
m2.find();
ajouteItem(find, Integer.parseInt(m2.group()), false);
} else {
ajouteItem(find, 1, false);
}
m.usePattern(p);
}
}
private int analyseRegistre() {
int begin, end, value, nbRature = 0;
String rech1, rech2, rech3, find, substring;
Pattern p, p2, p3;
Matcher m, m2;
// Prise et Vol en banque
// [15:19] [X] TchOrT a pris [] Ration d'eau dans les coffres de la Banque !
// [23:54] Quelqu'un a pris [] Explosifs bruts dans les coffres de la Banque mais il (ou elle) n'a pu être identifié(e).
// [23:54] Ichigodu98 a tenté de voler [] Poignée de vis et écrous dans la Banque mais a été parfaitement incapable de faire preuve de discrétion !!
rech1 = "(a pris \\[\\] )|(a tenté de voler \\[\\] )";
rech2 = "( dans les coffres)|( dans la Banque)";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
m = p.matcher(stringRegistre);
while(m.find()) {
begin = m.end();
m.usePattern(p2);
m.find();
end = m.start();
find = stringRegistre.substring(begin, end);
ajouteItem(find, -1, true);
m.usePattern(p);
}
// ----------------------------------------------------
// Dépot en banque ou Apprivoiseur
// [15:19] [X] TchOrT a donné [] Ration d'eau à la ville.
// [20:15] [X] Zaboro, le cabot malodorant de aker93 a rapporté [] Ferraille en ville !
rech1 = "(a donné \\[\\] )|(a rapporté \\[\\] )";
rech2 = "( à la ville)|( en ville)";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
m = p.matcher(stringRegistre);
while(m.find()) {
begin = m.end();
m.usePattern(p2);
m.find();
end = m.start();
find = stringRegistre.substring(begin, end);
ajouteItem(find, +1, true);
m.usePattern(p);
}
// ----------------------------------------------------
// Dépot de plan en banque avec l'architectoire
// [00:27] [X] "[] Plan de chantier (commun) " a été découvert grace à Architectoire. Cet objet a été déposé à la banque.
rech1 = "(\\[\\d\\d:\\d\\d\\] \\[X\\] \"\\[\\] )";
rech2 = "( \" a été découvert)";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
m = p.matcher(stringRegistre);
while(m.find()) {
begin = m.end();
m.usePattern(p2);
m.find();
end = m.start();
find = stringRegistre.substring(begin, end);
ajouteItem(find, +1, true);
m.usePattern(p);
}
// ----------------------------------------------------
// Atelier
// [13:58] [X] hermannvonsalza a produit [] Poignée de vis et écrous à l'Atelier (à partir de [] Appareil électronique en panne ).
rech1 = "a produit \\[\\] ";
rech2 = " à l'Atelier";
p = Pattern.compile(rech1);
m = p.matcher(stringRegistre);
while(m.find()) {
// Incrémentation
begin = m.end();
end = stringRegistre.indexOf(rech2, begin);
find = stringRegistre.substring(begin, end);
if (listeRegistre.containsKey(find) == false) {
listeRegistre.put(find, 0);
}
listeRegistre.put(find, listeRegistre.get(find)+1);
// Décrémentation
begin = end + 29;
find = stringRegistre.substring(begin, stringRegistre.indexOf(" ).", begin));
ajouteItem(find, -1, true);
}
// ----------------------------------------------------
// Chantier construit.
// [17:42] [X] La construction de Atelier a utilisé : [] Planche tordue x10,[] Ferraille x8
rech1 = "a utilisé :";
rech2 = "\\[\\] ";
rech3 = " x\\d+";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
p3 = Pattern.compile(rech3);
m = p.matcher(stringRegistre);
while(m.find()) { // On rencontre une ligne Construction
substring = stringRegistre.substring(m.end(), stringRegistre.indexOf("\n", m.end()));
m2 = p2.matcher(substring);
while(m2.find()) {
begin = m2.end(); // début du nom de l'item
m2.usePattern(p3);
m2.find();
end = m2.start(); // fin du nom de l'item
find = substring.substring(begin, end); // On chope le nom de l'item
value = Integer.parseInt(substring.substring(end+2, m2.end())); // On récupère le nombre d'item en question
ajouteItem(find, - value, true);
m2.usePattern(p2);
}
}
// ----------------------------------------------------
// Bannissement
// [16:47] La ville a récupéré [] Ration d'eau x1, [] Twinoïde 500mg x1 (bannissement de Cryman).
rech1 = "a récupéré";
rech2 = "\\[\\] ";
rech3 = " x\\d+";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
p3 = Pattern.compile(rech3);
m = p.matcher(stringRegistre);
while(m.find()) { // On rencontre une ligne Construction
substring = stringRegistre.substring(m.end(), stringRegistre.indexOf("\n", m.end()));
m2 = p2.matcher(substring);
while(m2.find()) {
begin = m2.end(); // début du nom de l'item
m2.usePattern(p3);
m2.find();
end = m2.start(); // fin du nom de l'item
find = substring.substring(begin, end); // On chope le nom de l'item
value = Integer.parseInt(substring.substring(end+2, m2.end())); // On récupère le nombre d'item en question
ajouteItem(find, value, true);
m2.usePattern(p2);
}
}
// ----------------------------------------------------
// Potager
// [00:42] Plusieurs légumes ont poussé dans le potager : 4x [] Légume suspect et 0x [] Melon d'intestin .
rech1 = "dans le potager : ";
rech2 = "\\d+";
rech3 = "x \\[\\] ";
p = Pattern.compile(rech1);
p2 = Pattern.compile(rech2);
p3 = Pattern.compile(rech3);
m = p.matcher(stringRegistre);
while(m.find()) {
for (int j=0; j<2; j++) {
m.usePattern(p2);
m.find();
value = Integer.parseInt(m.group());
m.usePattern(p3);
m.find();
begin = m.end();
m.usePattern(Pattern.compile("( \\.)|( et )"));
m.find();
end = m.start();
find = stringRegistre.substring(begin, end);
ajouteItem(find, value, true);
}
m.usePattern(p);
}
// ----------------------------------------------------
// Rature
// [21:23] [X] Cette entrée du registre a été ratuarée : elle est maintenant totalement illisible ! Qu'a-t-on bien pu vouloir nous cacher...
rech1 = "a été raturée";
p = Pattern.compile(rech1);
m = p.matcher(stringRegistre);
while(m.find()) {
begin = m.end();
nbRature++;
}
return nbRature;
}
private String compare(int nbRature) {
// Négatif = vol
// positif = rature de don...
listeResult = listeBanque;
Set set= listeRegistre.entrySet();
Iterator it = set.iterator();
String result;
if (nbRature == 0) {
result = "Aucune rature n'a été faite.\n";
} else if (nbRature == 1) {
result = nbRature + " entrée a été raturée !\n";
} else {
result = nbRature + " entrées ont été raturées !\n";
}
while(it.hasNext()){
Map.Entry me = (Map.Entry)it.next();
if (listeResult.containsKey(me.getKey().toString())) {
listeResult.put(me.getKey().toString(), listeResult.get(me.getKey().toString()) - (Integer)me.getValue());
} else {
listeResult.put(me.getKey().toString(), - (Integer)me.getValue());
}
}
set = listeResult.entrySet();
it = set.iterator();
while(it.hasNext()){
Map.Entry me = (Map.Entry)it.next();
if ((Integer)me.getValue() > 0) {
result = result + "\nIl y a " + (Integer)me.getValue() + " " + me.getKey().toString() + " en trop.";
} else if ((Integer)me.getValue() < 0) {
result = result + "\nIl manque " + (-(Integer)me.getValue()) + " " + me.getKey().toString() + " !";
}
}
return result;
}
private void ajouteItem(String find, int value, boolean registre) {
// Etant donné qu'une lampe se décharge toute seule à minuit,
// on ne sauvegarde pas l'état (allumé ou éteint)
String rech1 = "(Lampe de chevet)|(MagLite Pif'Gadget)|(Torche)";
Pattern p = Pattern.compile(rech1);
Matcher m = p.matcher(find);
if (m.find()) {
find = m.group();
}
if (registre) { // registre de banque
if (listeRegistre.containsKey(find) == false) {
listeRegistre.put(find, 0);
}
listeRegistre.put(find, listeRegistre.get(find)+value);
} else { // code source de la banque (images)
listeBanque.put(find, value);
}
}
/**
* Get the value of stringResult
* @return the value of stringResult
*/
public String getStringResult() {
return stringResult;
}
/**
* Set the value of stringResult
* @param stringResult new value of stringResult
*/
public void setStringResult(String stringResult) {
this.stringResult = stringResult;
}
/**
* Get the value of stringBanque
* @return the value of stringBanque
*/
public String getStringBanque() {
return stringBanque;
}
/**
* Get the value of stringRegistre
* @return the value of stringRegistre
*/
public String getStringRegistre() {
return stringRegistre;
}
/**
* Set the value of stringBanque
* @param stringBanque new value of stringBanque
*/
public void setStringBanque(String stringBanque) {
String rech= "\\\\'", stringModif;
Pattern p = Pattern.compile(rech);
Matcher m = p.matcher(stringBanque);
stringModif = m.replaceAll("\\'");
// String oldStringBanque = this.stringBanque;
this.stringBanque = stringModif;
// propertySupport.firePropertyChange(PROP_STRINGBANQUE, oldStringBanque, stringBanque);
}
/**
* Set the value of stringRegistre
* @param stringRegistre new value of stringRegistre
*/
public void setStringRegistre(String stringRegistre) {
String rech= " icon ", stringModif;
Pattern p = Pattern.compile(rech);
Matcher m = p.matcher(stringRegistre);
stringModif = m.replaceAll(" [] ");
String oldStringRegistre = this.stringRegistre + " ";
this.stringRegistre = stringModif;
propertySupport.firePropertyChange(PROP_STRINGREGISTRE, oldStringRegistre, stringModif);
}
public NewBean() {
propertySupport = new PropertyChangeSupport(this);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
}
}