package com.erakk.lnreader;
import java.util.ArrayList;
import java.util.Hashtable;
import org.xmlpull.v1.XmlPullParser;
import android.content.res.XmlResourceParser;
import android.util.Log;
import com.erakk.lnreader.helper.Util;
/*
* Author : freedomofkeima
*/
public class AlternativeLanguageInfo {
/* List of attributes */
private static final String TAG = AlternativeLanguageInfo.class.toString();
private String language;
private String category;
private String markerSynopsis; /* Marker for Synopsis */
private ArrayList<String> parserInfo;
private static Hashtable<String, AlternativeLanguageInfo> instance;
private static final Object lock = new Object();
/* List of methods */
private static void initHashMap() {
synchronized (lock) {
// construct HashTable and populate with proper data with language as the key
if (instance == null)
instance = new Hashtable<String, AlternativeLanguageInfo>();
try {
XmlResourceParser xpp = LNReaderApplication.getInstance().getResources().getXml(R.xml.parse_lang_info);
xpp.next();
int eventType = xpp.getEventType();
String _language = null;
String _category = null;
String _markerSynopsis = null;
ArrayList<String> _parserInfo = new ArrayList<String>();
boolean startLang = false, startCat = false, startMark = false, startRule = false;
while (eventType != XmlPullParser.END_DOCUMENT)
{
if (eventType == XmlPullParser.START_TAG)
{
if (xpp.getName().equalsIgnoreCase("Language")) {
startLang = true;
}
else if (xpp.getName().equalsIgnoreCase("Category")) {
startCat = true;
}
else if (xpp.getName().equalsIgnoreCase("MarkerSynopsis")) {
startMark = true;
}
else if (xpp.getName().equalsIgnoreCase("Rule")) {
startRule = true;
}
}
else if (eventType == XmlPullParser.END_TAG)
{
if (xpp.getName().equalsIgnoreCase("LanguageInfo")) {
AlternativeLanguageInfo temp = new AlternativeLanguageInfo(_language, _category, _markerSynopsis, _parserInfo);
instance.put(_language, temp);
Log.d(TAG, "Language added: " + temp.toString());
_language = null;
_category = null;
_markerSynopsis = null;
_parserInfo = new ArrayList<String>();
}
}
else if (eventType == XmlPullParser.TEXT)
{
if (startLang) {
_language = xpp.getText();
startLang = false;
}
else if (startCat) {
_category = xpp.getText();
startCat = false;
}
else if (startMark) {
_markerSynopsis = xpp.getText();
startMark = false;
}
else if (startRule) {
_parserInfo.add(xpp.getText());
startRule = false;
}
}
eventType = xpp.next();
}
} catch (Exception ex) {
Log.e(TAG, ex.getMessage(), ex);
}
}
}
public static Hashtable<String, AlternativeLanguageInfo> getAlternativeLanguageInfo() {
synchronized (lock) {
/* if instance is null, then initHashMap */
if (instance == null || instance.isEmpty())
initHashMap();
return instance;
}
}
private AlternativeLanguageInfo(String _language, String _category, String _markerSynopsis, ArrayList<String> _parserInfo) {
// set the member variables
language = _language;
category = _category;
markerSynopsis = _markerSynopsis;
parserInfo = _parserInfo;
}
@Override
public String toString() {
return String.format("language = %s, category = %s, markerSynopsis = %s, parserInfo = {%s}", language, category, markerSynopsis, Util.join(parserInfo, ","));
}
/* Setter & Getter */
public String getLanguage() {
return language;
}
public String getCategory() {
return category;
}
public String getCategoryInfo() {
return "Category:" + category;
}
public String getMarkerSynopsis() {
return markerSynopsis;
}
public ArrayList<String> getParserInfo() {
return parserInfo;
}
public void setLanguage(String _language) {
language = _language;
}
public void setCategory(String _category) {
category = _category;
}
public void setMarkerSynopsis(String _markerSynopsis) {
markerSynopsis = _markerSynopsis;
}
public void setParserInfo(ArrayList<String> _parserInfo) {
parserInfo = _parserInfo;
}
}