0.8
Sorting media using crowdsourcing.   
Doxygen
LIRIS

Interpreter.java

Go to the documentation of this file.
00001 package myShell;
00002 
00003 import java.io.BufferedReader;
00004 import java.io.BufferedWriter;
00005 import java.io.File;
00006 import java.io.FileInputStream;
00007 import java.io.FileOutputStream;
00008 import java.io.FileWriter;
00009 import java.io.InputStream;
00010 import java.io.InputStreamReader;
00011 import java.util.*;
00012 
00013 import myDataBases.MediaBase;
00014 
00015 import org.jdom.*;
00016 import org.jdom.input.SAXBuilder;
00017 import org.jdom.output.Format;
00018 import org.jdom.output.XMLOutputter;
00019 
00020 
00021 
00034 public class Interpreter {
00035 
00036       00037       // Fields
00038       00039 
00043       private MediaBase mediaBase;
00047       private Integer numberOfMedia;
00048 
00049   
00050       00051       // Constructors
00052       00053 
00062       public Interpreter (MediaBase database)
00063       {
00064             // media
00065             this.mediaBase = database;
00066             this.numberOfMedia = 0;
00067             for (Integer[] array : this.mediaBase.getAllMedia())
00068                   this.numberOfMedia += array.length;
00069       }
00070   
00071       00072       // Methods
00073       00074 
00075 
00076 
00077 // ============================== SETTINGS =========================================
00078 
00079 
00089       public static Map <String,String> getConfig()
00090       {
00091             Element rootConfig;
00092             org.jdom.Document documentConfig;
00093           Map <String,String> conf = new Hashtable <String,String>() ;
00094             SAXBuilder sxb = new SAXBuilder();
00095             try
00096             {
00097                   documentConfig= sxb.build(new File("../data/config.xml"));
00098                 rootConfig = documentConfig.getRootElement();
00099                 Element constants = rootConfig.getChild("constants");
00100                   Iterator it = constants.getChildren().iterator();
00101                   while (it.hasNext())
00102                   {
00103                         Element current = (Element)it.next();
00104                         conf.put(current.getName(), current.getValue());
00105                   }
00106             }
00107           catch(Exception e){ e.printStackTrace(); }
00108             return conf ;
00109       }
00110   
00111   
00120       public static List<String> getAxes()
00121       {
00122 
00123             Element rootConfig;
00124             org.jdom.Document documentConfig;
00125             SAXBuilder sxb = new SAXBuilder();
00126             List<String> listAxes = new ArrayList <String>() ;
00127             try
00128             {
00129                   documentConfig= sxb.build(new File("../data/config.xml"));
00130                   rootConfig = documentConfig.getRootElement();
00131                   Element axes = rootConfig.getChild("axes");
00132                   if (axes != null)
00133                   {
00134                         Iterator it = axes.getChildren().iterator();
00135                         while (it.hasNext())
00136                         {
00137                               Element current = (Element)it.next();
00138                               listAxes.add(current.getValue());
00139                         }
00140                   }
00141                   else
00142                         listAxes = null;
00143             }
00144             catch(Exception e){ e.printStackTrace(); }
00145             return listAxes;
00146       }
00147 
00148 
00149 
00150 
00168       public static List<String> getFields(String fields)
00169       {
00170             Element rootConfig;
00171             org.jdom.Document documentConfig;
00172             List<String> listFields = new ArrayList <String>() ;
00173             if ( (fields.equals("SQLfield")) || (fields.equals("SQLtype")) || (fields.equals("CSVfield")) )
00174             {
00175                   SAXBuilder sxb = new SAXBuilder();
00176                   try
00177                   {
00178                         documentConfig= sxb.build(new File("../data/config.xml"));
00179                         rootConfig = documentConfig.getRootElement();
00180                         Element HDfields = rootConfig.getChild("hardDataFields");
00181                         Iterator it = HDfields.getChildren().iterator();
00182                         while (it.hasNext())
00183                         {
00184                               Element current = (Element)it.next();
00185                               String entry = current.getChild(fields).getValue() ;
00186                               if (entry.length() > 1)
00187                                     listFields.add(entry);
00188                         }
00189                   }
00190                   catch(Exception e){ e.printStackTrace(); }
00191             }
00192             else
00193                   listFields = null;
00194             return listFields;
00195       }
00196 
00197 
00222       public static Boolean checkFile(LogWriter log)
00223       {
00224             Boolean fine = true;
00225             log.append("------- Checking config.xml");
00226 
00227             // checking the constants
00228             Map<String,String> configContent = getConfig() ;
00229             String[] necessaryConstants = { "mediaPath", "sqlBase", "sqlUser", "antechamberUrl", "cfKey", "cfJobNumber" };
00230             for (String constant : necessaryConstants)
00231                   if (configContent.keySet().contains(constant))
00232                         log.append(constant+" constant found");
00233                   else
00234                   {
00235                         log.append("ERROR : " + constant + " NOT FOUND. Interrupting.");
00236                         fine = false;
00237                   }
00238             
00239             // checking the presence of axes
00240             List<String> axes = getAxes() ;
00241             if (axes == null)
00242             {
00243                   fine = false;
00244                   log.append("ERROR : no axis found. Interrupting.");
00245             }
00246             else
00247                   log.append(axes.size() + " axes found.");
00248             
00249             // checking the content of the hard data fields
00250             List<String> fields = getFields("SQLfield");
00251             String[] necessaryFields = { "media1", "media2", "greater", "axis" };
00252             if (fields == null)
00253                   log.append("ERROR : no 'hardDataFields' section in the config.xml. Interrupting.");
00254             else
00255                   for (String field : necessaryFields)
00256                         if (fields.contains(field))
00257                               log.append(field +" found in the hardDataFields section");
00258                         else
00259                         {
00260                               log.append("ERROR : " + field + " NOT FOUND in the hardDataFields section. Interrupting.");
00261                               fine = false;
00262                         }
00263             
00264             log.append("------- END check config.xml\n");
00265             return fine;
00266       }
00267 
00268 
00269 
00270 // ============================== PREVIOUS RESULTS =====================================
00271 
00272 
00278       public static Integer getLastJob()
00279       {
00280             Integer id = 0;
00281             try{
00282                   InputStream ips = new FileInputStream("../data/previously/lastJob"); 
00283                   InputStreamReader ipsr = new InputStreamReader(ips);
00284                   BufferedReader br = new BufferedReader(ipsr);
00285                   id = Integer.parseInt(br.readLine());
00286                   br.close(); 
00287             }           
00288             catch (Exception e){ e.printStackTrace(); }
00289             return id;
00290       }
00291       
00292       
00298       public static void setLastJob(Integer id)
00299       {
00300             try
00301             {
00302                   FileWriter fw = new FileWriter("../data/previously/lastJob", false);
00303                   BufferedWriter output = new BufferedWriter(fw);
00304                   output.write(id.toString());
00305                   output.flush();
00306                   output.close();
00307             } catch(Exception e) { e.printStackTrace(); }
00308       }
00309 
00310 
00321       private List<Integer[]> parsePrevious(String axis)
00322       {
00323             Element rootPrevious;
00324             org.jdom.Document documentPrevious;
00325             List<Integer[]> result = new ArrayList<Integer[]>();
00326             SAXBuilder sxb = new SAXBuilder();
00327             try
00328             {
00329                   documentPrevious = sxb.build(new File("../data/previously/" + axis + ".xml"));
00330                 rootPrevious = documentPrevious.getRootElement();
00331                   Iterator it = rootPrevious.getChildren().iterator();
00332                   while (it.hasNext())
00333                   {
00334                         Element array = (Element)it.next();
00335                         List<Integer> arrayContent = new ArrayList<Integer>();
00336                         Iterator jt = array.getChildren().iterator();
00337                         while (jt.hasNext())
00338                         {
00339                               Element entry = (Element)jt.next();
00340                               arrayContent.add (Integer.parseInt(entry.getValue()) );
00341                         }
00342                         result.add(arrayContent.toArray(new Integer[0]));
00343                   }
00344             }
00345             catch(Exception e){ e.printStackTrace(); }
00346             
00347             return result;
00348       }
00349 
00350       
00367       public List<Integer[]> getCurrentState(LogWriter log, String axis)
00368       {
00369             List<Integer[]> lst;
00370             File previouslyInCPS = new File("../data/previously/");
00371             // checking if the file exists.
00372             Integer count = 0;
00373             for (String file : previouslyInCPS.list())
00374                   if (file.equals(axis + ".xml"))
00375                         break;
00376                   else
00377                         count ++;
00378             if (count == previouslyInCPS.list().length)
00379             {
00380                   lst = new ArrayList<Integer[]>();
00381                   lst = this.mediaBase.getAllMedia();
00382                   log.append("[DONE] Reading media to sort.\n   ... Note: no previous results found for " + axis +
00383                               ": starting from the beginning.");
00384             }
00385             else
00386             {
00387                   lst = parsePrevious(axis);
00388                   log.append("[DONE] Reading media to sort.\n   ... Note: previous results found for " + axis +
00389                               ": starting where we left.");
00390             }
00391             return lst;
00392       }
00393 
00394 
00395 
00396 // ============================== SAVING RESULTS =====================================
00397       
00398       
00399       
00411       public void generateIntermediaryXMLs(String xmlFile, List<Integer[]> content)
00412       {
00413 
00414             Element rootResults = new Element("results");
00415             org.jdom.Document documentResults = new Document(rootResults);
00416             
00417             Map<Integer, Map<String,String>> mediaCharac= this.mediaBase.getContent();
00418             Map<String,String> media ;
00419             Element charac;
00420             
00421             for (Integer[] array : content)
00422             {
00423                   Element arrayElement = new Element("array");
00424                   for (Integer mediaID : array)
00425                   {
00426                         Element identifier = new Element("id");
00427                         identifier.setText(String.valueOf(mediaID));
00428                         arrayElement.addContent(identifier);
00429                   }
00430                   rootResults.addContent(arrayElement);
00431             }
00432             try
00433             {
00434                   XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
00435                   sortie.output(documentResults, new FileOutputStream(xmlFile));
00436             }
00437             catch (Exception e){ e.printStackTrace(); }
00438       }
00439 
00440         
00452       private Double rank2value(Integer rank)
00453       {
00454             Double value =  ( (2.0*rank)/(this.numberOfMedia-1) ) - 1.0;
00455             return value;
00456       }
00457 
00458 
00475       private List< Map<String,Integer> > preformating(Map<String,Integer[]> sortResults)
00476       {
00477             List< Map<String,Integer> > newMap = new ArrayList< Map<String,Integer> >();
00478             // loop on the ID of the media considered
00479             for (int media=0; media<this.numberOfMedia; media++)
00480             {
00481                   Map<String,Integer> mediaRanks = new Hashtable<String,Integer>();
00482                   // loop on the label of the axis considered
00483                   for ( String axis : sortResults.keySet() )
00484                   {
00485                         int rank = 0;
00486                         // loop to find the rank of the media along the "axis" axis
00487                         while (rank<sortResults.get(axis).length)
00488                               if (sortResults.get(axis)[rank] == media)
00489                                     break;
00490                               else
00491                                     rank++ ;
00492                         mediaRanks.put(axis,rank);
00493                   }
00494                   newMap.add(mediaRanks);
00495             }
00496             return newMap;
00497       }
00498 
00499 
00516       public String generateFinalXML(String xmlFile, Map<String,Integer[]> sortResults)
00517       {
00518             Element rootResults = new Element("results");
00519             org.jdom.Document documentResults = new Document(rootResults);
00520             Map<Integer, Map<String,String>> mediaCharac= this.mediaBase.getContent();
00521             Map<String,String> media ;
00522             List< Map<String,Integer> > results = this.preformating(sortResults) ;
00523             Element charac;
00524             String xmlString = "A problem was encoutered!";
00525             for (Integer mediaID : mediaCharac.keySet())
00526             {
00527                   // retrieving information on this media
00528                   media = mediaCharac.get(mediaID);
00529                   // creation of a new node corresponding to a new media
00530                   Element mediaElement = new Element("media");
00531                   Attribute identifier = new Attribute("id",String.valueOf(mediaID));
00532                   mediaElement.setAttribute(identifier);
00533                   for (String entry : media.keySet())
00534                   {
00535                         charac = new Element(entry);
00536                         charac.setText(media.get(entry));
00537                         mediaElement.addContent(charac);
00538                   }
00539                   // addition of its values along each axis
00540                   Map<String,Integer> resultsForThisMedia = results.get(mediaID); 
00541                   for ( Iterator<String> emotion = resultsForThisMedia.keySet().iterator(); emotion.hasNext(); )
00542                   {
00543                         String axis = emotion.next();
00544                         Integer rank = resultsForThisMedia.get(axis);
00545                         Element coordinate = new Element(axis);
00546                         coordinate.setText(this.rank2value(rank).toString());
00547                         mediaElement.addContent(coordinate);
00548                   }
00549                   rootResults.addContent(mediaElement);
00550             }
00551             // Writing the xml Document in a hard file
00552             try
00553             {
00554                   XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
00555                   sortie.output(documentResults, new FileOutputStream(xmlFile));
00556                   xmlString = sortie.outputString(documentResults);
00557             }
00558             catch (Exception e){ e.printStackTrace(); }
00559             return xmlString;
00560       }
00561 
00562 }
 All Classes Namespaces Files Functions Variables