diff options
Diffstat (limited to 'json/bundles/org.eclipse.wst.json.core/src/org/eclipse/wst/json/core/internal/schema/catalog/EntryParser.java')
-rw-r--r-- | json/bundles/org.eclipse.wst.json.core/src/org/eclipse/wst/json/core/internal/schema/catalog/EntryParser.java | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/json/bundles/org.eclipse.wst.json.core/src/org/eclipse/wst/json/core/internal/schema/catalog/EntryParser.java b/json/bundles/org.eclipse.wst.json.core/src/org/eclipse/wst/json/core/internal/schema/catalog/EntryParser.java new file mode 100644 index 0000000000..acb659aae8 --- /dev/null +++ b/json/bundles/org.eclipse.wst.json.core/src/org/eclipse/wst/json/core/internal/schema/catalog/EntryParser.java @@ -0,0 +1,138 @@ +/************************************************************************************* + * Copyright (c) 2014-2015 Red Hat, Inc. 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: + * JBoss by Red Hat - Initial implementation. + ************************************************************************************/ +package org.eclipse.wst.json.core.internal.schema.catalog; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.wst.json.core.JSONCorePlugin; + +@SuppressWarnings("nls") +public class EntryParser { + + public static final String JSON_CATALOG_ENTRIES = "catalogEntries"; //$NON-NLS-1$ + private static final JAXBContext jaxbContext; + + static { + try { + jaxbContext = JAXBContext.newInstance(EntriesWrapper.class); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } + + public Set<UserEntry> parse(String xml) throws CoreException { + if (xml == null || xml.trim().isEmpty()) { + return null; + } + try { + EntriesWrapper list = (EntriesWrapper) unmarshall(jaxbContext, xml); + return list.entries == null ? Collections.<UserEntry>emptySet() : list.entries; + } catch (Exception e) { + throw new CoreException(new Status(IStatus.ERROR, JSONCorePlugin.PLUGIN_ID, + "Unable to parse entry", e)); + } + } + + public String serialize(Set<UserEntry> entries) throws CoreException { + try { + EntriesWrapper list = new EntriesWrapper(); + list.entries = entries; + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); + StringWriter writer = new StringWriter(); + marshaller.marshal(list, writer); + return writer.toString(); + } catch (Exception shouldntHappen) { + throw new CoreException(new Status(IStatus.ERROR, JSONCorePlugin.PLUGIN_ID, + "Unable to serialize entries ", shouldntHappen)); + } + } + + public static Set<UserEntry> getUserEntries() { + Set<UserEntry> entries = new LinkedHashSet<UserEntry>(); + IEclipsePreferences prefs = getPreferences(); + String xml = prefs.get(JSON_CATALOG_ENTRIES, null); + if (xml != null && !xml.trim().isEmpty()) { + try { + Set<UserEntry> set = new EntryParser().parse(xml); + if (set != null) { + entries.addAll(set); + } + } catch (CoreException e) { + IStatus status = new Status(IStatus.ERROR, JSONCorePlugin.PLUGIN_ID, e + .getLocalizedMessage(), e); + JSONCorePlugin.getDefault().getLog().log(status); + } + } + return entries; + } + + private static IEclipsePreferences getPreferences() { + IEclipsePreferences preferences = InstanceScope.INSTANCE + .getNode("org.eclipse.wst.json.ui"); //$NON-NLS-1$ + return preferences; + } + + @XmlRootElement(name = "entries") + @XmlAccessorType (XmlAccessType.FIELD) + static class EntriesWrapper { + @XmlElement(name = "entry", type=UserEntry.class) + Set<UserEntry> entries; + } + + protected Object unmarshall(JAXBContext jaxbContext, String xml) throws JAXBException, IOException, XMLStreamException { + return unmarshall(jaxbContext, new StringReader(xml)); + } + + protected Object unmarshall(JAXBContext jaxbContext, File file) throws JAXBException, IOException, XMLStreamException { + return unmarshall(jaxbContext, new FileReader(file)); + } + + protected Object unmarshall(JAXBContext jaxbContext, Reader reader) throws JAXBException, IOException, XMLStreamException { + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + XMLInputFactory xmlif = XMLInputFactory.newInstance(); + Reader r = null; + try { + r = reader; + XMLStreamReader xmler = xmlif.createXMLStreamReader(r); + return jaxbUnmarshaller.unmarshal(xmler); + } finally { + if (r != null) { + r.close(); + } + } + } +} |