blob: 7eee24580b2baea7d015d633771eee2a28d3f1a4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 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.wst.common.snippets.internal.ui;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.eclipse.wst.common.snippets.internal.Debug;
import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
import org.eclipse.wst.common.snippets.internal.palette.SnippetVariable;
import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
import org.eclipse.wst.common.snippets.internal.util.CommonXML;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class EntryDeserializer {
private static EntryDeserializer reader = null;
public synchronized static EntryDeserializer getInstance() {
// cached definitions will be out of sync once new definitions are
// written to disk
reader = new EntryDeserializer();
return reader;
}
protected EntryDeserializer() {
super();
}
protected void addItem(SnippetDefinitions definitions, Element element) {
SnippetPaletteItem item = createItem(element);
// item.setPluginRecord(getPluginRecord(definitions, element));
definitions.getItems().add(item);
}
protected void assignEntryProperties(Element element, ISnippetsEntry entry) {
entry.setId(element.getAttribute(SnippetsPlugin.NAMES.ID));
entry.setIconName(element.getAttribute(SnippetsPlugin.NAMES.ICON));
// new in V5.1
String description = createDescription(element);
String label = element.getAttribute(SnippetsPlugin.NAMES.LABEL);
if ((label == null || label.length() == 0) && description != null) {
label = description;
description = ""; //$NON-NLS-1$
}
entry.setDescription(description);
entry.setLabel(label);
}
protected String createContent(Node item) {
return readCDATAofChild(item, SnippetsPlugin.NAMES.CONTENT);
}
protected String createDescription(Node entryElement) {
return readCDATAofChild(entryElement, SnippetsPlugin.NAMES.DESCRIPTION);
}
protected SnippetPaletteItem createItem(Element element) {
SnippetPaletteItem item = new SnippetPaletteItem(element.getAttribute(SnippetsPlugin.NAMES.ID));
assignEntryProperties(element, item);
item.setContentString(createContent(element));
item.setCategoryName(element.getAttribute(SnippetsPlugin.NAMES.CATEGORY));
item.setClassName(element.getAttribute(SnippetsPlugin.NAMES.CLASSNAME));
item.setEditorClassName(element.getAttribute(SnippetsPlugin.NAMES.EDITORCLASSNAME));
NodeList children = element.getChildNodes();
int length = children.getLength();
for (int i = 0; i < length; i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE && child.getNodeName().equals(SnippetsPlugin.NAMES.VARIABLE)) {
ISnippetVariable var = createVariable((Element) child);
if (var != null)
item.addVariable(var);
}
}
if (Debug.debugDefinitionPersistence)
System.out.println("User item reader creating item " + item.getId()); //$NON-NLS-1$
return item;
}
protected ISnippetVariable createVariable(Element element) {
SnippetVariable var = new SnippetVariable();
var.setId(element.getAttribute(SnippetsPlugin.NAMES.ID));
var.setName(element.getAttribute(SnippetsPlugin.NAMES.NAME));
var.setDescription(createDescription(element));
var.setDefaultValue(element.getAttribute(SnippetsPlugin.NAMES.DEFAULT));
return var;
}
public ISnippetsEntry fromXML(byte[] xml) {
ISnippetsEntry entry = null;
try {
Document document = CommonXML.getDocumentBuilder().parse(new InputSource(new ByteArrayInputStream(xml)));
Element el = document.getDocumentElement();
if (el != null && el.hasChildNodes()) {
Node child = el.getFirstChild();
while (child.getNodeType() != Node.ELEMENT_NODE)
child = child.getNextSibling();
if (child.getNodeName().equals(SnippetsPlugin.NAMES.ITEM)) {
ISnippetItem item = createItem((Element) child);
item.setCategoryName(null);
item.setCategory(null);
item.setClassName(null);
item.setEditorClassName(null);
item.setIconName(null);
entry = item;
}
else if (child.getNodeName().equals(SnippetsPlugin.NAMES.CATEGORY)) {
}
}
}
catch (SAXException e) {
}
catch (IOException e) {
}
return entry;
}
/**
* Extracts the contents of a CDATA section arranged like this:
*
* <node><otherChild/><childName><wrong element/> <![CDATA[ RETURNED
* TEXT]]> </childName> </node>
*/
protected String readCDATAofChild(Node node, String childName) {
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE && child.getNodeName().equals(childName)) {
NodeList descriptionChildren = child.getChildNodes();
for (int j = 0; j < descriptionChildren.getLength(); j++) {
Node descriptionChild = descriptionChildren.item(j);
if (descriptionChild.getNodeType() == Node.CDATA_SECTION_NODE) {
String value = descriptionChild.getNodeValue();
if (value != null)
return value;
}
}
return ""; //$NON-NLS-1$
}
}
return ""; //$NON-NLS-1$
}
//
// protected void assignPluginRecordFor(ISnippetsEntry entry, Element
// owningElement) {
// if (entry.getPluginRecord() != null) {
// owningElement.setAttribute(SnippetsPlugin.NAMES.PLUGIN,
// entry.getPluginRecord().getPluginName());
// owningElement.setAttribute(SnippetsPlugin.NAMES.VERSION,
// entry.getPluginRecord().getPluginVersion());
// }
// }
//
// protected Element createCategory(Document doc, ISnippetCategory
// category) {
// Element element = doc.createElement(SnippetsPlugin.NAMES.CATEGORY);
// assignEntryProperties(category, element);
// assignPluginRecordFor(category, element);
// for (int i = 0; i < category.getChildren().size(); i++) {
// ISnippetItem item = (ISnippetItem) category.getChildren().get(i);
// Element child = createItem(doc, item);
// element.appendChild(child);
// }
// return element;
// }
//
// protected Element createContent(Document doc, ISnippetItem item) {
// Element element = doc.createElement(SnippetsPlugin.NAMES.CONTENT);
// element.appendChild(doc.createCDATASection(item.getContentString()));
// return element;
// }
//
// protected String readDescription(Element parent) {
// return "";
// }
//
// protected Document createDocument(SnippetDefinitions defs) {
// Document document =
// CommonXML.getDocumentBuilder().getDOMImplementation().createDocument(null,
// SnippetsPlugin.NAMES.SNIPPETS, null);
// Element root = document.getDocumentElement();
// for (int i = 0; i < defs.getKnownPlugins().size(); i++) {
// PluginRecord record = (PluginRecord) defs.getKnownPlugins().get(i);
// root.appendChild(createPluginRecord(document, record));
// }
// for (int i = 0; i < defs.getCategories().size(); i++) {
// ISnippetCategory category = (ISnippetCategory)
// defs.getCategories().get(i);
// Element categoryElement = createCategory(document, category);
// root.appendChild(categoryElement);
// }
// return document;
// }
//
// protected Element createItem(Document doc, ISnippetItem item) {
// Element element = doc.createElement(SnippetsPlugin.NAMES.ITEM);
// assignEntryProperties(item, element);
// assignPluginRecordFor(item, element);
// element.setAttribute(SnippetsPlugin.NAMES.CATEGORY,
// item.getCategory().getId());
// element.setAttribute(SnippetsPlugin.NAMES.CLASSNAME,
// item.getClassName());
// element.setAttribute(SnippetsPlugin.NAMES.EDITORCLASSNAME,
// item.getEditorClassName());
// element.appendChild(createContent(doc, item));
// for (int i = 0; i < item.getVariables().size(); i++) {
// Element variable = createVariable(doc, (ISnippetVariable)
// item.getVariables().get(i));
// element.appendChild(variable);
// }
// return element;
// }
//
// protected Element createPluginRecord(Document doc, PluginRecord record)
// {
// Element element = doc.createElement(SnippetsPlugin.NAMES.PLUGIN);
// element.setAttribute(SnippetsPlugin.NAMES.NAME,
// record.getPluginName());
// element.setAttribute(SnippetsPlugin.NAMES.VERSION,
// record.getPluginVersion());
// return element;
// }
//
// protected Element createVariable(Document doc, ISnippetVariable
// variable) {
// Element element = doc.createElement(SnippetsPlugin.NAMES.VARIABLE);
// element.setAttribute(SnippetsPlugin.NAMES.ID, variable.getId());
// element.setAttribute(SnippetsPlugin.NAMES.DEFAULT,
// variable.getDefaultValue());
// element.appendChild(createDescription(doc, variable.getDescription()));
// return element;
// }
}