| /******************************************************************************* |
| * Copyright (c) 2004, 2016 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ui.internal.intro.impl.util; |
| |
| import java.util.Map; |
| import java.util.Map.Entry; |
| |
| import org.eclipse.ui.internal.intro.impl.model.AbstractIntroContainer; |
| import org.eclipse.ui.internal.intro.impl.model.AbstractIntroElement; |
| import org.eclipse.ui.internal.intro.impl.model.AbstractIntroPage; |
| import org.eclipse.ui.internal.intro.impl.model.IntroAnchor; |
| import org.eclipse.ui.internal.intro.impl.model.IntroContentProvider; |
| import org.eclipse.ui.internal.intro.impl.model.IntroGroup; |
| import org.eclipse.ui.internal.intro.impl.model.IntroHTML; |
| import org.eclipse.ui.internal.intro.impl.model.IntroHead; |
| import org.eclipse.ui.internal.intro.impl.model.IntroImage; |
| import org.eclipse.ui.internal.intro.impl.model.IntroInclude; |
| import org.eclipse.ui.internal.intro.impl.model.IntroLink; |
| import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot; |
| import org.eclipse.ui.internal.intro.impl.model.IntroPage; |
| import org.eclipse.ui.internal.intro.impl.model.IntroPageTitle; |
| import org.eclipse.ui.internal.intro.impl.model.IntroSeparator; |
| import org.eclipse.ui.internal.intro.impl.model.IntroText; |
| import org.osgi.framework.Bundle; |
| |
| /** |
| * Print the model to a string buffer (only) for debugging. |
| */ |
| public class IntroModelSerializer { |
| |
| private StringBuffer buffer; |
| private boolean filter; |
| |
| public IntroModelSerializer(IntroModelRoot root) { |
| this(root, false); |
| } |
| |
| public IntroModelSerializer(IntroModelRoot root, boolean filter) { |
| this.buffer = new StringBuffer(); |
| this.filter = filter; |
| printModelRootInfo(root, buffer); |
| |
| // Root Page |
| AbstractIntroPage rootPage = root.getHomePage(); |
| printHomePage(rootPage, buffer); |
| printPageChildren(rootPage, buffer); |
| |
| IntroPage[] pages = root.getPages(); |
| printPages(pages, buffer); |
| |
| buffer.append("\n\n"); //$NON-NLS-1$ |
| printModelFlagTests(root, buffer); |
| } |
| |
| /* |
| * Removes any platform/machine-specific paths from the given URL. This is |
| * used to remove absolute paths from the serialized model in order to compare |
| * results in automated tests. |
| */ |
| private String filterURL(String url) { |
| if (filter) { |
| if (url != null && url.startsWith("file:/")) { //$NON-NLS-1$ |
| return "file:/" + "<filtered>" + url.substring(url.lastIndexOf('/')); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| return url; |
| } |
| |
| private void printModelRootInfo(IntroModelRoot model, StringBuffer text) { |
| text.append("\nIntro Model Content:"); //$NON-NLS-1$ |
| text.append("\n======================"); //$NON-NLS-1$ |
| text.append("\n\nModel has valid config = " + model.hasValidConfig()); //$NON-NLS-1$ |
| text.append("\nPresentation Kind = " //$NON-NLS-1$ |
| + model.getPresentation().getImplementationKind()); |
| text.append("\nPresentation Shared Style = " //$NON-NLS-1$ |
| + model.getPresentation().getImplementationStyles()); |
| text.append("\nPresentation type = " //$NON-NLS-1$ |
| + model.getPresentation().getType()); |
| text.append("\nHome page id = " //$NON-NLS-1$ |
| + model.getPresentation().getHomePageId()); |
| IntroHead headContent = model.getPresentation().getHead(); |
| if (headContent != null) |
| text.append("\nPresentation Shared Head = " + headContent.getSrc()); //$NON-NLS-1$ |
| text.append("\nNumber of pages (not including Root Page) = " //$NON-NLS-1$ |
| + model.getPages().length); |
| text.append("\nNumber of shared groups = " //$NON-NLS-1$ |
| + model.getChildrenOfType(AbstractIntroElement.GROUP).length); |
| text |
| .append("\nNumber of unresolved extensions = " //$NON-NLS-1$ |
| + model |
| .getChildrenOfType(AbstractIntroElement.CONTAINER_EXTENSION).length); |
| } |
| |
| /** |
| * @param text |
| * @param root |
| */ |
| private void printHomePage(AbstractIntroPage rootPage, StringBuffer text) { |
| text.append("\n\nHOME PAGE: "); //$NON-NLS-1$ |
| text.append("\n--------------"); //$NON-NLS-1$ |
| text |
| .append("\n\tis dynamic= " + ((IntroModelRoot) rootPage.getParent()).isDynamic()); //$NON-NLS-1$ |
| |
| text.append("\n\tid = " + rootPage.getId()); //$NON-NLS-1$ |
| text.append("\n\ttitle = " + rootPage.getTitle()); //$NON-NLS-1$ |
| text.append("\n\tstyle = " + filterURL(rootPage.getStyle())); //$NON-NLS-1$ |
| text.append("\n\talt-style = " + filterURL(rootPage.getAltStyle())); //$NON-NLS-1$ |
| text.append("\n\turl = " + rootPage.getUrl()); //$NON-NLS-1$ |
| text.append("\n\tstyle-id = " + rootPage.getStyleId()); //$NON-NLS-1$ |
| printPageStyles(rootPage, text); |
| } |
| |
| private void printPageStyles(AbstractIntroPage page, StringBuffer text) { |
| text.append("\n\tpage styles are = "); //$NON-NLS-1$ |
| String[] styles = page.getStyles(); |
| for (int i = 0; i < styles.length; i++) |
| text.append(filterURL(styles[i] + "\n\t\t\t")); //$NON-NLS-1$ |
| text.append("\n\tpage alt-styles are = "); //$NON-NLS-1$ |
| |
| Map<String, Bundle> altStylesHashtable = page.getAltStyles(); |
| if (altStylesHashtable == null) |
| return; |
| |
| for (Entry<String, Bundle> entry : altStylesHashtable.entrySet()) { |
| text.append(filterURL(entry.getKey()) + " from " + entry.getValue().getSymbolicName()); //$NON-NLS-1$ |
| text.append("\n\t\t"); //$NON-NLS-1$ |
| } |
| } |
| |
| private void printPageChildren(AbstractIntroPage page, StringBuffer text) { |
| |
| text.append("\n\tpage children = " + page.getChildren().length); //$NON-NLS-1$ |
| text.append("\n"); //$NON-NLS-1$ |
| printContainerChildren(page, text, "\n\t\t"); //$NON-NLS-1$ |
| |
| } |
| |
| private void printContainerChildren(AbstractIntroContainer container, |
| StringBuffer text, String indent) { |
| |
| AbstractIntroElement[] children = container.getChildren(); |
| for (int i = 0; i < children.length; i++) { |
| int childType = children[i].getType(); |
| switch (childType) { |
| case AbstractIntroElement.ELEMENT: |
| text.append("SHOULD NEVER BE HERE"); //$NON-NLS-1$ |
| break; |
| case AbstractIntroElement.GROUP: |
| printGroup(text, (IntroGroup) children[i], indent); |
| break; |
| case AbstractIntroElement.LINK: |
| printLink(text, (IntroLink) children[i], indent); |
| break; |
| case AbstractIntroElement.TEXT: |
| printText(text, (IntroText) children[i], indent); |
| break; |
| case AbstractIntroElement.IMAGE: |
| printImage(text, (IntroImage) children[i], indent); |
| break; |
| case AbstractIntroElement.HR: |
| printSeparator(text, (IntroSeparator) children[i], indent); |
| break; |
| case AbstractIntroElement.HTML: |
| printHtml(text, (IntroHTML) children[i], indent); |
| break; |
| case AbstractIntroElement.INCLUDE: |
| printInclude(text, (IntroInclude) children[i], indent); |
| break; |
| case AbstractIntroElement.HEAD: |
| printHead(text, (IntroHead) children[i], indent); |
| break; |
| case AbstractIntroElement.PAGE_TITLE: |
| printPageTitle(text, (IntroPageTitle) children[i], indent); |
| break; |
| case AbstractIntroElement.ANCHOR: |
| printAnchor(text, (IntroAnchor) children[i], indent); |
| break; |
| case AbstractIntroElement.CONTENT_PROVIDER: |
| printContentProvidor(text, (IntroContentProvider) children[i], |
| indent); |
| break; |
| |
| } |
| } |
| } |
| |
| private void printGroup(StringBuffer text, IntroGroup group, String indent) { |
| text.append(indent + "GROUP: id = " + group.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "label = " + group.getLabel()); //$NON-NLS-1$ |
| text.append(indent + "children = " + group.getChildren().length); //$NON-NLS-1$ |
| text.append(indent + "style-id = " + group.getStyleId()); //$NON-NLS-1$ |
| printContainerChildren(group, text, indent + "\t\t"); //$NON-NLS-1$ |
| } |
| |
| private void printLink(StringBuffer text, IntroLink link, String indent) { |
| text.append(indent + "LINK: id = " + link.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "label = " + link.getLabel()); //$NON-NLS-1$ |
| text.append(indent + "text = " + link.getText()); //$NON-NLS-1$ |
| text.append(indent + "url = " + link.getUrl()); //$NON-NLS-1$ |
| text.append(indent + "style-id = " + link.getStyleId()); //$NON-NLS-1$ |
| } |
| |
| private void printText(StringBuffer text, IntroText introText, String indent) { |
| text.append(indent + "TEXT: id = " + introText.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "text = " + introText.getText()); //$NON-NLS-1$ |
| text.append(indent + "style-id = " + introText.getStyleId()); //$NON-NLS-1$ |
| } |
| |
| private void printImage(StringBuffer text, IntroImage image, String indent) { |
| text.append(indent + "IMAGE: id = " + image.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "src = " + image.getSrc()); //$NON-NLS-1$ |
| text.append(indent + "alt = " + image.getAlt()); //$NON-NLS-1$ |
| text.append(indent + "style-id = " + image.getStyleId()); //$NON-NLS-1$ |
| } |
| |
| private void printSeparator(StringBuffer text, IntroSeparator sep, String indent) { |
| text.append(indent + "HR: id = " + sep.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "style-id = " + sep.getStyleId()); //$NON-NLS-1$ |
| } |
| |
| private void printHtml(StringBuffer text, IntroHTML html, String indent) { |
| text.append(indent + "HTML: id = " + html.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "src = " + html.getSrc()); //$NON-NLS-1$ |
| text.append(indent + "isInlined = " + html.isInlined()); //$NON-NLS-1$ |
| text.append(indent + "style-id = " + html.getStyleId()); //$NON-NLS-1$ |
| if (html.getIntroImage() != null) |
| printImage(text, html.getIntroImage(), indent + "\t\t"); //$NON-NLS-1$ |
| if (html.getIntroText() != null) |
| printText(text, html.getIntroText(), indent + "\t\t"); //$NON-NLS-1$ |
| |
| } |
| |
| private void printInclude(StringBuffer text, IntroInclude include, |
| String indent) { |
| text.append(indent + "INCLUDE: configId = " + include.getConfigId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "path = " + include.getPath()); //$NON-NLS-1$ |
| text.append(indent + "merge-style = " + include.getMergeStyle()); //$NON-NLS-1$ |
| } |
| |
| private void printHead(StringBuffer text, IntroHead head, String indent) { |
| text.append(indent + "HEAD: src = " + head.getSrc()); //$NON-NLS-1$ |
| } |
| |
| private void printPageTitle(StringBuffer text, IntroPageTitle title, |
| String indent) { |
| text.append(indent + "TITLE: id = " + title.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "title = " + title.getTitle()); //$NON-NLS-1$ |
| text.append(indent + "style-id = " + title.getStyleId()); //$NON-NLS-1$ |
| } |
| |
| private void printAnchor(StringBuffer text, IntroAnchor anchor, |
| String indent) { |
| text.append(indent + "ANCHOR: id = " + anchor.getId()); //$NON-NLS-1$ |
| } |
| |
| private void printContentProvidor(StringBuffer text, |
| IntroContentProvider provider, String indent) { |
| text.append(indent + "CONTENT PROVIDER: id = " + provider.getId()); //$NON-NLS-1$ |
| indent = indent + "\t\t"; //$NON-NLS-1$ |
| text.append(indent + "class = " + provider.getClassName()); //$NON-NLS-1$ |
| text.append(indent + "pluginId = " + provider.getPluginId()); //$NON-NLS-1$ |
| if (provider.getIntroText() != null) |
| printText(text, provider.getIntroText(), indent + "\t\t"); //$NON-NLS-1$ |
| |
| } |
| |
| /** |
| * Appends a given page's categories to the Text buffer. |
| * |
| * @param text |
| */ |
| private void printPages(IntroPage[] pages, StringBuffer text) { |
| for (int i = 0; i < pages.length; i++) { |
| text.append("\n\nPAGE id = " + pages[i].getId()); //$NON-NLS-1$ |
| text.append("\n----------"); //$NON-NLS-1$ |
| text.append("\n\ttitle = " + pages[i].getTitle()); //$NON-NLS-1$ |
| text.append("\n\tstyle = " + filterURL(pages[i].getStyle())); //$NON-NLS-1$ |
| text.append("\n\talt-style = " + filterURL(pages[i].getAltStyle())); //$NON-NLS-1$ |
| text.append("\n\tstyle-id = " + pages[i].getStyleId()); //$NON-NLS-1$ |
| printPageStyles(pages[i], text); |
| printPageChildren(pages[i], text); |
| } |
| } |
| |
| private void printModelFlagTests(IntroModelRoot model, StringBuffer text) { |
| text.append("Model Flag Tests: "); //$NON-NLS-1$ |
| text.append("\n----------------"); //$NON-NLS-1$ |
| if (model.getPages().length == 0) { |
| text.append("\nNo first page in model\n\n"); //$NON-NLS-1$ |
| return; |
| } |
| IntroPage firstPage = model.getPages()[0]; |
| text.append("\n\t\tFirst page children are: "); //$NON-NLS-1$ |
| text |
| .append("\n\t\t\tGroups: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.GROUP).length); |
| text |
| .append("\n\t\t\tLinks: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.LINK).length); |
| text |
| .append("\n\t\t\tTexts: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.TEXT).length); |
| text |
| .append("\n\t\t\tHTMLs: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.HTML).length); |
| text |
| .append("\n\t\t\tImages: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.IMAGE).length); |
| text |
| .append("\n\t\t\tIncludes: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.INCLUDE).length); |
| text |
| .append("\n\t\t\tPage Titles: " //$NON-NLS-1$ |
| + firstPage |
| .getChildrenOfType(AbstractIntroElement.PAGE_TITLE).length); |
| text |
| .append("\n\t\t\tPage Heads: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.HEAD).length); |
| text |
| .append("\n\t\t\tModel Elements: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.ELEMENT).length); |
| text |
| .append("\n\t\t\tContainers: " //$NON-NLS-1$ |
| + firstPage |
| .getChildrenOfType(AbstractIntroElement.ABSTRACT_CONTAINER).length); |
| text |
| .append("\n\t\t\tAll Pages: " //$NON-NLS-1$ |
| + firstPage |
| .getChildrenOfType(AbstractIntroElement.ABSTRACT_PAGE).length); |
| text |
| .append("\n\t\t\tAnchors: " //$NON-NLS-1$ |
| + firstPage.getChildrenOfType(AbstractIntroElement.ANCHOR).length); |
| text |
| .append("\n\t\t\tContent providers: " //$NON-NLS-1$ |
| + firstPage |
| .getChildrenOfType(AbstractIntroElement.CONTENT_PROVIDER).length); |
| text |
| .append("\n\t\t\tElements with Text child(AbstractTextElemets): " //$NON-NLS-1$ |
| + firstPage |
| .getChildrenOfType(AbstractIntroElement.ABSTRACT_TEXT).length); |
| |
| AbstractIntroElement[] linksAndGroups = (AbstractIntroElement[]) firstPage |
| .getChildrenOfType(AbstractIntroElement.GROUP |
| | AbstractIntroElement.LINK); |
| text.append("\n\t\t\tGroups and Links: " + linksAndGroups.length); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @return Returns the textUI. |
| */ |
| @Override |
| public String toString() { |
| return buffer.toString(); |
| } |
| } |