diff options
author | Andrew Niefer | 2010-04-12 18:18:56 +0000 |
---|---|---|
committer | Andrew Niefer | 2010-04-12 18:18:56 +0000 |
commit | 2e911067afdde1a3153dc49680efb48fd05422ce (patch) | |
tree | 30c2aebba5353840900a7bc57014f456e463ecda | |
parent | f79eae3a74746ff8ddd071395e6c4aa3d98ddcc9 (diff) | |
download | rt.equinox.p2-2e911067afdde1a3153dc49680efb48fd05422ce.tar.gz rt.equinox.p2-2e911067afdde1a3153dc49680efb48fd05422ce.tar.xz rt.equinox.p2-2e911067afdde1a3153dc49680efb48fd05422ce.zip |
3 files changed, 63 insertions, 3 deletions
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorTests.java index 40913ec28..1ce5fc218 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorTests.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorTests.java @@ -64,4 +64,19 @@ public class SimpleConfiguratorManipulatorTests extends AbstractProvisioningTest assertEquals(bundles[0].getLocation(), new File(folder, "plu%2Cins/a_1.0.0.jar").toURI()); assertEquals(bundles[1].getLocation(), new File(folder, "plu,ins/b_1.0.0.jar").toURI()); } + + public void testUTF8Encoding() throws Exception { + File folder = getTestFolder("utf8Test"); + + File configurationFile = new File(folder, "bundle.info"); + + BundleInfo[] bundles = new BundleInfo[1]; + bundles[0] = new BundleInfo("a", "1.0.0", new File(folder, "\u0CA0_\u0CA0.jar").toURI(), BundleInfo.NO_LEVEL, false); + + SimpleConfiguratorManipulator manipulator = new SimpleConfiguratorManipulatorImpl(); + manipulator.saveConfiguration(bundles, configurationFile, folder.toURI()); + + bundles = manipulator.loadConfiguration(new FileInputStream(configurationFile), folder.toURI()); + assertEquals(bundles[0].getLocation(), new File(folder, "\u0CA0_\u0CA0.jar").toURI()); + } } diff --git a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/src/org/eclipse/equinox/internal/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorUtils.java b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/src/org/eclipse/equinox/internal/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorUtils.java index 1a80ec0c3..84c8c7b31 100644 --- a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/src/org/eclipse/equinox/internal/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorUtils.java +++ b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/src/org/eclipse/equinox/internal/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorUtils.java @@ -15,6 +15,7 @@ import java.util.Comparator; import org.eclipse.equinox.internal.frameworkadmin.equinox.Messages; import org.eclipse.equinox.internal.frameworkadmin.utils.Utils; import org.eclipse.equinox.internal.simpleconfigurator.utils.BundleInfo; +import org.eclipse.equinox.internal.simpleconfigurator.utils.SimpleConfiguratorUtils; import org.eclipse.equinox.simpleconfigurator.manipulator.SimpleConfiguratorManipulator; import org.osgi.framework.Version; @@ -23,6 +24,7 @@ public class SimpleConfiguratorManipulatorUtils { private static final String VERSION_PREFIX = "#version="; //$NON-NLS-1$ private static final String VERSION_1 = "1"; //$NON-NLS-1$ private static final Version OLD_STYLE_SIMPLE_CONFIGURATOR_VERSION = new Version("1.0.100.v20081206"); //$NON-NLS-1$ + private static final Version DEFAULT_ENCODING_CONFIGURATOR_VERSION = new Version("2.0.0.v20100329"); //$NON-NLS-1$ public static void writeConfiguration(BundleInfo[] simpleInfos, File outputFile) throws IOException { if (!Utils.createParentDir(outputFile)) { @@ -69,17 +71,26 @@ public class SimpleConfiguratorManipulatorUtils { BufferedWriter writer = null; boolean oldStyle = false; + boolean utf8 = true; for (int i = 0; i < simpleInfos.length; i++) { if (SimpleConfiguratorManipulator.SERVICE_PROP_VALUE_CONFIGURATOR_SYMBOLICNAME.equals(simpleInfos[i].getSymbolicName())) { Version version = new Version(simpleInfos[i].getVersion()); if (version.compareTo(OLD_STYLE_SIMPLE_CONFIGURATOR_VERSION) < 0) oldStyle = true; + if (version.compareTo(DEFAULT_ENCODING_CONFIGURATOR_VERSION) <= 0) + utf8 = false; break; } } - writer = new BufferedWriter(new OutputStreamWriter(stream)); - // version line + if (utf8) { + writer = new BufferedWriter(new OutputStreamWriter(stream, "UTF-8")); //$NON-NLS-1$ + //encoding is expected to be the first line + writer.write(SimpleConfiguratorUtils.ENCODING_UTF8); + writer.newLine(); + } else { + writer = new BufferedWriter(new OutputStreamWriter(stream)); + } writer.write(createVersionLine()); writer.newLine(); diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java index 037feccd4..0ab0582f2 100644 --- a/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java +++ b/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java @@ -18,6 +18,7 @@ public class SimpleConfiguratorUtils { private static final String UNC_PREFIX = "//"; private static final String VERSION_PREFIX = "#version="; + public static final String ENCODING_UTF8 = "#encoding=UTF-8"; public static final Version COMPATIBLE_VERSION = new Version(1, 0, 0); public static final VersionRange VERSION_TOLERANCE = new VersionRange(COMPATIBLE_VERSION, true, new Version(2, 0, 0), false); @@ -56,7 +57,10 @@ public class SimpleConfiguratorUtils { public static List readConfiguration(InputStream stream, URI base) throws IOException { List bundles = new ArrayList(); - BufferedReader r = new BufferedReader(new InputStreamReader(stream)); + BufferedInputStream bufferedStream = new BufferedInputStream(stream); + String encoding = determineEncoding(bufferedStream); + BufferedReader r = new BufferedReader(encoding == null ? new InputStreamReader(bufferedStream) : new InputStreamReader(bufferedStream, encoding)); + String line; try { while ((line = r.readLine()) != null) { @@ -84,6 +88,36 @@ public class SimpleConfiguratorUtils { return bundles; } + /* + * We expect the first line of the bundles.info to be + * #encoding=UTF-8 + * if it isn't, then it is an older bundles.info and should be + * read with the default encoding + */ + private static String determineEncoding(BufferedInputStream stream) { + byte[] utfBytes = ENCODING_UTF8.getBytes(); + byte[] buffer = new byte[utfBytes.length]; + + int bytesRead = -1; + stream.mark(utfBytes.length + 1); + try { + bytesRead = stream.read(buffer); + } catch (IOException e) { + //do nothing + } + + if (bytesRead == utfBytes.length && Arrays.equals(utfBytes, buffer)) + return "UTF-8"; + + //if the first bytes weren't the encoding, need to reset + try { + stream.reset(); + } catch (IOException e) { + // nothing + } + return null; + } + public static void parseCommentLine(String line) { // version if (line.startsWith(VERSION_PREFIX)) { |