/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.core.util; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import java.util.*; public abstract class AbstractXStreamConverter implements Converter { private final Class type; protected AbstractXStreamConverter(Class type) { this.type = type; } public boolean canConvert(Class clazz) { return type.isAssignableFrom(clazz); } protected void writeAttribute(HierarchicalStreamWriter writer, String name, String value) { if (value != null) { writer.addAttribute(name, value); } } protected void writeString(HierarchicalStreamWriter writer, String name, String value) { if (value != null) { writer.startNode(name); writer.setValue(value); writer.endNode(); } } protected void writeObject(HierarchicalStreamWriter writer, MarshallingContext context, String name, Object value) { if (value != null) { writer.startNode(name); context.convertAnother(value); writer.endNode(); } } protected void writeList(HierarchicalStreamWriter writer, String listName, String itemName, Iterable<String> list) { if (list != null) { java.util.Iterator<String> i = list.iterator(); if (i.hasNext()) { writer.startNode(listName); while (i.hasNext()) { writer.startNode(itemName); writer.setValue(i.next()); writer.endNode(); } writer.endNode(); } } } protected void writeObjectList(HierarchicalStreamWriter writer, MarshallingContext context, String listName, String itemName, Iterable<?> list) { if (list != null) { java.util.Iterator<? extends Object> i = list.iterator(); if (i.hasNext()) { writer.startNode(listName); while (i.hasNext()) { writeObject(writer, context, itemName, i.next()); } writer.endNode(); } } } protected void writePropertyMap(HierarchicalStreamWriter writer, MarshallingContext context, String mapName, Map<String, String> map) { if (map != null && !map.isEmpty()) { writer.startNode(mapName); for (Map.Entry<String, String> entry : map.entrySet()) { writer.startNode("property"); writer.addAttribute("key", entry.getKey()); writer.addAttribute("value", entry.getValue()); writer.endNode(); } writer.endNode(); } } protected void readNodes(HierarchicalStreamReader reader, NodeReader nodeReader) { while (reader.hasMoreChildren()) { reader.moveDown(); nodeReader.onNode(reader, reader.getNodeName(), reader.getValue()); reader.moveUp(); } } protected List<String> readList(HierarchicalStreamReader reader) { List<String> list = new ArrayList<String>(); while (reader.hasMoreChildren()) { reader.moveDown(); list.add(reader.getValue()); reader.moveUp(); } return list; } protected <T> T readObject(HierarchicalStreamReader reader, UnmarshallingContext context, Class<? extends T> clazz) { return (T) context.convertAnother(reader.getValue(), clazz); } protected <T> List<T> readObjectList(HierarchicalStreamReader reader, UnmarshallingContext context, Class<? extends T> clazz) { List<T> list = new ArrayList<T>(); while (reader.hasMoreChildren()) { reader.moveDown(); list.add((T) context.convertAnother(reader.getValue(), clazz)); reader.moveUp(); } return list; } protected Map<String, String> readPropertyMap(HierarchicalStreamReader reader, UnmarshallingContext context) { Map<String, String> map = new HashMap<String, String>(); while (reader.hasMoreChildren()) { reader.moveDown(); map.put(reader.getAttribute("key"), reader.getAttribute("value")); reader.moveUp(); } return map; } public interface NodeReader { void onNode(HierarchicalStreamReader reader, String name, String value); } }