some fixes
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / network / XmlRequestHelper.java
1 package de.dhbwloe.campusapp.network;
2
3 import android.os.Bundle;
4 import android.util.Log;
5
6 import com.loopj.android.http.AsyncHttpClient;
7 import com.loopj.android.http.AsyncHttpResponseHandler;
8
9 import net.fortuna.ical4j.data.CalendarBuilder;
10 import net.fortuna.ical4j.data.ParserException;
11 import net.fortuna.ical4j.model.Calendar;
12
13 import org.xmlpull.v1.XmlPullParser;
14 import org.xmlpull.v1.XmlPullParserException;
15 import org.xmlpull.v1.XmlPullParserFactory;
16
17 import java.io.ByteArrayInputStream;
18 import java.io.IOException;
19 import java.io.InputStream;
20 import java.io.UnsupportedEncodingException;
21 import java.security.KeyStore;
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import cz.msebera.android.httpclient.Header;
26
27 /**
28  * Created by pk910 on 20.01.2016.
29  */
30 public abstract class XmlRequestHelper {
31     private static final String ns = null;
32     private String sRootElementName, sElementName;
33
34     protected void requestXmlFromWeb(String url, String rootElementName, String elementName) {
35         AsyncHttpClient client = new AsyncHttpClient();
36
37         sRootElementName = rootElementName;
38         sElementName = elementName;
39
40         Log.i("HTTPClient", "Request: "+url);
41         client.get(url, new AsyncHttpResponseHandler() {
42             @Override
43             public void onStart() {
44             }
45
46             @Override
47             public void onSuccess(int statusCode, Header[] headers, byte[] response) {
48                 ByteArrayInputStream inputStream = new ByteArrayInputStream(response);
49                 List<XmlEntry> entries = parseXml(inputStream, sRootElementName, sElementName);
50
51                 onXmlReceived(entries);
52             }
53
54             @Override
55             public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
56                 String error = null;
57                 try {
58                     error = new String(errorResponse, "US-ASCII");
59                 } catch (UnsupportedEncodingException e1) {
60                 }
61                 Log.i("HTTPClient", "  Error: " + statusCode + " - " + error);
62                 onXmlRequestFail(statusCode, error);
63             }
64
65             @Override
66             public void onRetry(int retryNo) {
67             }
68         });
69     }
70
71     public static List<XmlEntry> parseXml(InputStream input, String rootElementName, String elementName) {
72         List<XmlEntry> entries = null;
73         try {
74             XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
75             XmlPullParser myparser = xmlFactoryObject.newPullParser();
76
77             myparser.setInput(input, null);
78
79             do {
80                 myparser.nextTag();
81             } while(!myparser.getName().equalsIgnoreCase(rootElementName));
82
83             entries = readXml(myparser, rootElementName, elementName);
84         } catch (Exception e) {
85             e.printStackTrace();
86         }
87
88         return entries;
89     }
90
91     private static List<XmlEntry> readXml(XmlPullParser parser, String rootElementName, String elementName) throws XmlPullParserException, IOException {
92         List<XmlEntry> entries = new ArrayList<XmlEntry>();
93
94         parser.require(XmlPullParser.START_TAG, ns, rootElementName);
95         while (parser.next() != XmlPullParser.END_TAG) {
96
97             if (parser.getEventType() != XmlPullParser.START_TAG) {
98                 continue;
99             }
100             String name = parser.getName();
101             // Starts by looking for the entry tag
102             if (name.equalsIgnoreCase(elementName)) {
103                 Log.i("XMLParser", "found "+elementName);
104                 entries.add(readXmlEntry(parser, elementName));
105             } else {
106                 entries.addAll(readXml(parser, name, elementName));
107             }
108         }
109         return entries;
110     }
111
112     private static XmlEntry readXmlEntry(XmlPullParser parser, String elementName) throws XmlPullParserException, IOException {
113         parser.require(XmlPullParser.START_TAG, ns, elementName);
114         XmlEntry entry = new XmlEntry(elementName);
115         int depth = 1;
116         int attrcount = parser.getAttributeCount();
117         Bundle attributes = new Bundle();
118         for(int i = 0; i < attrcount; i++) {
119             attributes.putString(parser.getAttributeName(i), parser.getAttributeValue(i));
120         }
121         entry.setAttributes(attributes);
122         while (depth != 0) {
123             switch (parser.next()) {
124                 case XmlPullParser.START_TAG:
125                     XmlEntry child = readXmlEntry(parser, parser.getName());
126                     entry.addChild(child);
127                     break;
128                 case XmlPullParser.END_TAG:
129                     depth = 0;
130                     break;
131                 case XmlPullParser.TEXT:
132                     entry.setValue(parser.getText());
133                     break;
134             }
135         }
136         return entry;
137     }
138
139     private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
140         if (parser.getEventType() != XmlPullParser.START_TAG) {
141             throw new IllegalStateException();
142         }
143         int depth = 1;
144         while (depth != 0) {
145             switch (parser.next()) {
146                 case XmlPullParser.END_TAG:
147                     depth--;
148                     break;
149                 case XmlPullParser.START_TAG:
150                     depth++;
151                     break;
152             }
153         }
154     }
155
156     protected abstract void onXmlReceived(List<XmlEntry> entries);
157     protected abstract void onXmlRequestFail(int statusCode, String errorMessage);
158
159 }