package org.droidplanner.services.android.impl.utils.file.IO;
import android.content.Context;
import android.util.Xml;
import org.droidplanner.services.android.impl.core.drone.profiles.ParameterMetadata;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
/**
* Created by fhuya on 10/29/14.
*/
public class ParameterMetadataLoader {
private static final String PARAMETERMETADATA_PATH = "Parameters/ParameterMetaData.xml";
private static final String METADATA_DISPLAYNAME = "DisplayName";
private static final String METADATA_DESCRIPTION = "Description";
private static final String METADATA_UNITS = "Units";
private static final String METADATA_VALUES = "Values";
private static final String METADATA_RANGE = "Range";
public static void load(Context context, String metadataType, Map<String, ParameterMetadata> metadata)
throws IOException, XmlPullParserException {
InputStream inputStream = context.getAssets().open(PARAMETERMETADATA_PATH);
open(inputStream, metadataType, metadata);
}
private static void open(InputStream inputStream, String metadataType, Map<String, ParameterMetadata> metadataMap)
throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(inputStream, null);
parseMetadata(parser, metadataType, metadataMap);
} finally {
try {
inputStream.close();
} catch (IOException e) { /* nop */
}
}
}
private static void parseMetadata(XmlPullParser parser, String metadataType, Map<String, ParameterMetadata> metadataMap)
throws XmlPullParserException, IOException {
String name;
boolean parsing = false;
ParameterMetadata metadata = null;
metadataMap.clear();
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
name = parser.getName();
// name == metadataType: start collecting metadata(s)
// metadata == null: create new metadata w/ name
// metadata != null: add to metadata as property
if (metadataType.equals(name)) {
parsing = true;
} else if (parsing) {
if (metadata == null) {
metadata = new ParameterMetadata();
metadata.setName(name);
} else {
addMetaDataProperty(metadata, name, parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
// name == metadataType: done
// name == metadata.name: add metadata to metadataMap
if (metadataType.equals(name)) {
return;
} else if (metadata != null && metadata.getName().equals(name)) {
metadataMap.put(metadata.getName(), metadata);
metadata = null;
}
break;
}
eventType = parser.next();
}
// no metadata
}
private static void addMetaDataProperty(ParameterMetadata metaData, String name, String text) {
switch (name) {
case METADATA_DISPLAYNAME:
metaData.setDisplayName(text);
break;
case METADATA_DESCRIPTION:
metaData.setDescription(text);
break;
case METADATA_UNITS:
metaData.setUnits(text);
break;
case METADATA_RANGE:
metaData.setRange(text);
break;
case METADATA_VALUES:
metaData.setValues(text);
break;
}
}
}