Grundaufbau der App
[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             if (parser.getEventType() != XmlPullParser.START_TAG) {
97                 continue;
98             }
99             String name = parser.getName();
100             // Starts by looking for the entry tag
101             if (name.equalsIgnoreCase(elementName)) {
102                 Log.i("XMLParser", "found "+elementName);
103                 entries.add(readXmlEntry(parser, elementName));
104             } else {
105                 entries.addAll(readXml(parser, name, elementName));
106             }
107         }
108         return entries;
109     }
110
111     private static XmlEntry readXmlEntry(XmlPullParser parser, String elementName) throws XmlPullParserException, IOException {
112         parser.require(XmlPullParser.START_TAG, ns, elementName);
113         XmlEntry entry = new XmlEntry(elementName);
114         int depth = 1;
115         int attrcount = parser.getAttributeCount();
116         Bundle attributes = new Bundle();
117         for(int i = 0; i < attrcount; i++) {
118             attributes.putString(parser.getAttributeName(i), parser.getAttributeValue(i));
119         }
120         entry.setAttributes(attributes);
121         while (depth != 0) {
122             switch (parser.next()) {
123                 case XmlPullParser.START_TAG:
124                     XmlEntry child = readXmlEntry(parser, parser.getName());
125                     entry.addChild(child);
126                     break;
127                 case XmlPullParser.END_TAG:
128                     depth = 0;
129                     break;
130                 case XmlPullParser.TEXT:
131                     entry.setValue(parser.getText());
132                     break;
133             }
134         }
135         return entry;
136     }
137
138     private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
139         if (parser.getEventType() != XmlPullParser.START_TAG) {
140             throw new IllegalStateException();
141         }
142         int depth = 1;
143         while (depth != 0) {
144             switch (parser.next()) {
145                 case XmlPullParser.END_TAG:
146                     depth--;
147                     break;
148                 case XmlPullParser.START_TAG:
149                     depth++;
150                     break;
151             }
152         }
153     }
154
155     protected abstract void onXmlReceived(List<XmlEntry> entries);
156     protected abstract void onXmlRequestFail(int statusCode, String errorMessage);
157
158 }