Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorTests.java15
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator.manipulator/src/org/eclipse/equinox/internal/simpleconfigurator/manipulator/SimpleConfiguratorManipulatorUtils.java15
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java36
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)) {

Back to the top