some fixes
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / mensaplan / MensaplanManager.java
1 package de.dhbwloe.campusapp.mensaplan;
2
3 import android.util.Log;
4
5 import java.io.UnsupportedEncodingException;
6 import java.net.URLEncoder;
7 import java.text.DateFormat;
8 import java.text.NumberFormat;
9 import java.text.ParseException;
10 import java.text.SimpleDateFormat;
11 import java.util.ArrayList;
12 import java.util.Date;
13 import java.util.List;
14 import java.util.Locale;
15 import java.util.regex.Matcher;
16 import java.util.regex.Pattern;
17
18 import de.dhbwloe.campusapp.CampusAppContext;
19 import de.dhbwloe.campusapp.network.XmlEntry;
20 import de.dhbwloe.campusapp.network.XmlRequestHelper;
21 import de.dhbwloe.campusapp.search.SearchIndices;
22
23 /**
24  * Created by pk910 on 22.01.2016.
25  */
26 public class MensaplanManager extends XmlRequestHelper {
27     private CampusAppContext AppContext;
28     private boolean bRequestRunning = false;
29     private ArrayList<MensaplanManagerInterface> aCallbackInterfaces = new ArrayList<MensaplanManagerInterface>();
30
31     public MensaplanManager(CampusAppContext context) {
32         AppContext = context;
33     }
34
35     public void performSynchronisation(MensaplanManagerInterface callback) {
36         aCallbackInterfaces.add(callback);
37         if(bRequestRunning)
38             return;
39
40         bRequestRunning = true;
41         String mensaplanUrl = "http://www.swfr.de/index.php?id=1400&type=98&tx_swfrspeiseplan_pi1[apiKey]=c3841e89a2c8c301b890723ecdb786ad&tx_swfrspeiseplan_pi1[ort]=677";
42         requestXmlFromWeb(mensaplanUrl, "plan", "tagesplan");
43     }
44
45     private long getTimeFromDateString(String timestamp) {
46         // 01.03.2016
47         if(timestamp == null)
48             return 0;
49         DateFormat df = new SimpleDateFormat("dd.MM.yyyy", Locale.ENGLISH);
50         try {
51             Date result =  df.parse(timestamp);
52             return result.getTime()/1000;
53         } catch (ParseException e) {
54             return 0;
55         }
56     }
57
58     private int getPriceFromString(String pricestr) {
59         // 2,90€( pro 100g)?
60         if(pricestr == null)
61             return 0;
62         Pattern r = Pattern.compile("^([0-9,]+)€( pro [0-9]+[a-z]+)$");
63         Matcher m = r.matcher(pricestr);
64         if (m.find()) {
65             NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
66             try {
67                 Number result =  nf.parse(m.group(1));
68                 return (int)(result.doubleValue()*100);
69             } catch (ParseException e) {
70                 return 0;
71             }
72         } else
73             return 0;
74     }
75
76     @Override
77     protected void onXmlReceived(List<XmlEntry> entries) {
78         ArrayList<SearchIndices> newIndices = new ArrayList<SearchIndices>();
79
80         Log.i("MPMSync", "Received Mensaplan XML");
81         for(XmlEntry entry : entries) {
82             Log.i("MPMSync", "Parse Tagesplan: "+entry.getAttribute("datum"));
83             long plandate = getTimeFromDateString(entry.getAttribute("datum"));
84             if(plandate == 0)
85                 continue;
86
87             XmlEntry[] menues = XmlEntry.FindXmlEntriesByName(entry, "menue");
88             for(XmlEntry menue : menues) {
89                 XmlEntry centry;
90                 String menuname = menue.getAttribute("art");
91                 Log.i("MPMSync", "Parse menu "+menuname);
92                 if(menuname == null) continue;
93
94                 String additional = menue.getAttribute("zusatz");
95
96                 centry = XmlEntry.FindXmlEntryByName(menue, "name");
97                 String name = (centry == null ? null : centry.getValue());
98
99                 centry = XmlEntry.FindXmlEntryByName(menue, "nameMitUmbruch");
100                 String nameHtml = (centry == null ? null : centry.getValue());
101
102                 centry = XmlEntry.FindXmlEntryByName(menue, "kennzeichnungen");
103                 String notes = (centry == null ? null : centry.getValue());
104
105                 int priceArray[] = new int[4];
106
107                 centry = XmlEntry.FindXmlEntryByName(menue, "studierende");
108                 priceArray[0] = (centry == null ? 0 : getPriceFromString(centry.getValue()));
109                 centry = XmlEntry.FindXmlEntryByName(menue, "angestellte");
110                 priceArray[1] = (centry == null ? 0 : getPriceFromString(centry.getValue()));
111                 centry = XmlEntry.FindXmlEntryByName(menue, "gaeste");
112                 priceArray[2] = (centry == null ? 0 : getPriceFromString(centry.getValue()));
113                 centry = XmlEntry.FindXmlEntryByName(menue, "schueler");
114                 priceArray[3] = (centry == null ? 0 : getPriceFromString(centry.getValue()));
115
116                 MensaTagesplan tagesplan = new MensaTagesplan(plandate, menuname, 0, name, nameHtml, additional, notes, priceArray[0], priceArray[1], priceArray[2], priceArray[3]);
117                 tagesplan.calculateChkSum();
118
119                 AppContext.getDatabaseManager().updateMensaTagesplan(tagesplan);
120
121                 if(tagesplan.getIsNew(true)) {
122                     SearchIndices indices = new SearchIndices("MensaTagesplan#"+tagesplan.getPlanDate()+"|"+tagesplan.getMenuName(), false);
123                     indices.setUpdateTime(tagesplan.getPlanDate());
124                     try {
125                         indices.setTarget("#Mensa#showdate=" + tagesplan.getPlanDate()+"&showmenu=" + URLEncoder.encode(tagesplan.getMenuName(), "UTF-8"));
126                     } catch (UnsupportedEncodingException e) {
127                         indices.setTarget("#Mensa#showdate=" + tagesplan.getPlanDate());
128                     }
129                     indices.setTitle("Mensaplan " + tagesplan.getFormatedDate());
130                     indices.setDescription(tagesplan.getMenuName() + ": " + tagesplan.getName());
131                     indices.addKeyWord(tagesplan.getName());
132                     indices.addKeyWord(tagesplan.getNotes());
133                     newIndices.add(indices);
134                 }
135             }
136         }
137
138         SearchIndices[] newIndicesArr = new SearchIndices[newIndices.size()];
139         newIndicesArr = newIndices.toArray(newIndicesArr);
140         AppContext.addSearchIndices(newIndicesArr);
141
142         for(MensaplanManagerInterface callback : aCallbackInterfaces) {
143             callback.onMensaplanUpdateDone();
144         }
145         aCallbackInterfaces.clear();
146         bRequestRunning = false;
147     }
148
149     @Override
150     protected void onXmlRequestFail(int statusCode, String errorMessage) {
151         for(MensaplanManagerInterface callback : aCallbackInterfaces) {
152             callback.onMensaplanUpdateFail("error " + statusCode + ": " + errorMessage);
153         }
154         aCallbackInterfaces.clear();
155         bRequestRunning = false;
156     }
157 }