Premier commit - Inclusion dans le projet git
This commit is contained in:
commit
e1e3fb2abc
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
bin/
|
||||||
|
doc.zip
|
||||||
|
doc/
|
||||||
47
src/BernardLogMachineMain.java
Normal file
47
src/BernardLogMachineMain.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import java.io.File;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
|
||||||
|
import com.bernard.logMachine.*;
|
||||||
|
|
||||||
|
public class BernardLogMachineMain {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Logger logger = new Logger();
|
||||||
|
LogChan chan1 = logger.newChan(new File("/home/mysaa/chan1.log.bernard"));
|
||||||
|
LogChan chan2 = logger.newChan(new File("/home/mysaa/chan2.log.bernard"));
|
||||||
|
LogChan chan3 = logger.newChan(new File("/home/mysaa/chan3.log.bernard"));
|
||||||
|
LogChan chan4 = logger.newChan(new File("/home/mysaa/chan4.log.bernard"));
|
||||||
|
LogChan chan5 = logger.newChan(new File("/home/mysaa/chan5.log.bernard"));
|
||||||
|
LogChan chan6 = logger.newChan(new File("/home/mysaa/chan6.log.bernard"));
|
||||||
|
|
||||||
|
System.out.println("bonjour");
|
||||||
|
|
||||||
|
PrintStream oldOut = System.out;
|
||||||
|
PrintStream oldErr = System.err;
|
||||||
|
System.out.println("ccava");
|
||||||
|
//System.setErr(chan1);
|
||||||
|
System.setOut(chan2);
|
||||||
|
System.out.println("Bien ?");
|
||||||
|
chan1.println("Wow");
|
||||||
|
chan2.println("Wow,bis");
|
||||||
|
chan3.println("Wow,tri");
|
||||||
|
chan4.println("Wow,carotte");
|
||||||
|
chan5.println("Wow, magie");
|
||||||
|
chan6.println("Waw");
|
||||||
|
chan1.println("Wiw");
|
||||||
|
chan6.println("Www");
|
||||||
|
chan4.println("bernard.com");
|
||||||
|
chan5.println("Concombre=courgette");
|
||||||
|
chan5.println("Lister");
|
||||||
|
System.out.println("Tuturu");
|
||||||
|
System.out.println("Carotte");
|
||||||
|
System.err.println("Akeproblem");
|
||||||
|
oldErr.println("vrai ?");
|
||||||
|
oldOut.println("vout");
|
||||||
|
|
||||||
|
logger.closeChan(chan4);
|
||||||
|
logger.closeChan(chan2);
|
||||||
|
logger.closeEverybody();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
328
src/com/bernard/logMachine/LogChan.java
Normal file
328
src/com/bernard/logMachine/LogChan.java
Normal file
@ -0,0 +1,328 @@
|
|||||||
|
package com.bernard.logMachine;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Formatter;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class LogChan extends PrintStream{
|
||||||
|
|
||||||
|
protected String tempMsg = "";
|
||||||
|
|
||||||
|
private void ensureOpen() {}//Est censé renvoyer une exception
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Est censé actualiser/envoyer le buffer
|
||||||
|
* Vu qu'il n'y a pas de buffer, ca ne fait rien
|
||||||
|
*/
|
||||||
|
public void flush() {
|
||||||
|
//Naturally flushed
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* La fonction close A NE PAS UTILISER (pour la compatibilité)
|
||||||
|
*/
|
||||||
|
public void close() {
|
||||||
|
System.err.println("Veuillez passer par le le LogChan pour fermer un channel");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Si jamais y a une erreur dans le stream
|
||||||
|
*/
|
||||||
|
private boolean trouble;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Y a-t-il une erreur
|
||||||
|
*/
|
||||||
|
public boolean checkError() {return trouble;}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Oui, il y a eu une erreur
|
||||||
|
*/
|
||||||
|
protected void setError() {
|
||||||
|
trouble = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non, il n'y a pâs d'erreur
|
||||||
|
*/
|
||||||
|
protected void clearError() {
|
||||||
|
trouble = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Écrit l'entrée
|
||||||
|
* @param b le truc a écrire
|
||||||
|
*/
|
||||||
|
public void write(int b) {
|
||||||
|
tempMsg += b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write(byte buf[], int off, int len) {
|
||||||
|
byte[] newData = new byte[len];
|
||||||
|
System.arraycopy(buf, off, newData, 0, len);
|
||||||
|
tempMsg += newData;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void write(char buf[]) {
|
||||||
|
tempMsg += buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void write(String s) {
|
||||||
|
tempMsg += s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void newLine() {
|
||||||
|
log();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(boolean b) {
|
||||||
|
write(b ? "true" : "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(char c) {
|
||||||
|
write(String.valueOf(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(int i) {
|
||||||
|
write(String.valueOf(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(long l) {
|
||||||
|
write(String.valueOf(l));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(float f) {
|
||||||
|
write(String.valueOf(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(double d) {
|
||||||
|
write(String.valueOf(d));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(char s[]) {
|
||||||
|
write(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(String s) {
|
||||||
|
write((s==null)?"null":s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(Object obj) {
|
||||||
|
write(String.valueOf(obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void println() {
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(boolean x) {
|
||||||
|
synchronized (this) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(char x) {
|
||||||
|
synchronized (this) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(int x) {
|
||||||
|
synchronized (this) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(long x) {
|
||||||
|
synchronized (this) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(float x) {
|
||||||
|
synchronized (this) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(double x) {
|
||||||
|
synchronized (this) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(char x[]) {
|
||||||
|
synchronized (this) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(String x) {
|
||||||
|
print(x);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(Object x) {
|
||||||
|
String s = String.valueOf(x);
|
||||||
|
synchronized (this) {
|
||||||
|
print(s);
|
||||||
|
newLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public PrintStream printf(String format, Object ... args) {
|
||||||
|
return format(format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintStream printf(Locale l, String format, Object ... args) {
|
||||||
|
return format(l, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintStream format(String format, Object ... args) {
|
||||||
|
synchronized (this) {
|
||||||
|
ensureOpen();
|
||||||
|
new Formatter(this).format(Locale.getDefault(), format, args);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintStream format(Locale l, String format, Object ... args) {
|
||||||
|
synchronized (this) {
|
||||||
|
ensureOpen();
|
||||||
|
new Formatter(this).format(l, format, args);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintStream append(CharSequence csq) {
|
||||||
|
if (csq == null)
|
||||||
|
print("null");
|
||||||
|
else
|
||||||
|
print(csq.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintStream append(CharSequence csq, int start, int end) {
|
||||||
|
CharSequence cs = (csq == null ? "null" : csq);
|
||||||
|
write(cs.subSequence(start, end).toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintStream append(char c) {
|
||||||
|
print(c);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////Internal////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Le sacré-saint stream de sortie
|
||||||
|
*/
|
||||||
|
private OutputStream os;
|
||||||
|
/**
|
||||||
|
* Le charset de sortie
|
||||||
|
*/
|
||||||
|
public String charset = "UTF-8";
|
||||||
|
/**
|
||||||
|
* Le préfixe des lignes de sortie
|
||||||
|
*/
|
||||||
|
public String formatString = "[§\\£µdateµ£\\§(§\\£µthreadµ£\\§)]";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crée le LogChan
|
||||||
|
* @param os le canal de sortie
|
||||||
|
*/
|
||||||
|
public LogChan(OutputStream os) {
|
||||||
|
super(os);//Totally useless because every function is overwritten
|
||||||
|
this.os = os;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log un "toString" de cet objet
|
||||||
|
* @see java.lang.Object#toString
|
||||||
|
* @param data L'objet à dump
|
||||||
|
* @param <O> le type (en générique) de l'objet d'entrée
|
||||||
|
* @return Ce même objet (pour faire des chaines)
|
||||||
|
*/
|
||||||
|
public<O> O log(O data) {
|
||||||
|
logs(data.toString());
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log tout simplement la chaine du caractère
|
||||||
|
* @param data La chaine a écrire
|
||||||
|
* @return Cette même chaine (pour faire des chaînes)
|
||||||
|
*/
|
||||||
|
public String logs(String data) {
|
||||||
|
tempMsg += data;
|
||||||
|
log();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump TOUS les objets donnée
|
||||||
|
* @param data Les objets a donner
|
||||||
|
* @return Le String aui a été affiché
|
||||||
|
*/
|
||||||
|
public String log(Object... data) {
|
||||||
|
String concat = "";
|
||||||
|
for (Object object : data)
|
||||||
|
concat += object.toString();
|
||||||
|
return logs(concat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Écrit le buffer avec le préfix et un retour a la ligne
|
||||||
|
* @return La chaine écrite, null si il y a eu un problème
|
||||||
|
*/
|
||||||
|
public String log() {
|
||||||
|
try {
|
||||||
|
os.write(head().replace("\n", "\\n").getBytes());
|
||||||
|
os.write(tempMsg.replace("\n", "\\n").getBytes(charset));
|
||||||
|
os.write('\n');
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
System.err.println("Le charset "+charset+"n'est pas reconnu par Java :");
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.err.println("Impossible de logger votre texte, une erreur de fichiers est apparue");
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String out = tempMsg;
|
||||||
|
tempMsg = "";
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Génère un préfix à inserer devant les lignes
|
||||||
|
* @return ce préfix
|
||||||
|
*/
|
||||||
|
public String head() {
|
||||||
|
return formatString
|
||||||
|
.replace("§\\£µnanotimeµ£\\§", Long.toString(System.nanoTime(),10))
|
||||||
|
.replace("§\\£µtimestampµ£\\§", Long.toString(System.currentTimeMillis(),10))
|
||||||
|
.replace("§\\£µdateµ£\\§", Calendar.getInstance().getTime().toString())
|
||||||
|
.replace("§\\£µthreadµ£\\§", Thread.currentThread().getName());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Récupérer le canal de sortie
|
||||||
|
* @return Le canal de sortie
|
||||||
|
*/
|
||||||
|
OutputStream os() {
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
}
|
||||||
115
src/com/bernard/logMachine/Logger.java
Normal file
115
src/com/bernard/logMachine/Logger.java
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
package com.bernard.logMachine;
|
||||||
|
|
||||||
|
import java.awt.geom.IllegalPathStateException;
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Un objet qui rescence les <code>LogChan</code> pour permettre de les gérer correctement.
|
||||||
|
* Une instance devrait être créée pour chaque fonction pouvant créer plusieurs 'sous-chans'
|
||||||
|
* @see LogChan
|
||||||
|
* @author mysaa
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Logger{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Liste les chans gérés par ce Logger
|
||||||
|
*/
|
||||||
|
Map<String,LogChan> chans = new HashMap<>();
|
||||||
|
/**
|
||||||
|
* Liste des canaux de sortie associés aux LogChan
|
||||||
|
* @see chans
|
||||||
|
*/
|
||||||
|
Map<String,OutputStream> outputStreams = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Le message de fin, affiché lorsque un chan est fermé
|
||||||
|
*/
|
||||||
|
public static String endMessage = "##########FIN DU LOG##########";
|
||||||
|
|
||||||
|
public Logger() {
|
||||||
|
chans = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cree un nouveau canal, au nom aléatoire (UUID)
|
||||||
|
* @param f le fichier de sortie du canal
|
||||||
|
* @return le le LogChan ainsi créé
|
||||||
|
* @throws IllegalPathStateException Si le fichier ne peut pas être écrit
|
||||||
|
*/
|
||||||
|
public LogChan newChan(File f) {
|
||||||
|
String logchanName = UUID.randomUUID().toString();
|
||||||
|
try {
|
||||||
|
if((f.exists())?!f.canWrite():!f.createNewFile());
|
||||||
|
OutputStream os = new FileOutputStream(f);
|
||||||
|
LogChan logChan = new LogChan(os);
|
||||||
|
chans.put(logchanName, logChan);
|
||||||
|
outputStreams.put(logchanName, os);
|
||||||
|
return logChan;
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new IllegalPathStateException("Ye suis désolé ye ne peut pas yécrire sur cé fichié ('"+f+"') ... disolé");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ferme le LogChan ainsi nommé (et y envoie le message de fin)
|
||||||
|
* @param name Le nom du canal a fermer
|
||||||
|
*/
|
||||||
|
public void closeChan(String name) {
|
||||||
|
try {
|
||||||
|
chans.get(name).println(endMessage);
|
||||||
|
outputStreams.get(name).close();
|
||||||
|
outputStreams.remove(name);
|
||||||
|
chans.remove(name);
|
||||||
|
}catch(NullPointerException|IOException e){
|
||||||
|
System.err.println("Impossible de fermer le canal "+name);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ferme le LogChan donné (et y envoie le message de fin)
|
||||||
|
* @param chan Le canal a fermer
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void closeChan(LogChan chan) {
|
||||||
|
try {
|
||||||
|
Iterator<Entry<String, LogChan>> entries = chans.entrySet().iterator();
|
||||||
|
while (entries.hasNext()) {
|
||||||
|
Entry<String, LogChan> l = entries.next();
|
||||||
|
if(l.getValue().equals(chan)){
|
||||||
|
chans.get(l.getKey()).println(endMessage);
|
||||||
|
outputStreams.get(l.getKey()).close();;
|
||||||
|
outputStreams.remove(l.getKey());
|
||||||
|
entries.remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new NullPointerException("Le canal n'est pas associé à ce Logger et je ne peut donc pas le fermer !");
|
||||||
|
}catch(NullPointerException|IOException e){
|
||||||
|
System.err.println("Impossible de fermer le canal "+chan);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ferme tous les canaux associés a ce Logger
|
||||||
|
* (Bonne idée pour la fin du programme)
|
||||||
|
*/
|
||||||
|
public void closeEverybody(){
|
||||||
|
ArrayList<String> names = new ArrayList<>();
|
||||||
|
names.addAll(chans.keySet());
|
||||||
|
for (String name : names)
|
||||||
|
closeChan(name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user