Commit 1daac106a7327e9e3e2c3483e9263235c2f47112

Authored by Imanol-Mikel Barba Sabariego
1 parent 1288a4bb

Parser completado, falta testearlo y la funcion de Marc para que acabe de funcionar

src/com/upc/pbe/upcnews/List.java
@@ -5,13 +5,15 @@ import java.util.ArrayList; @@ -5,13 +5,15 @@ import java.util.ArrayList;
5 public class List 5 public class List
6 { 6 {
7 private boolean validated; 7 private boolean validated;
  8 + private int quality;
8 private int sequenceFirst; 9 private int sequenceFirst;
9 private int maxDuration; 10 private int maxDuration;
10 - private ArrayList<Segment> segments; 11 + private ArrayList<Segment> segments; //Lista de SEGMENTOS
11 private ParentList parent; 12 private ParentList parent;
12 13
13 - public List() 14 + public List(int q)
14 { 15 {
  16 + quality = q;
15 validated = false; 17 validated = false;
16 segments = new ArrayList<Segment>(); 18 segments = new ArrayList<Segment>();
17 } 19 }
@@ -46,6 +48,11 @@ public class List @@ -46,6 +48,11 @@ public class List
46 return maxDuration; 48 return maxDuration;
47 } 49 }
48 50
  51 + public int getQuality()
  52 + {
  53 + return quality;
  54 + }
  55 +
