[
https://issues.apache.org/jira/browse/CONFIGURATION-342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12642171#action_12642171
]
scwells72 edited comment on CONFIGURATION-342 at 10/23/08 7:42 AM:
---------------------------------------------------------------------
Yeah, it's definitely a totally denormalized form of an otherwise normalized
structure, especially if you follow it to its logical end of storing entire
HierarchicalConfiguration objects. On the other hand, if there were a good
mechanism to externalize arbitrarily complex Configuration instances in the
simplest of storage formats, e.g., PropertiesConfiguration, I can only imagine
it would be incredibly useful.
I could see adding one more column to your current storage table for a parent
key such that you'd get proper hierarchical storage in a quite simple table,
though. Well, I guess technically if order were important, as it is in lists,
then you'd want key, parent key, and index in parent, so a total of two extra
columns.
Anyway, I've attached the rough version of flatten()/unflatten(). This is for
a proof-of-concept, so don't take this as final code, but it does allow me to
successfully marshal/unmarshal multi-value properties.
was (Author: scwells72):
Yeah, it's definitely a totally denormalized form of an otherwise
normalized structure, especially if you follow it to its logical end of storing
entire HierarchicalConfiguration objects. On the other hand, if there were a
good mechanism to externalize arbitrarily complex Configuration instances in
the simplest of storage formats, e.g., PropertiesConfiguration, I can only
imagine it would be incredibly useful.
I could see adding one more column to your current storage table for a parent
key such that you'd get proper hierarchical storage in a quite simple table,
though. Well, I guess technically if order were important, as it is in lists,
then you'd want key, parent key, and index in parent, so a total of two extra
columns.
Anyway, here's the rough version of flatten()/unflatten(). This is for a
proof-of-concept, so don't take this as final code, but it does allow me to
successfully marshal/unmarshal multi-value properties.
protected static final String FLATTENED_LIST_ITEM_SUFFIX =
".flattenedListItem";
public static Configuration flatten(Configuration configuration)
{
BaseConfiguration flattenedConfiguration = new BaseConfiguration();
for (Iterator it = configuration.getKeys(); it.hasNext();)
{
String key = (String) it.next();
Object value = configuration.getProperty(key);
if (value instanceof Collection)
{
Collection collection = (Collection) value;
// Create a formatting string to ensure that numbers are
zero-padded properly
int numPlaces = (int) Math.log10(collection.size()) + 1;
String formatString = "%0" + numPlaces + "d";
// Add each item in the collection distinctly
int i = 0;
for (Object item : collection)
{
String index = String.format(formatString, i);
String flattendedListItemKey = key +
FLATTENED_LIST_ITEM_SUFFIX + index;
flattenedConfiguration.setProperty(flattendedListItemKey,
item);
i++;
}
}
else
{
flattenedConfiguration.setProperty(key, value);
}
}
return flattenedConfiguration;
}
public static Configuration unflatten(Configuration configuration)
{
BaseConfiguration unflattenedConfiguration = new BaseConfiguration();
// Add to a list that can be sorted by keys first
Map<String, Object> sortedByKeys = new TreeMap<String, Object>();
for (Iterator it = configuration.getKeys(); it.hasNext();)
{
String key = (String) it.next();
Object value = configuration.getProperty(key);
sortedByKeys.put(key, value);
}
for (Map.Entry<String, Object> entry : sortedByKeys.entrySet())
{
String key = entry.getKey();
Object value = entry.getValue();
if (key.contains(FLATTENED_LIST_ITEM_SUFFIX))
{
int chopHere = key.indexOf(FLATTENED_LIST_ITEM_SUFFIX);
String originalKey = key.substring(0, chopHere);
unflattenedConfiguration.addProperty(originalKey, value);
}
else
{
unflattenedConfiguration.setProperty(key, value);
}
> DatabaseConfiguration.copy() loses list/array values
> ----------------------------------------------------
>
> Key: CONFIGURATION-342
> URL: https://issues.apache.org/jira/browse/CONFIGURATION-342
> Project: Commons Configuration
> Issue Type: Bug
> Components: Type conversion
> Affects Versions: 1.5
> Reporter: Scott Wells
>
> I've found a bug where adding a list property to a BaseConfiguration, then
> copying that full BaseConfiguration to a DatabaseConfiguration, the list is
> lost and only the first element is copied to the destination
> DatabaseConfiguration. For example:
> BaseConfiguration bc = new BaseConfiguration();
> bc.addProperty("myList", Arrays.asList("1", "2", "3", "4");
> DatabaseConfiguration dc = new DatabaseConfiguration(...);
> dc.copy(bc);
> List list = dc.getList("myList");
> // At this point, you'll get a single element list containing only "1"
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.