blob: 479b00adc43c1021993ac5e36379013229ca0375 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ua.tests.cheatsheet.util;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ui.cheatsheets.AbstractItemExtensionElement;
import org.eclipse.ui.internal.cheatsheets.data.AbstractSubItem;
import org.eclipse.ui.internal.cheatsheets.data.Action;
import org.eclipse.ui.internal.cheatsheets.data.CheatSheet;
import org.eclipse.ui.internal.cheatsheets.data.ConditionalSubItem;
import org.eclipse.ui.internal.cheatsheets.data.Item;
import org.eclipse.ui.internal.cheatsheets.data.PerformWhen;
import org.eclipse.ui.internal.cheatsheets.data.RepeatedSubItem;
import org.eclipse.ui.internal.cheatsheets.data.SubItem;
/*
* Serializes cheat sheets as XML.
*/
public class CheatSheetModelSerializer {
/*
* Serializes the given cheat sheet model as XML.
*/
public static String serialize(CheatSheet sheet) {
StringBuilder buf = new StringBuilder();
buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
if (sheet == null) {
buf.append("<nullCheatSheet/>\n");
}
else {
buf.append("<cheatsheet\n");
buf.append(" title=\"" + sheet.getTitle() + "\">\n");
buf.append(serialize(sheet.getIntroItem(), " "));
buf.append(serialize(sheet.getItems(), " "));
buf.append("</cheatsheet>");
}
return buf.toString();
}
/*
* Serializes the given Item with the specified indentation.
*/
public static String serialize(Item item, String indent) {
StringBuilder buf = new StringBuilder();
if (item == null) {
buf.append(indent + "<nullItem/>\n");
}
else {
buf.append(indent + "<item\n");
buf.append(indent + " title=\"" + item.getTitle() + "\"\n");
buf.append(indent + " description=\"" + item.getDescription() + "\"\n");
buf.append(indent + " Href=\"" + item.getHref() + "\"\n");
buf.append(indent + " contextId=\"" + item.getContextId() + "\">\n");
buf.append(serialize((Action)item.getExecutable(), indent + " "));
buf.append(serialize(item.getItemExtensions(), indent + " "));
buf.append(serialize(item.getPerformWhen(), indent + " "));
buf.append(serialize(item.getSubItems(), indent + " "));
buf.append(indent + "</item>\n");
}
return buf.toString();
}
/*
* Serializes the given Action with the specified indentation.
*/
public static String serialize(Action action, String indent) {
StringBuilder buf = new StringBuilder();
if (action == null) {
buf.append(indent + "<nullAction/>\n");
}
else {
buf.append(indent + "<action\n");
buf.append(indent + " class=\"" + action.getActionClass() + "\"\n");
buf.append(indent + " pluginId=\"" + action.getPluginID() + "\"\n");
buf.append(indent + " when=\"" + action.getWhen() + "\"\n");
buf.append(indent + " isConfirm=\"" + action.isConfirm() + "\">\n");
buf.append(serialize(action.getParams(), indent + " "));
buf.append(indent + "</action>\n");
}
return buf.toString();
}
/*
* Serializes the given String with the specified indentation.
*/
public static String serialize(String string, String indent) {
StringBuilder buf = new StringBuilder();
if (string == null) {
buf.append(indent + "<nullString/>\n");
}
else {
buf.append(indent + "<string\n");
buf.append(indent + " value=\"" + string + "\">\n");
buf.append(indent + "</string>\n");
}
return buf.toString();
}
/*
* Serializes the given AbstractItemExtensionElement with the specified indentation.
*/
public static String serialize(AbstractItemExtensionElement ext, String indent) {
StringBuilder buf = new StringBuilder();
buf.append(indent + "<itemExtension\n");
buf.append(indent + " attributeName=\"" + ext.getAttributeName() + "\">\n");
buf.append(indent + "</itemExtension>\n");
return buf.toString();
}
/*
* Serializes the given PerformWhen with the specified indentation.
*/
public static String serialize(PerformWhen performWhen, String indent) {
StringBuilder buf = new StringBuilder();
if (performWhen == null) {
buf.append(indent + "<nullPerformWhen/>\n");
}
else {
buf.append(indent + "<performWhen\n");
buf.append(indent + " condition=\"" + performWhen.getCondition() + "\">\n");
buf.append(serialize(performWhen.getExecutables(), indent + " "));
buf.append(indent + "</performWhen>\n");
}
return buf.toString();
}
/*
* Serializes the given AbstractSubItem with the specified indentation.
*/
public static String serialize(AbstractSubItem subItem, String indent) {
StringBuilder buf = new StringBuilder();
if (subItem == null) {
buf.append(indent + "<nullSubItem/>\n");
}
else {
if (subItem instanceof ConditionalSubItem) {
ConditionalSubItem c = (ConditionalSubItem)subItem;
buf.append(indent + "<conditionalSubItem\n");
buf.append(indent + " condition=\"" + c.getCondition() + "\">\n");
buf.append(serialize(c.getSubItems(), indent + " "));
buf.append(indent + "</conditionalSubItem>\n");
}
else if (subItem instanceof RepeatedSubItem) {
RepeatedSubItem r = (RepeatedSubItem)subItem;
buf.append(indent + "<repeatedSubItem\n");
buf.append(indent + " values=\"" + r.getValues() + "\">\n");
buf.append(serialize(r.getSubItems(), indent + " "));
buf.append(indent + "</repeatedSubItem>\n");
}
else if (subItem instanceof SubItem) {
SubItem s = (SubItem)subItem;
buf.append(indent + "<subItem\n");
buf.append(indent + " label=\"" + s.getLabel() + "\"\n");
buf.append(indent + " when=\"" + s.getWhen() + "\"\n");
buf.append(indent + " isSkip=\"" + s.isSkip() + "\">\n");
buf.append(serialize((Action)s.getExecutable(), indent + " "));
buf.append(serialize(s.getPerformWhen(), indent + " "));
buf.append(indent + "</subItem>\n");
}
else {
throw new IllegalArgumentException("Unknown sub item type: " + subItem.getClass());
}
}
return buf.toString();
}
/*
* Serializes the given array with the specified indentation.
*/
public static String serialize(Object[] array, String indent) {
StringBuilder buf = new StringBuilder();
if (array == null) {
buf.append(indent + "<nullArray/>\n");
} else if (array.length == 0) {
buf.append(indent + "<array/>\n");
}
else {
buf.append(indent + "<array>\n");
for (Object obj : array) {
if (obj != null) {
Class<?> c = obj.getClass();
/*
* Find a serializer method that knows how to serialize this
* object.
*/
boolean found = false;
Method[] methods = CheatSheetModelSerializer.class.getMethods();
for (Method method : methods) {
Class<?>[] params = method.getParameterTypes();
if (params.length == 2 && params[0].isAssignableFrom(c) && params[1].equals(String.class)) {
try {
buf.append(method.invoke(null, obj, indent + " "));
}
catch(Exception e) {
buf.append(indent + " " + e + ", cause: " + e.getCause());
e.printStackTrace();
}
found = true;
break;
}
}
if (!found) {
System.err.println("Could not find serializer for: " + c);
}
}
else {
buf.append(indent + " <nullObject/>\n");
}
}
buf.append(indent + "</array>\n");
}
return buf.toString();
}
/*
* Serializes the given List with the specified indentation.
*/
public static String serialize(List<?> list, String indent) {
StringBuilder buf = new StringBuilder();
if (list == null) {
buf.append(indent + "<nullList/>\n");
}
else if (list.isEmpty()) {
buf.append(indent + "<list/>\n");
}
else {
buf.append(indent + "<list>\n");
Iterator<?> iter = list.iterator();
while (iter.hasNext()) {
Object obj = iter.next();
if (obj != null) {
Class<?> c = obj.getClass();
/*
* Find a serializer method that knows how to serialize this
* object.
*/
boolean found = false;
Method[] methods = CheatSheetModelSerializer.class.getMethods();
for (Method method : methods) {
Class<?>[] params = method.getParameterTypes();
if (params.length == 2 && params[0].isAssignableFrom(c) && params[1].equals(String.class)) {
try {
buf.append(method.invoke(null, obj, indent + " "));
}
catch(Exception e) {
buf.append(indent + " " + e + ", cause: " + e.getCause());
e.printStackTrace();
}
found = true;
break;
}
}
if (!found) {
System.err.println("Could not find serializer for: " + c);
}
}
else {
buf.append(indent + " <nullObject/>\n");
}
}
buf.append(indent + "</list>\n");
}
return buf.toString();
}
}