android: Add simple utility class to generate settings_t compatible config snippets
This commit is contained in:
@@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Tobias Brunner
|
||||||
|
* Hochschule fuer Technik Rapperswil
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.strongswan.android.utils;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple generator for data/files that may be parsed by libstrongswan's
|
||||||
|
* settings_t class.
|
||||||
|
*/
|
||||||
|
public class SettingsWriter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Top-level section
|
||||||
|
*/
|
||||||
|
private final SettingsSection mTop = new SettingsSection();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a string value
|
||||||
|
* @param key
|
||||||
|
* @param value
|
||||||
|
* @return the writer
|
||||||
|
*/
|
||||||
|
public SettingsWriter setValue(String key, String value)
|
||||||
|
{
|
||||||
|
Pattern pattern = Pattern.compile("[^#{}=\"\\n\\t ]+");
|
||||||
|
if (key == null || !pattern.matcher(key).matches())
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
String[] keys = key.split("\\.");
|
||||||
|
SettingsSection section = mTop;
|
||||||
|
section = findOrCreateSection(Arrays.copyOfRange(keys, 0, keys.length-1));
|
||||||
|
section.Settings.put(keys[keys.length-1], value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an integer value
|
||||||
|
* @param key
|
||||||
|
* @param value
|
||||||
|
* @return the writer
|
||||||
|
*/
|
||||||
|
public SettingsWriter setValue(String key, Integer value)
|
||||||
|
{
|
||||||
|
return setValue(key, value == null ? null : value.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a boolean value
|
||||||
|
* @param key
|
||||||
|
* @param value
|
||||||
|
* @return the writer
|
||||||
|
*/
|
||||||
|
public SettingsWriter setValue(String key, Boolean value)
|
||||||
|
{
|
||||||
|
return setValue(key, value == null ? null : value ? "1" : "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes the settings to a string in the format understood by
|
||||||
|
* libstrongswan's settings_t parser.
|
||||||
|
* @return serialized settings
|
||||||
|
*/
|
||||||
|
public String serialize()
|
||||||
|
{
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
serializeSection(mTop, builder);
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize the settings in a section and recursively serialize sub-sections
|
||||||
|
* @param section
|
||||||
|
* @param builder
|
||||||
|
*/
|
||||||
|
private void serializeSection(SettingsSection section, StringBuilder builder)
|
||||||
|
{
|
||||||
|
for (Entry<String, String> setting : section.Settings.entrySet())
|
||||||
|
{
|
||||||
|
builder.append(setting.getKey()).append('=');
|
||||||
|
if (setting.getValue() != null)
|
||||||
|
{
|
||||||
|
builder.append("\"").append(escapeValue(setting.getValue())).append("\"");
|
||||||
|
}
|
||||||
|
builder.append('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Entry<String, SettingsSection> subsection : section.Sections.entrySet())
|
||||||
|
{
|
||||||
|
builder.append(subsection.getKey()).append(" {\n");
|
||||||
|
serializeSection(subsection.getValue(), builder);
|
||||||
|
builder.append("}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape value so it may be wrapped in "
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String escapeValue(String value)
|
||||||
|
{
|
||||||
|
return value.replace("\"", "\\\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find or create the nested sections with the given names
|
||||||
|
* @param sections list of section names
|
||||||
|
* @return final section
|
||||||
|
*/
|
||||||
|
private SettingsSection findOrCreateSection(String[] sections)
|
||||||
|
{
|
||||||
|
SettingsSection section = mTop;
|
||||||
|
for (String name : sections)
|
||||||
|
{
|
||||||
|
SettingsSection subsection = section.Sections.get(name);
|
||||||
|
if (subsection == null)
|
||||||
|
{
|
||||||
|
subsection = new SettingsSection();
|
||||||
|
section.Sections.put(name, subsection);
|
||||||
|
}
|
||||||
|
section = subsection;
|
||||||
|
}
|
||||||
|
return section;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A section containing sub-sections and settings.
|
||||||
|
*/
|
||||||
|
private class SettingsSection
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Assigned key/value pairs
|
||||||
|
*/
|
||||||
|
LinkedHashMap<String,String> Settings = new LinkedHashMap<String, String>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assigned sub-sections
|
||||||
|
*/
|
||||||
|
LinkedHashMap<String,SettingsSection> Sections = new LinkedHashMap<String, SettingsWriter.SettingsSection>();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user