import java.io.*; import java.util.*; import mixer.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.LinkedList; import java.net.InetAddress; // OBS, använder Apache Jakarta Commons FileUpload package // http://jakarta.apache.org/commons/fileupload/ // http://jakarta.apache.org/commons/io/ import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /* * Gesällprov, IP2. * Interactivator.java * Karl-Adam Karlsson * 06-11-15 * * Konstruerar ett html dokument innehållande text och val enligt * data som parser laddat. * * Kan anvädas som verktyg för interaktiva berättelser, * inspiration från: http://www.gamebooks.org/show_series_images.php?id=644 * * Man kan också ha ett antal andra användningsområden. * */ public class Interactiveator extends HttpServlet { LinkedList allComponents; PrintWriter targetClient=null; HttpServletRequest req2; //Doget public synchronized void doGet( HttpServletRequest req, HttpServletResponse res ) throws IOException { res.setContentType( "text/html" ); targetClient = res.getWriter(); req2 = req; if( req.getParameterValues("file")!=null ){ //Har ett filnamn vi vill använda String filename = req.getParameterValues("name")[0]; //Parsar filen och får tillbaka en länkad lista Parser p = new Parser(filename, this); allComponents = p.parse(); //Skriv sedan ut första komponenten mixComponent((Komponent)allComponents.getFirst()); } else if(req.getParameterValues("radio_button")!=null){ // Anropet innehåller en targetcomponent // Vi skall då leta reda på denna i allComponents // och 'skriva' ut mha mixer //hämta targetcomponentvärdet från radio_button String targetname = req.getParameterValues("radio_button")[0]; boolean aBool=true; //leta reda på rätt komponent int i=0; while(i"); targetClient.print(""); targetClient.println(""); targetClient.println(""); targetClient.println("

"); targetClient.println(""); targetClient.println("

"); }else if(FileUpload.isMultipartContent(req) && req!=null){ //FILEUPLOAD FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //////////////////////////////////////////////////////////////////// try{ List items = upload.parseRequest(req); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); String name = new String(); if (item.isFormField()) { if(item.getFieldName().equals("name")) name = item.getString(); } else{ byte[] data = item.get(); name = item.getName(); System.out.println("NAME: "+name); File f = new File(getServletContext().getRealPath("docs/"+name)); FileOutputStream fout = new FileOutputStream(f); fout.write(data); fout.close(); } } }catch(FileUploadException foo){ targetClient.print(foo.toString()); } }else{ //Nej, lista filer och länka till dem. File f = new File(getServletContext().getRealPath("docs")); //notera att alla textfilerna skall ligga i docsmappen. String[] filList; filList = f.list(); LinkedList linked = new LinkedList( Arrays.asList( f.list() ) ); // Lite kosmetika //targetClient.print(":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:
"); //targetClient.print(":...........................................:
"); targetClient.print(":.....Choose your interactive adventure.....:
"); //targetClient.print(":...........................................:
"); //targetClient.print(":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:
"); // InetAddress inAd = InetAddress.getLocalHost(); targetClient.println( "'+ "Upload a file" +"" ); targetClient.println("

"); //Skapa länkar i html, så alla filer kan nås for(int i=0;i' +(String)linked.get(i) +"" ); targetClient.println("
"); }//end of for //Alla är listade. // Ett tryck på en länk bör föra oss till if:satsen ovan. } }//end of doGet /* * Dopost, vidarebefordrar till doget. */ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet( req, res ); }//end of dopost /* * Mixes a Komponent into the target html file * * */ private void mixComponent(Komponent aComponent){ String htmlTemplate = Mixer.getContent( getHtmlFile("mall.html") ); Mixer mix = new Mixer(htmlTemplate); //Hämta text LinkedList txt = new LinkedList( aComponent.getText() ); // Hämta targets och choices LinkedList choices = new LinkedList( aComponent.getChoices() ); LinkedList targets = new LinkedList( aComponent.getTargets() ); if(choices.size()==0 || targets.size()==0 ){ //Finns inga alternativ som e okej. // Ändra mixer till lastpage.html htmlTemplate = Mixer.getContent( getHtmlFile("lastpage.html") ); mix = new Mixer(htmlTemplate); // Skriv ut texten while(txt.size()>0){ mix.add("","===storytext===", (String)txt.getFirst() + "
" ); txt.removeFirst(); } try{ InetAddress inAd = InetAddress.getLocalHost(); mix.add("===url===", req2.getRequestURI() );//"http://"+inAd.getHostAddress().toString()+ }catch(IOException unkHo){ targetClient.println(unkHo.toString()); } }else{ //lägg till httpaddress try{ InetAddress inAd = InetAddress.getLocalHost(); mix.add("===target===", req2.getRequestURI() ); }catch(IOException unkHo){ targetClient.println(unkHo.toString()); } // Skriv ut texten while(txt.size()>0){ mix.add("","===storytext===", (String)txt.getFirst() + "
" ); txt.removeFirst(); } // Skriv ut alla handlingsalternativ while(choices.size()>0 && targets.size()>0 ){ mix.add("","===name===", (String)targets.getFirst() ); mix.add("","===val===", (String)choices.getFirst()+"
" ); choices.removeFirst(); targets.removeFirst(); } } //Skriv ut komponenten targetClient.println(mix.getMix()); } /* * laddar en .html fil. * * @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; } /* * Returnar servletcontext * @param path * @return String servletcontext */ public String getContext(String s){ return getServletContext().getRealPath(s); } }