49 public void setParent(ParentList p) 56 public void setParent(ParentList p)
50 { 57 {
51 parent = p; 58 parent = p;
src/com/upc/pbe/upcnews/ParentList.java
@@ -6,13 +6,18 @@ public class ParentList @@ -6,13 +6,18 @@ public class ParentList
6 { 6 {
7 private String ID; 7 private String ID;
8 private int currentQuality; 8 private int currentQuality;
  9 + private String Type, Name;
  10 + private boolean Default; //Estos 3 últimos son para los ext-x-media, los ext-x-stream lo IGNORAN
9 private ArrayList<List> lists; //per cada qualitat 11 private ArrayList<List> lists; //per cada qualitat
10 12
11 public ParentList(String ID) 13 public ParentList(String ID)
12 { 14 {
13 this.ID = ID; 15 this.ID = ID;
14 currentQuality = 0; 16 currentQuality = 0;
15 - lists = new ArrayList<List>(); 17 + Type = "";
  18 + Name = "";
  19 + Default = false;
  20 + lists = new ArrayList<List>(); //Lista de CALIDADES
16 } 21 }
17 22
18 public String getID() 23 public String getID()
@@ -20,15 +25,42 @@ public class ParentList @@ -20,15 +25,42 @@ public class ParentList
20 return ID; 25 return ID;
21 } 26 }
22 27
23 - public int getQuality() 28 + public int getCurrentQuality()
24 { 29 {
25 return currentQuality; 30 return currentQuality;
26 } 31 }
27 - public void setQuality(int q) 32 + public void setCurrentQuality(int q)
28 { 33 {
29 currentQuality = q; 34 currentQuality = q;
30 } 35 }
31 36
  37 + public boolean getDefault()
  38 + {
  39 + return Default;
  40 + }
  41 + public void setDefault(boolean d)
  42 + {
  43 + Default = d;
  44 + }
  45 +
  46 + public String getType()
  47 + {
  48 + return Type;
  49 + }
  50 + public void setType(String t)
  51 + {
  52 + Type = t;
  53 + }
  54 +
  55 + public String getName()
  56 + {
  57 + return Name;
  58 + }
  59 + public void setName(String n)
  60 + {
  61 + Name = n;
  62 + }
  63 +
32 public ArrayList<List> getLists() 64 public ArrayList<List> getLists()
33 { 65 {
34 return lists; 66 return lists;
src/com/upc/pbe/upcnews/Parser.java
@@ -30,10 +30,13 @@ public class Parser @@ -30,10 +30,13 @@ public class Parser
30 { 30 {
31 ArrayList<ParentList> lists = new ArrayList<ParentList>(); 31 ArrayList<ParentList> lists = new ArrayList<ParentList>();
32 lists.add(new ParentList("")); 32 lists.add(new ParentList(""));
33 - lists.get(0).getLists().add(new List()); 33 + lists.get(0).getLists().add(new List(-1));
34 String[] lines = file.split("\n"); 34 String[] lines = file.split("\n");
35 for(int i = 0; i < lines.length; i++) 35 for(int i = 0; i < lines.length; i++)
36 { 36 {
  37 + /*
  38 + * TO-DO: Detectar los \ y juntarlos en una sola linea
  39 + */
37 parseLine(lines[i],lists); 40 parseLine(lines[i],lists);
38 } 41 }
39 /* 42 /*
@@ -47,6 +50,10 @@ public class Parser @@ -47,6 +50,10 @@ public class Parser
47 * PD: En el último nivel de profundidad hay una lista de segmentos (debajo de calidades). 50 * PD: En el último nivel de profundidad hay una lista de segmentos (debajo de calidades).
48 * Allí está el auténtico tesoro de Narnia. 51 * Allí está el auténtico tesoro de Narnia.
49 */ 52 */
  53 + for(int i = 0; i < lists.size(); i++)
  54 + {
  55 + sortQuality(lists.get(i));
  56 + }
50 return lists; 57 return lists;
51 } 58 }
52 59
@@ -62,6 +69,40 @@ public class Parser @@ -62,6 +69,40 @@ public class Parser
62 return -1; 69 return -1;
63 } 70 }
64 71
  72 + private void sortQuality(ParentList ppls)
  73 + {
  74 + ArrayList<List> lists = ppls.getLists();
  75 + if(lists.get(0).getQuality() == -1)
  76 + {
  77 + /*
  78 + * Se trata de ext-x-media's y estos no van por calidad
  79 + */
  80 + return;
  81 + }
  82 + //BUBBLE-SORT!! (Me da un poco de verguenza, pero no quiero ponerme con quicksort...
  83 + while(true)
  84 + {
  85 + boolean sorted = true;
  86 + int i = 0;
  87 + do
  88 + {
  89 + if(lists.get(i).getQuality() < lists.get(i+1).getQuality())
  90 + {
  91 + sorted = false;
  92 + List aux = lists.get(i);
  93 + lists.set(i, lists.get(i+1));
  94 + lists.set(i+1, aux);
  95 + }
  96 +
  97 + }while(++i != lists.size());
  98 + if(sorted)
  99 + {
  100 + break;
  101 + }
  102 + }
  103 +
  104 + }
  105 +
65 public void parseLine(String line, ArrayList<ParentList> lists) throws ErrorException, WarningException, InfoException 106 public void parseLine(String line, ArrayList<ParentList> lists) throws ErrorException, WarningException, InfoException
66 { 107 {
67 if(line.isEmpty()) 108 if(line.isEmpty())
@@ -72,7 +113,7 @@ public class Parser @@ -72,7 +113,7 @@ public class Parser
72 else 113 else
73 { 114 {
74 ParentList ppls = lists.get(currentList); //VIVA HONDURAS!!! 115 ParentList ppls = lists.get(currentList); //VIVA HONDURAS!!!
75 - List pls = ppls.getLists().get(ppls.getQuality()); 116 + List pls = ppls.getLists().get(ppls.getCurrentQuality());
76 if(!pls.getValidated()) 117 if(!pls.getValidated())
77 { 118 {
78 if(line.equals(STARTWORD)) 119 if(line.equals(STARTWORD))
@@ -98,8 +139,7 @@ public class Parser @@ -98,8 +139,7 @@ public class Parser
98 else if(extTag[0].equals("#EXT-X-TARGETDURATION")) 139 else if(extTag[0].equals("#EXT-X-TARGETDURATION"))
99 { 140 {
100 pls.setMaxDuration(Integer.parseInt(extTag[1])); 141 pls.setMaxDuration(Integer.parseInt(extTag[1]));
101 - }  
102 - 142 + }
103 else if(extTag[0].equals("#EXTINF")) 143 else if(extTag[0].equals("#EXTINF"))
104 { 144 {
105 if(fileType == -1) 145 if(fileType == -1)
@@ -146,13 +186,14 @@ public class Parser @@ -146,13 +186,14 @@ public class Parser
146 String[] arguments = extTag[1].split(","); 186 String[] arguments = extTag[1].split(",");
147 for(int i = 0; i < arguments.length; i++) 187 for(int i = 0; i < arguments.length; i++)
148 { 188 {
149 - if(arguments[i].equals("PROGRAM-ID")) 189 + String[] argument = arguments[i].split("=");
  190 + if(argument[0].equals("PROGRAM-ID"))
150 { 191 {
151 - programID = arguments[i]; 192 + programID = argument[1];
152 } 193 }
153 - else if(arguments[i].equals("BANDWIDTH")) 194 + else if(argument[0].equals("BANDWIDTH"))
154 { 195 {
155 - bandwidth = Integer.parseInt(arguments[i]); 196 + bandwidth = Integer.parseInt(argument[1]);
156 } 197 }
157 } 198 }
158 if(programID.equals("")|| bandwidth == -1) 199 if(programID.equals("")|| bandwidth == -1)
@@ -181,16 +222,124 @@ public class Parser @@ -181,16 +222,124 @@ public class Parser
181 * ppls y pls se actualizan en la siguiente linea procesada 222 * ppls y pls se actualizan en la siguiente linea procesada
182 */ 223 */
183 } 224 }
  225 + else
  226 + {
  227 + ppls = lists.get(currentList);
  228 + ppls.getLists().add(new List(bandwidth));
  229 + }
184 } 230 }
185 } 231 }
  232 + else
  233 + {
  234 + ppls.getLists().add(new List(bandwidth));
  235 + }
186 } 236 }
187 else if(extTag[0].equals("#EXT-X-MEDIA")) 237 else if(extTag[0].equals("#EXT-X-MEDIA"))
188 { 238 {
189 - //TO-DO 239 + if(fileType == -1)
  240 + {
  241 + fileType = 1;
  242 + }
  243 + else if(fileType == 0)
  244 + {
  245 + throw new ErrorException("Invalid file, should contain Segments, " +
  246 + "but lists were found.");
  247 + }
  248 + String Type = "";
  249 + String Name = "";
  250 + String GroupID = "";
  251 + String URI = "";
  252 + boolean Default = false;
  253 + String[] arguments = extTag[1].split(",");
  254 + for(int i = 0; i < arguments.length; i++)
  255 + {
  256 + String[] argument = arguments[i].split("=");
  257 + if(argument[0].equals("NAME"))
  258 + {
  259 + Name = argument[1];
  260 + }
  261 + else if(argument[0].equals("TYPE"))
  262 + {
  263 + Type = argument[1];
  264 + }
  265 + else if(argument[0].equals("GROUP-ID"))
  266 + {
  267 + GroupID = argument[1];
  268 + }
  269 + else if(argument[0].equals("DEFAULT"))
  270 + {
  271 + if(argument[1].equals("YES"))
  272 + {
  273 + Default = true;
  274 + }
  275 + else if(argument[1].equals("NO"))
  276 + {
  277 + Default = true;
  278 + }
  279 + else
  280 + {
  281 + throw new ErrorException("Invalid value for argument DEFAULT on line " +
  282 + currentLine);
  283 + }
  284 + }
  285 + else if(argument[0].equals("URI"))
  286 + {
  287 + URI = argument[1];
  288 + }
  289 + }
  290 + if(Type.equals("") || Name.equals("") || URI.equals("") || GroupID.equals(""))
  291 + {
  292 + throw new ErrorException("Playlist on line " + currentLine +
  293 + " has missing arguments");
  294 + }
  295 + ParentList pl = new ParentList(GroupID);
  296 + pl.setDefault(Default);
  297 + pl.setName(Name);
  298 + pl.setType(Type);
  299 + /*
  300 + * Procesar URI y descargar listas recursivamente y añadir a la lista actual.
  301 + *
  302 + * TO-DO: Necesito la funcion de Marc
  303 + */
  304 + List l = new List(-1);
  305 + if(!GroupID.equals(ppls.getID()))
  306 + {
  307 + if(ppls.getID().equals(""))
  308 + {
  309 + /*
  310 + * Este caso se da cuando no se ha creado ninguna lista.
  311 + * Hay que sustituir la por defecto por una lista real.
  312 + */
  313 + lists.add(0,pl);
  314 + }
  315 + else
  316 + {
  317 +
  318 + currentList = searchID(ppls.getID(), lists);
  319 + if(currentList == -1)
  320 + {
  321 + lists.add(pl);
  322 + currentList = lists.size()+1;
  323 + }
  324 + else
  325 + {
  326 + ppls = lists.get(currentList);
  327 + ppls.getLists().add(l);
  328 + }
  329 + }
  330 + }
  331 + else
  332 + {
  333 + ppls.getLists().add(l);
  334 + }
190 } 335 }
191 336
192 else if(extTag[0].equals("#EXT-X-ENDLIST")) 337 else if(extTag[0].equals("#EXT-X-ENDLIST"))
193 { 338 {
  339 + if(expectSegment || expectList)
  340 + {
  341 + throw new ErrorException("Unexpected end of list!");
  342 + }
194 //END REACHED, IGNORE AND LET THE FILE REACH EOF 343 //END REACHED, IGNORE AND LET THE FILE REACH EOF
195 } 344 }
196 345
@@ -242,4 +391,4 @@ public class Parser @@ -242,4 +391,4 @@ public class Parser
242 currentLine++; 391 currentLine++;
243 } 392 }
244 } 393 }
245 -} 394 -}
  395 +}
246 \ No newline at end of file 396 \ No newline at end of file