core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/Streamer.java
author dadubrow
Thu, 12 Aug 2010 15:22:11 -0500
changeset 1818 bb528d06abcd
parent 1810 2ccd3660a736
child 1824 7e34f628583a
permissions -rw-r--r--
initial commit of feature config import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     1
/*
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     3
* All rights reserved.
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     4
* This component and the accompanying materials are made available
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     6
* which accompanies this distribution, and is available
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     8
*
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
     9
* Initial Contributors:
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    11
*
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    12
* Contributors:
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    13
*
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    14
* Description: 
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    15
*
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    16
*/
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    17
package com.nokia.carbide.internal.discovery.ui.wizard;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    18
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    19
import java.io.IOException;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    20
import java.io.InputStream;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    21
import java.io.OutputStream;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    22
import java.net.URI;
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    23
import java.net.URISyntaxException;
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    24
import java.text.MessageFormat;
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    25
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    26
import javax.xml.parsers.ParserConfigurationException;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    27
import javax.xml.parsers.SAXParser;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    28
import javax.xml.parsers.SAXParserFactory;
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    29
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    30
import org.eclipse.equinox.p2.metadata.Version;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    31
import org.xml.sax.Attributes;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    32
import org.xml.sax.SAXException;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    33
import org.xml.sax.helpers.DefaultHandler;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    34
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    35
import com.nokia.carbide.discovery.ui.Activator;
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    36
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    37
/**
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    38
 * Serializes feature infos and repository URIs into output stream as XML
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    39
 * Example serialized single test connection:
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    40
 * 
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    41
 * <blockquote><pre>
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    42
 *&lt;featuresConfiguration version="1"&gt;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    43
 *	&lt;autoImportOriginalVersions value="false"/&gt;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    44
 *	&lt;repository uri="http://cdn.symbian.org/carbide/updates/3.0/discovery"/&gt;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    45
 *	&lt;feature id="com.nokia.example.feature.group" version="1.0.0"/&gt;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    46
 *&lt;/featuresConfiguration&gt;
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    47
 * </pre></blockquote>
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    48
 */
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    49
class Streamer {
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    50
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    51
	private static final String CURRENT_VERSION = "1"; //$NON-NLS-1$
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    52
	
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    53
	private static final String ROOT_ELEMENT = "featuresConfiguration"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    54
	private static final String WANTS_VERSIONS_ELEMENT = "wantsOriginalVersions"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    55
	private static final String REPOSITORY_ELEMENT = "repository"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    56
	private static final String FEATURE_ELEMENT = "feature"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    57
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    58
	private static final String VERSION_ATTR = "version"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    59
	private static final String VALUE_ATTR = "value"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    60
	private static final String URI_ATTR = "uri"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    61
	private static final String ID_ATTR = "id"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    62
	
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    63
	private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n"; //$NON-NLS-1$
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    64
	
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    65
	private static final String ROOT_START = "<" + ROOT_ELEMENT + " " + VERSION_ATTR + "=\"" + CURRENT_VERSION + "\">\n"; //$NON-NLS-1$ //$NON-NLS-2$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    66
	private static final String ROOT_END = "</" + ROOT_ELEMENT + ">\n"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    67
	
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    68
	private static final String ORIGINAL_VERSION_FMT = "\t<" + WANTS_VERSIONS_ELEMENT + " " + VALUE_ATTR + "=\"{0}\"/>\n"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    69
	private static final String REPOSITORY_FMT = "\t<" + REPOSITORY_ELEMENT + " " + URI_ATTR + "=\"{0}\"/>\n"; //$NON-NLS-1$
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    70
	private static final String FEATURE_FMT = "\t<" + FEATURE_ELEMENT + " " + ID_ATTR + "=\"{0}\" " + VERSION_ATTR + "=\"{1}\"/>\n"; //$NON-NLS-1$
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    71
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    72
	public static void writeToXML(OutputStream os, ImportExportData data) throws IOException {
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    73
		os.write(XML_HEADER.getBytes());
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    74
		os.write(ROOT_START.getBytes());
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    75
		
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    76
		// write auto-import original versions
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    77
		String originalVersionElement = MessageFormat.format(ORIGINAL_VERSION_FMT, data.getWantsVersions());
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    78
		os.write(originalVersionElement.getBytes());
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    79
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    80
		// write the repositories
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    81
		for (URI uri : data.getURIs()) {
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    82
			String repositoryElement = MessageFormat.format(REPOSITORY_FMT, uri);
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    83
			os.write(repositoryElement.getBytes());
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    84
		}
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    85
		
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    86
		// write the featureInfos
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    87
		for (FeatureInfo info : data.getFeatureInfos()) {
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    88
			String featureElement = MessageFormat.format(FEATURE_FMT, info.getId(), info.getVersion());
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    89
			os.write(featureElement.getBytes());
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    90
		}
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    91
		
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    92
		os.write(ROOT_END.getBytes());
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    93
		os.close();
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    94
	}
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
    95
	
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    96
	private static class ReadHandler extends DefaultHandler {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    97
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    98
		private final ImportExportData data;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
    99
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   100
		public ReadHandler(ImportExportData data) {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   101
			this.data = data;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   102
		}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   103
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   104
		@Override
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   105
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   106
			if (ROOT_ELEMENT.equals(qName)) {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   107
				String versionStr = attributes.getValue(VERSION_ATTR);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   108
				if (!CURRENT_VERSION.equals(versionStr))
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   109
					throw new IllegalArgumentException(
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   110
							MessageFormat.format("Can only read version {0} of <{1}>", CURRENT_VERSION, ROOT_ELEMENT));
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   111
			}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   112
			else if (WANTS_VERSIONS_ELEMENT.equals(qName)) {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   113
				String wantsVersions = attributes.getValue(VALUE_ATTR);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   114
				data.setWantsVersions(Boolean.parseBoolean(wantsVersions));
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   115
			}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   116
			else if (REPOSITORY_ELEMENT.equals(qName)) {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   117
				String uriStr = attributes.getValue(URI_ATTR);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   118
				try {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   119
					data.addURI(new URI(uriStr));
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   120
				} catch (URISyntaxException e) {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   121
					Activator.logError(MessageFormat.format("Could not parse URI: {0}", uriStr), e);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   122
				}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   123
			}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   124
			else if (FEATURE_ELEMENT.equals(qName)) {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   125
				String id = attributes.getValue(ID_ATTR);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   126
				String versionStr = attributes.getValue(VERSION_ATTR);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   127
				try {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   128
					Version version = Version.create(versionStr);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   129
					data.addFeatureInfo(new FeatureInfo(id, version));
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   130
				} catch (IllegalArgumentException e) {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   131
					Activator.logError(MessageFormat.format("Could not parse version: {0}", versionStr), e);
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   132
				}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   133
			}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   134
		}
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
   135
	}
1818
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   136
	
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   137
	public static ImportExportData readFromXML(InputStream is) throws SAXException, IOException, ParserConfigurationException {
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   138
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   139
		ImportExportData data = new ImportExportData();
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   140
		parser.parse(is, new ReadHandler(data));
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   141
		return data;
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   142
	}
bb528d06abcd initial commit of feature config import
dadubrow
parents: 1810
diff changeset
   143
	
1810
2ccd3660a736 feature config exporter + non-functional importer
dadubrow
parents:
diff changeset
   144
}