import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import mixer.*;
/*
* 1.1.1
* Karl-Adam Karlsson
* 06-11-01
*
* Servlet för besökar räkning.
* Testad på localhost med tomcat.
*
* synchronized använt vid filhanterinegn.
* Detta borde se till att inget dumt händer. Eftersom, som jag förstår det
* är det tomcat som kör det hela med nya trådar varje gång, så
* synchronized borde se till att tomcat inte trådar till det underligt.
*
*/
public class SeparatedCounter extends HttpServlet {
public void doGet( HttpServletRequest req, HttpServletResponse res )
throws IOException
{
//res.setContentType( "text/html" );
String htmlTemplate = Mixer.getContent( getHtmlFile("count.html") );
Mixer m = new Mixer(htmlTemplate);
PrintWriter targetClient = res.getWriter();
long number = getCounter();
number++;
String aNo = Long.toString(number);
System.out.println(htmlTemplate);
//targetClient.println( "
Servlet Counter" );
//targetClient.println( "Greetings visitor number: " + number +"
" );
//Sätt variebeln i .html dokumentet till number.
m.add("===number===", aNo);
res.setContentType("text/html");
targetClient.println(m.getMix());
saveCounter(number);
//Skriv ut detta nummer.
//targetClient.println( );
//Lägg till ett och spara fil.
targetClient.close();
}
/*
* laddar en fil.
* Var tidigare synchronized, men såg i källkoden för mixer att den ändå använde synchronized,
* så jag tog bort det här. Verkade vara overkill
* att synchroniza dubbelt.
* Används för att ladda till Mixer.
* Notera att filen måste ligga i rätt mapp.
* För mig, på localhost, var detta examples i tomcat.
* Men det är ju en inställningsfråga.
* Finns inte filen skriver man bara ut stacktrace.
*
*
* @param String name The name of the file to load
* @return File The loaded file.
*/
private File getHtmlFile(String name){
File f = new File(getServletContext().getRealPath(name));
return f;
}
/* Syncroniserad getCountermetod, som laddar data från fil returnerar en long.
*
*/
private synchronized long getCounter(){
long ano = 0;
try{
// Öppna fil och hämta info om beöksnummer.
// Använder ett statiskt filnamn, eftersom alla skall ju använda samma.
File f = new File(getServletContext().getRealPath("counter"));
//Om detta e true har vi skapat, ny. Ergo filen fanns inte vi e alltså beökare no. 1 och skall
// skriva 1 till filen.
if(f.createNewFile()){
ano = 0;
return ano;
}else{
//Annars läser vi vad som finns och ökar med ett.
FileInputStream fin = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fin);
ano = (long)ois.readLong();
ois.close();
fin.close();
}
}catch(IOException ioe){
ioe.printStackTrace();
}
return ano;
}
/*
* Synkronisearad save counter som sparar.
* long anumber till counterfil.
*/
private synchronized void saveCounter(long anumber){
try{
//Tar bort gamla filen.
File oldfile = new File(getServletContext().getRealPath("counter"));
oldfile.delete();
//Skapar nu counter fil
File fout = new File(getServletContext().getRealPath("counter"));
FileOutputStream os = new FileOutputStream(fout);
ObjectOutputStream oos = new ObjectOutputStream(os);
//Skriver till tempfil
oos.writeLong(anumber);
oos.close();
os.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}