[SCM] eclipse - Powerful IDE written in java - Debian package. branch, master, updated. c4356a15f8fa9720b4a55135d2191de60092f1e2
Niels Thykier
nthykier-guest at alioth.debian.org
Sat Mar 13 14:18:12 UTC 2010
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "eclipse - Powerful IDE written in java - Debian package.".
The branch, master has been updated
via c4356a15f8fa9720b4a55135d2191de60092f1e2 (commit)
via ca27d3dadce9c47d6e7e7080a091d70981acdd61 (commit)
via 4fa636b2ac83973c36b33bb678a8ba78b8b5136f (commit)
via 37be9b626609283cf5d741e6751eea8eb3c5dd14 (commit)
via 7ed1f1f71dbcdbd287ac23ae8756d59de16d8cbe (commit)
via 90205164e0ff66ecd39f4c304db76bf99be954ee (commit)
via b5cea9838f555e4cc27dd9e4a9cd44de8805653a (commit)
from ae3f1c53ace9f56b863bf3e3dc340f780cfcc580 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c4356a15f8fa9720b4a55135d2191de60092f1e2
Author: Niels Thykier <niels at thykier.net>
Date: Sat Mar 13 15:18:03 2010 +0100
Made osgi.util compile from source and refreshed patches.
commit ca27d3dadce9c47d6e7e7080a091d70981acdd61
Merge: 37be9b626609283cf5d741e6751eea8eb3c5dd14 4fa636b2ac83973c36b33bb678a8ba78b8b5136f
Author: Niels Thykier <niels at thykier.net>
Date: Sat Mar 13 15:14:48 2010 +0100
Merge branch 'master' of ssh://alioth.debian.org//var/lib/gforge/chroot/home/users/nthykier-guest/eclipse
commit 4fa636b2ac83973c36b33bb678a8ba78b8b5136f
Merge: ae3f1c53ace9f56b863bf3e3dc340f780cfcc580 90205164e0ff66ecd39f4c304db76bf99be954ee
Author: Niels Thykier <nthykier-guest at alioth.debian.org>
Date: Sat Mar 13 14:12:00 2010 +0000
Merge commit 'origin/upstream'
commit 37be9b626609283cf5d741e6751eea8eb3c5dd14
Merge: 7ed1f1f71dbcdbd287ac23ae8756d59de16d8cbe ae3f1c53ace9f56b863bf3e3dc340f780cfcc580
Author: Niels Thykier <niels at thykier.net>
Date: Sat Mar 13 14:57:30 2010 +0100
Merge branch 'master' of ssh://git.debian.org/git/pkg-java/eclipse
commit 7ed1f1f71dbcdbd287ac23ae8756d59de16d8cbe
Author: Niels Thykier <niels at thykier.net>
Date: Sat Mar 13 14:56:50 2010 +0100
Added targets for refreshing patches.
-----------------------------------------------------------------------
Summary of changes:
build.xml | 1 +
debian/patches/eclipse-manpage.patch | 12 +-
debian/patches/fix-shell-script-perm.patch | 6 +-
debian/patches/lucene.patch | 6 +-
debian/patches/osgi-util.patch | 38 ++
debian/patches/pdebuild-path-copy-platform.patch | 6 +-
debian/patches/pdebuild-script.patch | 8 +-
debian/patches/series | 1 +
debian/patches/symlink-system-files.patch | 6 +-
debian/rules | 19 +
.../.cvsignore | 1 -
eclipse/ecf-src/org.eclipse.ecf/.cvsignore | 1 -
.../org/osgi/util/measurement/Measurement.class | Bin 4682 -> 0 bytes
.../org/osgi/util/measurement/State.class | Bin 1607 -> 0 bytes
.../org/osgi/util/measurement/Unit.class | Bin 6135 -> 0 bytes
.../org/osgi/util/position/Position.class | Bin 2798 -> 0 bytes
.../org/osgi/util/xml/XMLParserActivator.class | Bin 7598 -> 0 bytes
eclipse/plugins/org.eclipse.osgi.util/src.zip | Bin 19436 -> 0 bytes
.../src/org/osgi/util/measurement/Measurement.java | 484 ++++++++++++++++++
.../src/org/osgi/util/measurement/State.java | 144 ++++++
.../src/org/osgi/util/measurement/Unit.java | 521 ++++++++++++++++++++
.../src/org/osgi/util/measurement/package.html | 10 +
.../src/org/osgi/util/measurement/packageinfo | 1 +
.../src/org/osgi/util/position/Position.java | 240 +++++++++
.../src/org/osgi/util/position/package.html | 10 +
.../src/org/osgi/util/position/packageinfo | 1 +
.../src/org/osgi/util/xml/XMLParserActivator.java | 513 +++++++++++++++++++
.../src/org/osgi/util/xml/package.html | 10 +
.../src/org/osgi/util/xml/packageinfo | 1 +
patches/osgi-util.patch | 20 +
30 files changed, 2029 insertions(+), 31 deletions(-)
diff --git a/build.xml b/build.xml
index 15920d4..9e11144 100644
--- a/build.xml
+++ b/build.xml
@@ -257,6 +257,7 @@
<patch patchfile="${basedir}/patches/eclipse-nosourcebundlesfordependencies.patch" dir="${buildDirectory}" strip="1" />
<patch patchfile="${basedir}/patches/eclipse-use-newer-commons-codec.patch" dir="${buildDirectory}" strip="0" />
<patch patchfile="${basedir}/patches/addEcfQualifiers.patch" dir="${buildDirectory}" strip="0" />
+ <patch patchfile="${basedir}/patches/osgi-util.patch" dir="${buildDirectory}" strip="1" />
<replace file="${buildDirectory}/plugins/org.eclipse.pde.build/templates/package-build/build.properties" token="/usr/share/eclipse" value="/usr/${libDir}/eclipse" />
<chmod dir="${buildDirectory}/plugins/org.eclipse.pde.build/templates/package-build" includes="*.sh" perm="a+x" />
<!-- end eclipse-build-only patches -->
diff --git a/debian/patches/eclipse-manpage.patch b/debian/patches/eclipse-manpage.patch
index efa6c23..a9814e5 100644
--- a/debian/patches/eclipse-manpage.patch
+++ b/debian/patches/eclipse-manpage.patch
@@ -3,10 +3,8 @@ Author: Pablo Duboue <pablo.duboue at gmail.com>
Bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=30107
Bug-Ubuntu: https://launchpad.net/bugs/494065
-Index: debian.git/eclipse.1.xml
-===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ debian.git/eclipse.1.xml 2010-03-11 14:14:55.285986118 +0100
++++ b/eclipse.1.xml 2010-03-13 14:59:32.355340858 +0100
@@ -0,0 +1,616 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
@@ -624,11 +622,9 @@ Index: debian.git/eclipse.1.xml
+
+</refsect1>
+</refentry>
-Index: debian.git/build.xml
-===================================================================
---- debian.git.orig/build.xml 2010-03-11 14:14:53.935986109 +0100
-+++ debian.git/build.xml 2010-03-11 14:14:55.285986118 +0100
-@@ -814,6 +814,12 @@
+--- a/build.xml 2010-03-13 14:59:31.908349246 +0100
++++ b/build.xml 2010-03-13 14:59:32.359350781 +0100
+@@ -815,6 +815,12 @@
<!-- eclipse binary -->
<mkdir dir="${destDir}${prefix}/bin" />
<symlink link="${destDir}${prefix}/bin/eclipse" resource="../${libDir}/eclipse/eclipse" />
diff --git a/debian/patches/fix-shell-script-perm.patch b/debian/patches/fix-shell-script-perm.patch
index bfbc2f5..11ccb4b 100644
--- a/debian/patches/fix-shell-script-perm.patch
+++ b/debian/patches/fix-shell-script-perm.patch
@@ -3,10 +3,8 @@ Author: Benjamin Drung <bdrung at ubuntu.com>
Bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=295526
Applied-Upstream: no
-Index: debian.git/build.xml
-===================================================================
---- debian.git.orig/build.xml 2010-02-26 17:36:44.005671264 +0100
-+++ debian.git/build.xml 2010-02-26 17:36:47.164421642 +0100
+--- a/build.xml 2010-03-13 14:59:31.612340808 +0100
++++ b/build.xml 2010-03-13 14:59:31.908349246 +0100
@@ -251,6 +251,7 @@
<patch patchfile="${basedir}/patches/donotstorebuildlogsinfiles.patch" dir="${buildDirectory}" strip="3" />
<patch patchfile="${basedir}/patches/donotsetjavahomeandoptimizeliblocalfile.patch" dir="${buildDirectory}" strip="3" />
diff --git a/debian/patches/lucene.patch b/debian/patches/lucene.patch
index 1367234..100d6c7 100644
--- a/debian/patches/lucene.patch
+++ b/debian/patches/lucene.patch
@@ -1,10 +1,8 @@
Description: Removed expected version for lucene2, since our version is "too new".
Author: Niels Thykier <niels at thykier.net>
-Index: debian.git/eclipse/plugins/org.eclipse.help.base/META-INF/MANIFEST.MF
-===================================================================
---- debian.git.orig/eclipse/plugins/org.eclipse.help.base/META-INF/MANIFEST.MF 2010-02-24 16:33:29.035338554 +0100
-+++ debian.git/eclipse/plugins/org.eclipse.help.base/META-INF/MANIFEST.MF 2010-02-24 16:33:48.454089016 +0100
+--- a/eclipse/plugins/org.eclipse.help.base/META-INF/MANIFEST.MF 2010-03-13 14:59:31.540352790 +0100
++++ b/eclipse/plugins/org.eclipse.help.base/META-INF/MANIFEST.MF 2010-03-13 14:59:32.108351420 +0100
@@ -36,8 +36,8 @@
org.eclipse.help.search,
org.eclipse.help.server,
diff --git a/debian/patches/osgi-util.patch b/debian/patches/osgi-util.patch
new file mode 100644
index 0000000..e3118e3
--- /dev/null
+++ b/debian/patches/osgi-util.patch
@@ -0,0 +1,38 @@
+Description: Updates o.e.osgi.util's build properties so it builds from source.
+Author: Niels Thykier <niels at thykier.net>
+Bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=305244
+Applied-Upstream: no
+
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ b/patches/osgi-util.patch 2010-03-13 14:59:31.612340808 +0100
+@@ -0,0 +1,20 @@
++diff --git a/eclipse/plugins/org.eclipse.osgi.util/build.properties b/eclipse/plugins/org.eclipse.osgi.util/build.properties
++index 2a015f5..270afcd 100644
++--- a/plugins/org.eclipse.osgi.util/build.properties
+++++ b/plugins/org.eclipse.osgi.util/build.properties
++@@ -12,10 +12,10 @@ bin.includes = plugin.properties,\
++ org/,\
++ about.html,\
++ META-INF/,\
+++ about_files/,\
+++ .
+++src.includes = about.html,\
++ about_files/
++-src.includes = src.zip,\
++- about.html,\
++- about_files/
++-source.. = .
+++source.. = src/
++ output.. = .
++-customBuildCallbacks=customBuildCallbacks.xml
+++#customBuildCallbacks=customBuildCallbacks.xml
+--- a/build.xml 2010-03-13 14:59:31.544341272 +0100
++++ b/build.xml 2010-03-13 14:59:31.612340808 +0100
+@@ -256,6 +256,7 @@
+ <patch patchfile="${basedir}/patches/eclipse-nosourcebundlesfordependencies.patch" dir="${buildDirectory}" strip="1" />
+ <patch patchfile="${basedir}/patches/eclipse-use-newer-commons-codec.patch" dir="${buildDirectory}" strip="0" />
+ <patch patchfile="${basedir}/patches/addEcfQualifiers.patch" dir="${buildDirectory}" strip="0" />
++ <patch patchfile="${basedir}/patches/osgi-util.patch" dir="${buildDirectory}" strip="1" />
+ <replace file="${buildDirectory}/plugins/org.eclipse.pde.build/templates/package-build/build.properties" token="/usr/share/eclipse" value="/usr/${libDir}/eclipse" />
+ <chmod dir="${buildDirectory}/plugins/org.eclipse.pde.build/templates/package-build" includes="*.sh" perm="a+x" />
+ <!-- end eclipse-build-only patches -->
diff --git a/debian/patches/pdebuild-path-copy-platform.patch b/debian/patches/pdebuild-path-copy-platform.patch
index f3c98b3..96d9b48 100644
--- a/debian/patches/pdebuild-path-copy-platform.patch
+++ b/debian/patches/pdebuild-path-copy-platform.patch
@@ -4,10 +4,8 @@ Description: Substitute the path to copy-platform with a variable.
Author: Niels Thykier <niels at thykier.net>
Forwarded: not-needed
-Index: debian.git/pdebuild/eclipse-pdebuild.sh
-===================================================================
---- debian.git.orig/pdebuild/eclipse-pdebuild.sh 2010-02-24 16:34:00.854089200 +0100
-+++ debian.git/pdebuild/eclipse-pdebuild.sh 2010-02-24 16:34:03.234089450 +0100
+--- a/pdebuild/eclipse-pdebuild.sh 2010-03-13 14:59:32.656341425 +0100
++++ b/pdebuild/eclipse-pdebuild.sh 2010-03-13 14:59:32.880339287 +0100
@@ -27,19 +27,19 @@
# counting as arguments to copy-platform -- overholt, 2008-03
if [ -z "$dependencies" ]; then
diff --git a/debian/patches/pdebuild-script.patch b/debian/patches/pdebuild-script.patch
index 85dc1a5..badc150 100644
--- a/debian/patches/pdebuild-script.patch
+++ b/debian/patches/pdebuild-script.patch
@@ -1,10 +1,8 @@
Description: Remove Fedora specific parts and change paths
Author: Niels Thykier <niels at thykier.net>
-Index: debian.git/pdebuild/eclipse-pdebuild.sh
-===================================================================
---- debian.git.orig/pdebuild/eclipse-pdebuild.sh 2010-02-24 16:33:29.015338686 +0100
-+++ debian.git/pdebuild/eclipse-pdebuild.sh 2010-02-24 16:34:00.854089200 +0100
+--- a/pdebuild/eclipse-pdebuild.sh 2010-03-13 14:59:31.536348594 +0100
++++ b/pdebuild/eclipse-pdebuild.sh 2010-03-13 14:59:32.656341425 +0100
@@ -123,8 +123,8 @@
buildDir=$PWD/build
SDK=$buildDir/SDK
@@ -34,5 +32,3 @@ Index: debian.git/pdebuild/eclipse-pdebuild.sh
$orbitDeps \
-Dtesting="$testing" \
$additionalArgs \
-diff --git a/pdebuild/eclipse-pdebuild.sh b/pdebuild/eclipse-pdebuild.sh
-index 56d23f9..bf9f039 100755
diff --git a/debian/patches/series b/debian/patches/series
index 9f83977..bce8835 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
+osgi-util.patch
fix-shell-script-perm.patch
lucene.patch
eclipse-manpage.patch
diff --git a/debian/patches/symlink-system-files.patch b/debian/patches/symlink-system-files.patch
index af40326..bff1d3e 100644
--- a/debian/patches/symlink-system-files.patch
+++ b/debian/patches/symlink-system-files.patch
@@ -1,9 +1,9 @@
Description: Symlink system ant files
Author: Benjamin Drung <bdrung at ubuntu.com>
---- eclipse-3.5.2.orig/nonosgidependencies.properties
-+++ eclipse-3.5.2/nonosgidependencies.properties
-@@ -18,3 +18,8 @@ org.apache.ant_1.7.1.v20090120-1145/lib/
+--- a/nonosgidependencies.properties 2010-03-13 14:59:31.536348594 +0100
++++ b/nonosgidependencies.properties 2010-03-13 14:59:33.124339775 +0100
+@@ -18,3 +18,8 @@
org.apache.ant_1.7.1.v20090120-1145/lib/ant-trax.jar=/usr/share/java/ant/ant-trax.jar:/usr/share/java/ant-trax.jar
org.junit_3.8.2.v20090203-1005/junit.jar=/usr/share/java/junit.jar
org.junit4/junit.jar=/usr/share/java/junit4.jar
diff --git a/debian/rules b/debian/rules
index 9e4f310..3e81087 100755
--- a/debian/rules
+++ b/debian/rules
@@ -59,6 +59,25 @@ ifeq ($(ECLIPSE_BUILD_ARCH),)
ECLIPSE_BUILD_ARCH=$(DEB_HOST_ARCH_CPU)
endif
+unapply-patches:
+ for P in `tac debian/patches/series` ; do \
+ patch -p1 -R < debian/patches/$$P || exit 1;\
+ done
+
+apply-patches:
+ for P in `cat debian/patches/series` ; do \
+ patch -p1 < debian/patches/$$P || exit 1;\
+ done
+
+refresh-patches: unapply-patches
+ for P in `cat debian/patches/series` ; do \
+ (QUILT_PATCHES=debian/patches quilt --quiltrc /dev/null push || test $$? = 2) || exit 1 ;\
+ QUILT_PATCHES=debian/patches quilt --quiltrc /dev/null refresh -p ab --no-index || exit 1 ;\
+ done
+ rm -fr .pc
+
+# We need this for overriding uname, upstream expects a slightly
+# different behaviour than Debian's uname.
export PATH:=$(CURDIR)/debian/extra/bin:$(PATH)
# This has to go in an arch package, as some of the version numbers
diff --git a/eclipse/ecf-src/org.eclipse.ecf.provider.filetransfer.httpclient/.cvsignore b/eclipse/ecf-src/org.eclipse.ecf.provider.filetransfer.httpclient/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/eclipse/ecf-src/org.eclipse.ecf.provider.filetransfer.httpclient/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/eclipse/ecf-src/org.eclipse.ecf/.cvsignore b/eclipse/ecf-src/org.eclipse.ecf/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/eclipse/ecf-src/org.eclipse.ecf/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/Measurement.class b/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/Measurement.class
deleted file mode 100644
index 87566ff..0000000
Binary files a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/Measurement.class and /dev/null differ
diff --git a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/State.class b/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/State.class
deleted file mode 100644
index 38e90d6..0000000
Binary files a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/State.class and /dev/null differ
diff --git a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/Unit.class b/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/Unit.class
deleted file mode 100644
index 83487e2..0000000
Binary files a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/measurement/Unit.class and /dev/null differ
diff --git a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/position/Position.class b/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/position/Position.class
deleted file mode 100644
index 1475b2c..0000000
Binary files a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/position/Position.class and /dev/null differ
diff --git a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/xml/XMLParserActivator.class b/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/xml/XMLParserActivator.class
deleted file mode 100644
index e215e38..0000000
Binary files a/eclipse/plugins/org.eclipse.osgi.util/org/osgi/util/xml/XMLParserActivator.class and /dev/null differ
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src.zip b/eclipse/plugins/org.eclipse.osgi.util/src.zip
deleted file mode 100644
index 8f64acb..0000000
Binary files a/eclipse/plugins/org.eclipse.osgi.util/src.zip and /dev/null differ
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/Measurement.java b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/Measurement.java
new file mode 100644
index 0000000..82779cc
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/Measurement.java
@@ -0,0 +1,484 @@
+/*
+ * Copyright (c) OSGi Alliance (2002, 2008). All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.osgi.util.measurement;
+
+/**
+ * Represents a value with an error, a unit and a time-stamp.
+ *
+ * <p>
+ * A <code>Measurement</code> object is used for maintaining the tuple of value,
+ * error, unit and time-stamp. The value and error are represented as doubles
+ * and the time is measured in milliseconds since midnight, January 1, 1970 UTC.
+ *
+ * <p>
+ * Mathematic methods are provided that correctly calculate taking the error
+ * into account. A runtime error will occur when two measurements are used in an
+ * incompatible way. E.g., when a speed (m/s) is added to a distance (m). The
+ * measurement class will correctly track changes in unit during multiplication
+ * and division, always coercing the result to the most simple form. See
+ * {@link Unit} for more information on the supported units.
+ *
+ * <p>
+ * Errors in the measurement class are absolute errors. Measurement errors
+ * should use the P95 rule. Actual values must fall in the range value +/- error
+ * 95% or more of the time.
+ *
+ * <p>
+ * A <code>Measurement</code> object is immutable in order to be easily shared.
+ *
+ * <p>
+ * Note: This class has a natural ordering that is inconsistent with equals. See
+ * {@link #compareTo}.
+ *
+ * @Immutable
+ * @version $Revision: 5715 $
+ */
+public class Measurement implements Comparable {
+ private final double value;
+ private final double error;
+ private final long time;
+ private final Unit unit;
+ private transient volatile String name;
+ private transient volatile int hashCode;
+
+ /**
+ * Create a new <code>Measurement</code> object.
+ *
+ * @param value The value of the <code>Measurement</code>.
+ * @param error The error of the <code>Measurement</code>.
+ * @param unit The <code>Unit</code> object in which the value is measured. If
+ * this argument is <code>null</code>, then the unit will be set to
+ * {@link Unit#unity}.
+ * @param time The time measured in milliseconds since midnight, January 1,
+ * 1970 UTC.
+ */
+ public Measurement(double value, double error, Unit unit, long time) {
+ this.value = value;
+ this.error = Math.abs(error);
+ this.unit = (unit != null) ? unit : Unit.unity;
+ this.time = time;
+ }
+
+ /**
+ * Create a new <code>Measurement</code> object with a time of zero.
+ *
+ * @param value The value of the <code>Measurement</code>.
+ * @param error The error of the <code>Measurement</code>.
+ * @param unit The <code>Unit</code> object in which the value is measured. If
+ * this argument is <code>null</code>, then the unit will be set to
+ * {@link Unit#unity}.
+ */
+ public Measurement(double value, double error, Unit unit) {
+ this(value, error, unit, 0l);
+ }
+
+ /**
+ * Create a new <code>Measurement</code> object with an error of 0.0 and a
+ * time of zero.
+ *
+ * @param value The value of the <code>Measurement</code>.
+ * @param unit The <code>Unit</code> in which the value is measured. If this
+ * argument is <code>null</code>, then the unit will be set to
+ * {@link Unit#unity}.
+ */
+ public Measurement(double value, Unit unit) {
+ this(value, 0.0d, unit, 0l);
+ }
+
+ /**
+ * Create a new <code>Measurement</code> object with an error of 0.0, a unit
+ * of {@link Unit#unity} and a time of zero.
+ *
+ * @param value The value of the <code>Measurement</code>.
+ */
+ public Measurement(double value) {
+ this(value, 0.0d, null, 0l);
+ }
+
+ /**
+ * Returns the value of this <code>Measurement</code> object.
+ *
+ * @return The value of this <code>Measurement</code> object as a double.
+ */
+ public final double getValue() {
+ return value;
+ }
+
+ /**
+ * Returns the error of this <code>Measurement</code> object. The error is
+ * always a positive value.
+ *
+ * @return The error of this <code>Measurement</code> as a double.
+ */
+ public final double getError() {
+ return error;
+ }
+
+ /**
+ * Returns the <code>Unit</code> object of this <code>Measurement</code> object.
+ *
+ * @return The <code>Unit</code> object of this <code>Measurement</code> object.
+ *
+ * @see Unit
+ */
+ public final Unit getUnit() {
+ return unit;
+ }
+
+ /**
+ * Returns the time at which this <code>Measurement</code> object was taken.
+ * The time is measured in milliseconds since midnight, January 1, 1970 UTC,
+ * or zero when not defined.
+ *
+ * @return The time at which this <code>Measurement</code> object was taken or
+ * zero.
+ */
+ public final long getTime() {
+ return time;
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the product of this
+ * object multiplied by the specified object.
+ *
+ * @param m The <code>Measurement</code> object that will be multiplied with
+ * this object.
+ * @return A new <code>Measurement</code> that is the product of this object
+ * multiplied by the specified object. The error and unit of the new
+ * object are computed. The time of the new object is set to the
+ * time of this object.
+ * @throws ArithmeticException If the <code>Unit</code> objects of this object
+ * and the specified object cannot be multiplied.
+ * @see Unit
+ */
+ public Measurement mul(Measurement m) {
+ double mvalue = m.value;
+ return new Measurement(value * mvalue, Math.abs(value) * m.error
+ + error * Math.abs(mvalue), unit.mul(m.unit), time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the product of this
+ * object multiplied by the specified value.
+ *
+ * @param d The value that will be multiplied with this object.
+ * @param u The <code>Unit</code> of the specified value.
+ * @return A new <code>Measurement</code> object that is the product of this
+ * object multiplied by the specified value. The error and unit of
+ * the new object are computed. The time of the new object is set to
+ * the time of this object.
+ * @throws ArithmeticException If the units of this object and the specified
+ * value cannot be multiplied.
+ * @see Unit
+ */
+ public Measurement mul(double d, Unit u) {
+ return new Measurement(value * d, error * Math.abs(d), unit.mul(u),
+ time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the product of this
+ * object multiplied by the specified value.
+ *
+ * @param d The value that will be multiplied with this object.
+ * @return A new <code>Measurement</code> object that is the product of this
+ * object multiplied by the specified value. The error of the new
+ * object is computed. The unit and time of the new object is set to
+ * the unit and time of this object.
+ */
+ public Measurement mul(double d) {
+ return new Measurement(value * d, error * Math.abs(d), unit, time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the quotient of this
+ * object divided by the specified object.
+ *
+ * @param m The <code>Measurement</code> object that will be the divisor of
+ * this object.
+ * @return A new <code>Measurement</code> object that is the quotient of this
+ * object divided by the specified object. The error and unit of the
+ * new object are computed. The time of the new object is set to the
+ * time of this object.
+ * @throws ArithmeticException If the <code>Unit</code> objects of this object
+ * and the specified object cannot be divided.
+ * @see Unit
+ */
+ public Measurement div(Measurement m) {
+ double mvalue = m.value;
+ return new Measurement(value / mvalue,
+ (Math.abs(value) * m.error + error * Math.abs(mvalue))
+ / (mvalue * mvalue), unit.div(m.unit), time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the quotient of this
+ * object divided by the specified value.
+ *
+ * @param d The value that will be the divisor of this object.
+ * @param u The <code>Unit</code> object of the specified value.
+ * @return A new <code>Measurement</code> that is the quotient of this object
+ * divided by the specified value. The error and unit of the new
+ * object are computed. The time of the new object is set to the
+ * time of this object.
+ * @throws ArithmeticException If the <code>Unit</code> objects of this object
+ * and the specified object cannot be divided.
+ * @see Unit
+ */
+ public Measurement div(double d, Unit u) {
+ return new Measurement(value / d, error / Math.abs(d), unit.div(u),
+ time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the quotient of this
+ * object divided by the specified value.
+ *
+ * @param d The value that will be the divisor of this object.
+ * @return A new <code>Measurement</code> object that is the quotient of this
+ * object divided by the specified value. The error of the new
+ * object is computed. The unit and time of the new object is set to
+ * the <code>Unit</code> and time of this object.
+ */
+ public Measurement div(double d) {
+ return new Measurement(value / d, error / Math.abs(d), unit, time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the sum of this
+ * object added to the specified object.
+ *
+ * The error and unit of the new object are computed. The time of the new
+ * object is set to the time of this object.
+ *
+ * @param m The <code>Measurement</code> object that will be added with this
+ * object.
+ * @return A new <code>Measurement</code> object that is the sum of this and
+ * m.
+ * @see Unit
+ * @throws ArithmeticException If the <code>Unit</code> objects of this object
+ * and the specified object cannot be added.
+ */
+ public Measurement add(Measurement m) {
+ return new Measurement(value + m.value, error + m.error, unit
+ .add(m.unit), time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the sum of this
+ * object added to the specified value.
+ *
+ * @param d The value that will be added with this object.
+ * @param u The <code>Unit</code> object of the specified value.
+ * @return A new <code>Measurement</code> object that is the sum of this
+ * object added to the specified value. The unit of the new object
+ * is computed. The error and time of the new object is set to the
+ * error and time of this object.
+ * @throws ArithmeticException If the <code>Unit</code> objects of this object
+ * and the specified value cannot be added.
+ * @see Unit
+ */
+ public Measurement add(double d, Unit u) {
+ return new Measurement(value + d, error, unit.add(u), time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the sum of this
+ * object added to the specified value.
+ *
+ * @param d The value that will be added with this object.
+ * @return A new <code>Measurement</code> object that is the sum of this
+ * object added to the specified value. The error, unit, and time of
+ * the new object is set to the error, <code>Unit</code> and time of
+ * this object.
+ */
+ public Measurement add(double d) {
+ return new Measurement(value + d, error, unit, time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the subtraction of
+ * the specified object from this object.
+ *
+ * @param m The <code>Measurement</code> object that will be subtracted from
+ * this object.
+ * @return A new <code>Measurement</code> object that is the subtraction of
+ * the specified object from this object. The error and unit of the
+ * new object are computed. The time of the new object is set to the
+ * time of this object.
+ * @throws ArithmeticException If the <code>Unit</code> objects of this object
+ * and the specified object cannot be subtracted.
+ * @see Unit
+ */
+ public Measurement sub(Measurement m) {
+ return new Measurement(value - m.value, error + m.error, unit
+ .sub(m.unit), time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the subtraction of
+ * the specified value from this object.
+ *
+ * @param d The value that will be subtracted from this object.
+ * @param u The <code>Unit</code> object of the specified value.
+ * @return A new <code>Measurement</code> object that is the subtraction of
+ * the specified value from this object. The unit of the new object
+ * is computed. The error and time of the new object is set to the
+ * error and time of this object.
+ * @throws ArithmeticException If the <code>Unit</code> objects of this object
+ * and the specified object cannot be subtracted.
+ * @see Unit
+ */
+ public Measurement sub(double d, Unit u) {
+ return new Measurement(value - d, error, unit.sub(u), time);
+ }
+
+ /**
+ * Returns a new <code>Measurement</code> object that is the subtraction of
+ * the specified value from this object.
+ *
+ * @param d The value that will be subtracted from this object.
+ * @return A new <code>Measurement</code> object that is the subtraction of
+ * the specified value from this object. The error, unit and time of
+ * the new object is set to the error, <code>Unit</code> object and
+ * time of this object.
+ */
+ public Measurement sub(double d) {
+ return new Measurement(value - d, error, unit, time);
+ }
+
+ /**
+ * Returns a <code>String</code> object representing this <code>Measurement</code>
+ * object.
+ *
+ * @return a <code>String</code> object representing this <code>Measurement</code>
+ * object.
+ */
+ public String toString() {
+ String result = name;
+ if (result == null) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(value);
+ if (error != 0.0d) {
+ sb.append(" +/- ");
+ sb.append(error);
+ }
+ String u = unit.toString();
+ if (u.length() > 0) {
+ sb.append(" ");
+ sb.append(u);
+ }
+ result = sb.toString();
+ name = result;
+ }
+ return result;
+ }
+
+ /**
+ * Compares this object with the specified object for order. Returns a
+ * negative integer, zero, or a positive integer if this object is less
+ * than, equal to, or greater than the specified object.
+ *
+ * <p>
+ * Note: This class has a natural ordering that is inconsistent with equals.
+ * For this method, another <code>Measurement</code> object is considered
+ * equal if there is some <code>x</code> such that
+ *
+ * <pre>
+ * getValue() - getError() <= x <= getValue() + getError()
+ * </pre>
+ *
+ * for both <code>Measurement</code> objects being compared.
+ *
+ * @param obj The object to be compared.
+ * @return A negative integer, zero, or a positive integer if this object is
+ * less than, equal to, or greater than the specified object.
+ *
+ * @throws ClassCastException If the specified object is not of type
+ * <code>Measurement</code>.
+ * @throws ArithmeticException If the unit of the specified
+ * <code>Measurement</code> object is not equal to the <code>Unit</code>
+ * object of this object.
+ */
+ public int compareTo(Object obj) {
+ if (this == obj) {
+ return 0;
+ }
+ Measurement that = (Measurement) obj;
+ if (!unit.equals(that.unit)) {
+ throw new ArithmeticException("Cannot compare " + this + " and "
+ + that);
+ }
+ int result = Double.compare(value, that.value);
+ if (result == 0) {
+ return 0;
+ }
+ if (result < 0) {
+ if (Double.compare(value + error, that.value - that.error) >= 0) {
+ return 0;
+ }
+ return -1;
+ }
+ if (Double.compare(value - error, that.value + that.error) <= 0) {
+ return 0;
+ }
+ return 1;
+ }
+
+ /**
+ * Returns a hash code value for this object.
+ *
+ * @return A hash code value for this object.
+ */
+ public int hashCode() {
+ int h = hashCode;
+ if (h == 0) {
+ long bits = Double.doubleToLongBits(value);
+ h = 31 * 17 + ((int) (bits ^ (bits >>> 32)));
+ bits = Double.doubleToLongBits(error);
+ h = 31 * h + ((int) (bits ^ (bits >>> 32)));
+ h = 31 * h + unit.hashCode();
+ hashCode = h;
+ }
+ return h;
+ }
+
+ /**
+ * Returns whether the specified object is equal to this object. Two
+ * <code>Measurement</code> objects are equal if they have same value, error
+ * and <code>Unit</code>.
+ *
+ * <p>
+ * Note: This class has a natural ordering that is inconsistent with equals.
+ * See {@link #compareTo}.
+ *
+ * @param obj The object to compare with this object.
+ * @return <code>true</code> if this object is equal to the specified object;
+ * <code>false</code> otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Measurement)) {
+ return false;
+ }
+ Measurement that = (Measurement) obj;
+ return (Double.compare(value, that.value) == 0)
+ && (Double.compare(error, that.error) == 0)
+ && unit.equals(that.unit);
+ }
+}
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/State.java b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/State.java
new file mode 100644
index 0000000..7fcc469
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/State.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) OSGi Alliance (2002, 2008). All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.osgi.util.measurement;
+
+/**
+ * Groups a state name, value and timestamp.
+ *
+ * <p>
+ * The state itself is represented as an integer and the time is measured in
+ * milliseconds since midnight, January 1, 1970 UTC.
+ *
+ * <p>
+ * A <code>State</code> object is immutable so that it may be easily shared.
+ *
+ * @Immutable
+ * @version $Revision: 5715 $
+ */
+public class State {
+ private final int value;
+ private final long time;
+ private final String name;
+
+ /**
+ * Create a new <code>State</code> object.
+ *
+ * @param value The value of the state.
+ * @param name The name of the state.
+ * @param time The time measured in milliseconds since midnight, January 1,
+ * 1970 UTC.
+ */
+ public State(int value, String name, long time) {
+ this.value = value;
+ this.name = name;
+ this.time = time;
+ }
+
+ /**
+ * Create a new <code>State</code> object with a time of 0.
+ *
+ * @param value The value of the state.
+ * @param name The name of the state.
+ */
+ public State(int value, String name) {
+ this(value, name, 0);
+ }
+
+ /**
+ * Returns the value of this <code>State</code>.
+ *
+ * @return The value of this <code>State</code> object.
+ */
+ public final int getValue() {
+ return value;
+ }
+
+ /**
+ * Returns the time with which this <code>State</code> was created.
+ *
+ * @return The time with which this <code>State</code> was created. The time
+ * is measured in milliseconds since midnight, January 1, 1970 UTC.
+ */
+ public final long getTime() {
+ return time;
+ }
+
+ /**
+ * Returns the name of this <code>State</code>.
+ *
+ * @return The name of this <code>State</code> object.
+ */
+ public final String getName() {
+ return name;
+ }
+
+ /**
+ * Returns a <code>String</code> object representing this object.
+ *
+ * @return a <code>String</code> object representing this object.
+ */
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(value);
+ if (name != null) {
+ sb.append(" \"");
+ sb.append(name);
+ sb.append("\"");
+ }
+ return (sb.toString());
+ }
+
+ /**
+ * Returns a hash code value for this object.
+ *
+ * @return A hash code value for this object.
+ */
+ public int hashCode() {
+ int hash = 31 * 17 + value;
+ if (name != null) {
+ hash = 31 * hash + name.hashCode();
+ }
+ return hash;
+ }
+
+ /**
+ * Return whether the specified object is equal to this object. Two
+ * <code>State</code> objects are equal if they have same value and name.
+ *
+ * @param obj The object to compare with this object.
+ * @return <code>true</code> if this object is equal to the specified object;
+ * <code>false</code> otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof State)) {
+ return false;
+ }
+ State that = (State) obj;
+ if (value != that.value) {
+ return false;
+ }
+ if (name == that.name) {
+ return true;
+ }
+ if (name == null) {
+ return false;
+ }
+ return name.equals(that.name);
+ }
+}
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/Unit.java b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/Unit.java
new file mode 100644
index 0000000..5bea0c1
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/Unit.java
@@ -0,0 +1,521 @@
+/*
+ * Copyright (c) OSGi Alliance (2002, 2008). All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.osgi.util.measurement;
+
+import java.util.Hashtable;
+
+/**
+ * A unit system for measurements.
+ *
+ * This class contains definitions of the most common SI units.
+ * <p>
+ *
+ * <p>
+ * This class only support exponents for the base SI units in the range -64 to
+ * +63. Any operation which produces an exponent outside of this range will
+ * result in a <code>Unit</code> object with undefined exponents.
+ *
+ * @Immutable
+ * @version $Revision: 5715 $
+ */
+/*
+ * This local class maintains the information about units. It can calculate new
+ * units when two values are multiplied, divided, added or subtracted. <p> The
+ * unit works with the 7 basic SI types + rad + up to 2^6 custom types. For each
+ * type, the unit keeps a bit mask with the exponents of the basic types. Eg.
+ * m/s is m = 1, s = -1. Multiplying one unit with another means that the bit
+ * masks are added, dividing means that the bit masks are subtracted. <p> This
+ * class can handle any reasonable combination of SI units. However, it will
+ * always try to coerce results back into the basic set. E.g. when you do V*A
+ * you should get W and not m2.kg/s3 . Only when the existing types do not match
+ * does the unit fallback to the expanded form. <p> This class uses offset
+ * arithmetic. This means that the exponents are stored in an long. The special
+ * field is used for units that should not be arithmetically divided or
+ * multiplied, like longitude and lattitude. These special units can however, be
+ * divided and multiplied by the basic 7 constants of the SI, e.g. deg/s.
+ */
+public class Unit {
+ private final static long UNITY = createType(0, 0, 0, 0, 0, 0, 0,
+ 0, 0);
+ private final static long ZERO = 0x40L;
+ private final static long MASK = 0x7fL;
+ private final static int m_SHIFT = 0;
+ private final static int s_SHIFT = 7;
+ private final static int kg_SHIFT = 14;
+ private final static int K_SHIFT = 21;
+ private final static int A_SHIFT = 28;
+ private final static int mol_SHIFT = 35;
+ private final static int cd_SHIFT = 42;
+ private final static int rad_SHIFT = 49;
+ private final static int x_SHIFT = 56;
+ private final static long x_MASK = MASK << x_SHIFT;
+ /** No Unit (Unity) */
+ public final static Unit unity = new Unit("", UNITY); // Unity
+ /* SI Base Units */
+ /** The length unit meter (m) */
+ public final static Unit m = new Unit("m", createType(0, 0, 0,
+ 0, 0, 0, 0, 0, 1)); // Distance
+ // meter
+ /** The time unit second (s) */
+ public final static Unit s = new Unit("s", createType(0, 0, 0,
+ 0, 0, 0, 0, 1, 0)); // Time
+ // Seconds
+ // s
+ /** The mass unit kilogram (kg) */
+ public final static Unit kg = new Unit("kg", createType(0, 0,
+ 0, 0, 0, 0, 1, 0, 0)); // Mass
+ // kilogram
+ // kg
+ /** The temperature unit kelvin (K) */
+ public final static Unit K = new Unit("K", createType(0, 0, 0,
+ 0, 0, 1, 0, 0, 0)); // Temperature
+ // kelvin
+ // K
+ /** The electric current unit ampere (A) */
+ public final static Unit A = new Unit("A", createType(0, 0, 0,
+ 0, 1, 0, 0, 0, 0)); // Current
+ // ampere
+ // A
+ /** The amount of substance unit mole (mol) */
+ public final static Unit mol = new Unit("mol", createType(0, 0,
+ 0, 1, 0, 0, 0, 0, 0)); // Substance
+ // mole
+ // mol
+ /** The luminous intensity unit candela (cd) */
+ public final static Unit cd = new Unit("cd", createType(0, 0,
+ 1, 0, 0, 0, 0, 0, 0)); // Light
+ // candela
+ // cd
+ /* SI Derived Units */
+ /** The speed unit meter per second (m/s) */
+ public final static Unit m_s = new Unit("m/s", createType(0, 0,
+ 0, 0, 0, 0, 0, -1, 1)); // Speed
+ // m/s
+ /** The acceleration unit meter per second squared (m/s <sup>2 </sup>) */
+ public final static Unit m_s2 = new Unit("m/s2", createType(0, 0,
+ 0, 0, 0, 0, 0, -2, 1)); // Acceleration
+ // m/s^2
+ /** The area unit square meter(m <sup>2 </sup>) */
+ public final static Unit m2 = new Unit("m2", createType(0, 0,
+ 0, 0, 0, 0, 0, 0, 2)); // Surface
+ // m^2
+ /** The volume unit cubic meter (m <sup>3 </sup>) */
+ public final static Unit m3 = new Unit("m3", createType(0, 0,
+ 0, 0, 0, 0, 0, 0, 3)); // Volume
+ // m^3
+ /**
+ * The frequency unit hertz (Hz).
+ * <p>
+ * hertz is expressed in SI units as 1/s
+ */
+ public final static Unit Hz = new Unit("Hz", createType(0, 0,
+ 0, 0, 0, 0, 0, -1, 0)); // Frequency
+ // 1/s
+ /**
+ * The force unit newton (N).
+ * <p>
+ * N is expressed in SI units as m·kg/s <sup>2 </sup>
+ */
+ public final static Unit N = new Unit("N", createType(0, 0, 0,
+ 0, 0, 0, 1, -2, 1)); // Force
+ // newton
+ // (m*kg)/s^2
+ /**
+ * The pressure unit pascal (Pa).
+ * <p>
+ * Pa is equal to N/m <sup>2 </sup> or is expressed in SI units as
+ * kg/m·s <sup>2 </sup>
+ */
+ public final static Unit Pa = new Unit("Pa", createType(0, 0,
+ 0, 0, 0, 0, 1, -2, -1)); // Pressure
+ // pascal
+ // kg/(m*s^2)
+ /**
+ * The energy unit joule (J).
+ * <p>
+ * joule is equal to N·m or is expressed in SI units as m <sup>2
+ * </sup>·kg/s <sup>2
+ */
+ public final static Unit J = new Unit("J", createType(0, 0, 0,
+ 0, 0, 0, 1, -2, 2)); // Energy
+ // joule
+ // (m^2*kg)/s^2
+ /**
+ * The power unit watt (W).
+ * <p>
+ * watt is equal to J/s or is expressed in SI units as m <sup>2
+ * </sup>·kg/s <sup>3 </sup>
+ */
+ public final static Unit W = new Unit("W", createType(0, 0, 0,
+ 0, 0, 0, 1, -3, 2)); // Power
+ // watt
+ // (m^2*kg)/s^3
+ /**
+ * The electric charge unit coulomb (C).
+ * <p>
+ * coulomb is expressed in SI units as s·A
+ */
+ public final static Unit C = new Unit("C", createType(0, 0, 0,
+ 0, 1, 0, 0, 1, 0)); // Charge
+ // coulumb
+ // s*A
+ /**
+ * The electric potential difference unit volt (V).
+ * <p>
+ * volt is equal to W/A or is expressed in SI units as m <sup>2
+ * </sup>·kg/s <sup>3 </sup>·A
+ */
+ public final static Unit V = new Unit("V", createType(0, 0, 0,
+ 0, -1, 0, 1, -3, 2)); // El.
+ // Potent.
+ // volt
+ // (m^2*kg)/(s^3*A)
+ /**
+ * The capacitance unit farad (F).
+ * <p>
+ * farad is equal to C/V or is expressed in SI units as s <sup>4
+ * </sup>·A <sup>2 </sup>/m <sup>2 </sup>·kg
+ */
+ public final static Unit F = new Unit("F", createType(0, 0, 0,
+ 0, 2, 0, -1, 4, -2)); // Capacitance
+ // farad
+ // (s^4*A^2)/(m^2*kg)
+ /**
+ * The electric resistance unit ohm.
+ * <p>
+ * ohm is equal to V/A or is expressed in SI units as m <sup>2
+ * </sup>·kg/s <sup>3 </sup>·A <sup>2 </sup>
+ */
+ public final static Unit Ohm = new Unit("Ohm", createType(0, 0,
+ 0, 0, -2, 0, 1, -3, 2)); // Resistance
+ // ohm
+ // (m^2*kg)/(s^3*A^2)
+ /**
+ * The electric conductance unit siemens (S).
+ * <p>
+ * siemens is equal to A/V or is expressed in SI units as s <sup>3
+ * </sup>·A <sup>2 </sup>/m <sup>2 </sup>·kg
+ */
+ public final static Unit S = new Unit("S", createType(0, 0, 0,
+ 0, 2, 0, -1, 3, -2)); // Conductance
+ // siemens
+ // (s^3*A^2)/(m^2*kg)
+ /**
+ * The magnetic flux unit weber (Wb).
+ * <p>
+ * weber is equal to V·s or is expressed in SI units as m <sup>2
+ * </sup>·kg/s <sup>2 </sup>·A
+ */
+ public final static Unit Wb = new Unit("Wb", createType(0, 0,
+ 0, 0, -1, 0, 1, -2, 2)); // Magn.
+ // Flux
+ // weber
+ // (m^2*kg)/(s^2*A)
+ /**
+ * The magnetic flux density unit tesla (T).
+ * <p>
+ * tesla is equal to Wb/m <sup>2 </sup> or is expressed in SI units as kg/s
+ * <sup>2 </sup>·A
+ */
+ public final static Unit T = new Unit("T", createType(0, 0, 0,
+ 0, -1, 0, 1, -2, 0)); // Magn.
+ // Flux
+ // Dens.
+ // tesla
+ // kg/(s^2*A)
+ /**
+ * The illuminance unit lux (lx).
+ * <p>
+ * lux is expressed in SI units as cd/m <sup>2 </sup>
+ */
+ public final static Unit lx = new Unit("lx", createType(0, 0,
+ 1, 0, 0, 0, 0, 0, -2)); // Illuminace
+ // lux
+ // cd/m^2
+ /**
+ * The absorbed dose unit gray (Gy).
+ * <p>
+ * Gy is equal to J/kg or is expressed in SI units as m <sup>2 </sup>/s
+ * <sup>2 </sup>
+ */
+ public final static Unit Gy = new Unit("Gy", createType(0, 0,
+ 0, 0, 0, 0, 0, -2, 2)); // Absorbed
+ // dose
+ // gray
+ // m^2/s^2
+ /**
+ * The catalytic activity unit katal (kat).
+ * <p>
+ * katal is expressed in SI units as mol/s
+ */
+ public final static Unit kat = new Unit("kat", createType(0, 0,
+ 0, 1, 0, 0, 0, -1, 0)); // Catalytic
+ // Act.
+ // katal
+ // mol/s
+ /** The angle unit radians (rad) */
+ public final static Unit rad = new Unit("rad", createType(0, 1,
+ 0, 0, 0, 0, 0, 0, 0)); // Angle
+ // radians
+ // rad
+ /**
+ * An array containing all units defined. The first seven items must be m,
+ * s, kg, K, A, mol, cd, rad in this order!
+ */
+ private final static Unit[] allUnits = new Unit[] {m, s, kg, K, A, mol,
+ cd, rad, m_s, m_s2, m2, m3, Hz, N, Pa, J, W, C, V, F, Ohm, S, Wb,
+ T, lx, Gy, kat, unity };
+
+ /* @GuardedBy("this") */
+ private static Hashtable base;
+ private final String name;
+ private final long type;
+
+ /**
+ * Creates a new <code>Unit</code> instance.
+ *
+ * @param name the name of the <code>Unit</code>
+ * @param type the type of the <code>Unit</code>
+ */
+ private Unit(String name, long type) {
+ if (name == null) {
+ name = computeName(type);
+ }
+ this.name = name;
+ this.type = type;
+ //System.out.println( name + " " + Long.toHexString( type ) );
+ }
+
+ /**
+ * Create a type field from the base SI unit exponent values.
+ *
+ */
+ private static long createType(int x, int rad, int cd, int mol, int A,
+ int K, int kg, int s, int m) {
+ return (((ZERO + m) & MASK) << m_SHIFT)
+ | (((ZERO + s) & MASK) << s_SHIFT)
+ | (((ZERO + kg) & MASK) << kg_SHIFT)
+ | (((ZERO + K) & MASK) << K_SHIFT)
+ | (((ZERO + A) & MASK) << A_SHIFT)
+ | (((ZERO + mol) & MASK) << mol_SHIFT)
+ | (((ZERO + cd) & MASK) << cd_SHIFT)
+ | (((ZERO + rad) & MASK) << rad_SHIFT)
+ | (((long) x) << x_SHIFT);
+ }
+
+ /**
+ * Checks whether this <code>Unit</code> object is equal to the specified
+ * <code>Unit</code> object. The <code>Unit</code> objects are considered equal
+ * if their exponents are equal.
+ *
+ * @param obj the <code>Unit</code> object that should be checked for equality
+ *
+ * @return true if the specified <code>Unit</code> object is equal to this
+ * <code>Unit</code> object.
+ */
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Unit)) {
+ return false;
+ }
+ return ((Unit) obj).type == type;
+ }
+
+ /**
+ * Returns the hash code for this object.
+ *
+ * @return This object's hash code.
+ */
+ public int hashCode() {
+ return 31 * 17 + (int) (type ^ (type >>> 32));
+ }
+
+ /**
+ * Returns a new <code>Unit</code> that is the multiplication of this
+ * <code>Unit</code> and the <code>Unit</code> specified
+ *
+ * @param that the <code>Unit</code> that will be multiplied with this
+ * <code>Unit</code>
+ *
+ * @return a new <code>Unit</code> that is the multiplication of this
+ * <code>Unit</code> and the <code>Unit</code> specified
+ *
+ * @throws RuntimeException if both <code>Unit</code> s are special
+ *
+ * @see Unit#isSpecial
+ */
+ Unit mul(Unit that) {
+ if (this.isSpecial() && that.isSpecial()) {
+ throw new ArithmeticException("Cannot multiply " + this + " with "
+ + that);
+ }
+ return find(this.type - UNITY + that.type);
+ }
+
+ /**
+ * Returns a new <code>Unit</code> that is the division of this <code>Unit</code>
+ * and the <code>Unit</code> specified
+ *
+ * @param that the <code>Unit</code> that this <code>Unit</code> will be divided
+ * with
+ * @return a new <code>Unit</code> that is the division of this <code>Unit</code>
+ * and the <code>Unit</code> specified
+ *
+ * @throws RuntimeException if both <code>Unit</code> s are special
+ *
+ * @see Unit#isSpecial
+ */
+ Unit div(Unit that) {
+ if (this.isSpecial() && that.isSpecial()) {
+ if (this.type == that.type) {
+ return Unit.unity;
+ }
+ throw new ArithmeticException("Cannot divide " + this + " by "
+ + that);
+ }
+ return find(this.type - that.type + UNITY);
+ }
+
+ /**
+ * Returns a new <code>Unit</code> that is the addition of this <code>Unit</code>
+ * and the <code>Unit</code> specified.
+ *
+ * @param that the <code>Unit</code> that should be added to this
+ * <code>Unit</code>
+ *
+ * @return a new <code>Unit</code> that is the addition of this <code>Unit</code>
+ * and the <code>Unit</code> specified.
+ *
+ * @throws RuntimeException if the two <code>Unit</code> s are not the same
+ */
+ Unit add(Unit that) {
+ if (!this.equals(that)) {
+ throw new ArithmeticException("Cannot add " + this + " to " + that);
+ }
+ return this;
+ }
+
+ /**
+ * Returns a new <code>Unit</code> that is the subtraction between this
+ * <code>Unit</code> and the <code>Unit</code> specified.
+ *
+ * @param that the <code>Unit</code> that will be subtracted from this
+ * <code>Unit</code>
+ * @return a new <code>Unit</code> that is the subtraction between this
+ * <code>Unit</code> and the <code>Unit</code> specified.
+ *
+ * @throws RuntimeException if the <code>Unit</code> specified is not the same
+ * as this <code>Unit</code>
+ */
+ Unit sub(Unit that) {
+ if (!this.equals(that)) {
+ throw new ArithmeticException("Cannot subtract " + that + " from "
+ + this);
+ }
+ return this;
+ }
+
+ /**
+ * Finds a <code>Unit</code> based on a type. If the <code>Unit</code> is not
+ * found, it will be created and added to the list of all units under a null
+ * name.
+ *
+ * @param type the type of the <code>Unit</code> to find
+ *
+ * @return the <code>Unit</code>
+ */
+ static synchronized Unit find(long type) {
+ if (base == null) {
+ int size = allUnits.length;
+ base = new Hashtable(size << 1);
+ for (int i = 0; i < size; i++) {
+ base.put(allUnits[i], allUnits[i]);
+ }
+ }
+ Unit unit = new Unit(null, type);
+ Unit out = (Unit) base.get(unit);
+ if (out == null) {
+ base.put(unit, unit);
+ out = unit;
+ }
+ return out;
+ }
+
+ /**
+ * Returns a <code>String</code> object representing the <code>Unit</code>
+ *
+ * @return A <code>String</code> object representing the <code>Unit</code>
+ */
+ public String toString() {
+ return name;
+ }
+
+ private static String computeName(long type) {
+ int m = (int) (((type >> m_SHIFT) & MASK) - ZERO);
+ int s = (int) (((type >> s_SHIFT) & MASK) - ZERO);
+ int kg = (int) (((type >> kg_SHIFT) & MASK) - ZERO);
+ int K = (int) (((type >> K_SHIFT) & MASK) - ZERO);
+ int A = (int) (((type >> A_SHIFT) & MASK) - ZERO);
+ int mol = (int) (((type >> mol_SHIFT) & MASK) - ZERO);
+ int cd = (int) (((type >> cd_SHIFT) & MASK) - ZERO);
+ int rad = (int) (((type >> rad_SHIFT) & MASK) - ZERO);
+ StringBuffer numerator = new StringBuffer();
+ StringBuffer denominator = new StringBuffer();
+ addSIname(m, "m", numerator, denominator);
+ addSIname(s, "s", numerator, denominator);
+ addSIname(kg, "kg", numerator, denominator);
+ addSIname(K, "K", numerator, denominator);
+ addSIname(A, "A", numerator, denominator);
+ addSIname(mol, "mol", numerator, denominator);
+ addSIname(cd, "cd", numerator, denominator);
+ addSIname(rad, "rad", numerator, denominator);
+ if (denominator.length() > 0) {
+ if (numerator.length() == 0) {
+ numerator.append("1");
+ }
+ numerator.append("/");
+ numerator.append(denominator.toString());
+ }
+ return numerator.toString();
+ }
+
+ private static void addSIname(int si, String name, StringBuffer numerator,
+ StringBuffer denominator) {
+ if (si != 0) {
+ StringBuffer sb = (si > 0) ? numerator : denominator;
+ if (sb.length() > 0) {
+ sb.append("*");
+ }
+ sb.append(name);
+ int power = Math.abs(si);
+ if (power > 1) {
+ sb.append("^");
+ sb.append(power);
+ }
+ }
+ }
+
+ /**
+ * Checks whether the unit has a special type, i.e. not a SI unit.
+ *
+ * @return true if the type is special, otherwise false.
+ */
+ private boolean isSpecial() {
+ return (type & x_MASK) != 0;
+ }
+}
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/package.html b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/package.html
new file mode 100644
index 0000000..2eb3a8c
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/package.html
@@ -0,0 +1,10 @@
+<!-- $Revision: 6204 $ -->
+<BODY>
+<p>Measurement Package Version 1.0.
+<p>Bundles wishing to use this package must list the package
+in the Import-Package header of the bundle's manifest.
+For example:
+<pre>
+Import-Package: org.osgi.util.measurement; version="[1.0,2.0)"
+</pre>
+</BODY>
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/packageinfo b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/packageinfo
new file mode 100644
index 0000000..c266447
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/measurement/packageinfo
@@ -0,0 +1 @@
+version 1.0.1
\ No newline at end of file
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/Position.java b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/Position.java
new file mode 100644
index 0000000..5fe3e0f
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/Position.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) OSGi Alliance (2002, 2009). All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.osgi.util.position;
+
+import org.osgi.util.measurement.Measurement;
+import org.osgi.util.measurement.Unit;
+
+/**
+ * Position represents a geographic location, based on the WGS84 System (World
+ * Geodetic System 1984).
+ * <p>
+ * The <code>org.osgi.util.measurement.Measurement</code> class is used to
+ * represent the values that make up a position.
+ * <p>
+ * <p>
+ * A given position object may lack any of it's components, i.e. the altitude
+ * may not be known. Such missing values will be represented by null.
+ * <p>
+ * Position does not override the implementation of either equals() or
+ * hashCode() because it is not clear how missing values should be handled. It
+ * is up to the user of a position to determine how best to compare two position
+ * objects. A <code>Position</code> object is immutable.
+ *
+ * @Immutable
+ * @version $Revision: 6860 $
+ */
+public class Position {
+ private final Measurement altitude;
+ private final Measurement longitude;
+ private final Measurement latitude;
+ private final Measurement speed;
+ private final Measurement track;
+
+ /**
+ * Constructs a <code>Position</code> object with the given values.
+ *
+ * @param lat a <code>Measurement</code> object specifying the latitude in
+ * radians, or null
+ * @param lon a <code>Measurement</code> object specifying the longitude in
+ * radians, or null
+ * @param alt a <code>Measurement</code> object specifying the altitude in
+ * meters, or null
+ * @param speed a <code>Measurement</code> object specifying the speed in
+ * meters per second, or null
+ * @param track a <code>Measurement</code> object specifying the track in
+ * radians, or null
+ */
+ public Position(Measurement lat, Measurement lon, Measurement alt,
+ Measurement speed, Measurement track) {
+ if (lat != null) {
+ if (!Unit.rad.equals(lat.getUnit())) {
+ throw new IllegalArgumentException("Invalid Latitude");
+ }
+ }
+ if (lon != null) {
+ if (!Unit.rad.equals(lon.getUnit())) {
+ throw new IllegalArgumentException("Invalid Longitude");
+ }
+ }
+ if (alt != null) {
+ if (!Unit.m.equals(alt.getUnit())) {
+ throw new IllegalArgumentException("Invalid Altitude");
+ }
+ }
+ if (speed != null) {
+ if (!Unit.m_s.equals(speed.getUnit())) {
+ throw new IllegalArgumentException("Invalid Speed");
+ }
+ }
+ if (track != null) {
+ if (!Unit.rad.equals(track.getUnit())) {
+ throw new IllegalArgumentException("Invalid Track");
+ }
+ }
+
+ /*
+ * Verify the longitude and latitude parameters so they fit the normal
+ * coordinate system. A latitude is between -90 (south) and +90 (north).
+ * A longitude is between -180 (Western hemisphere) and +180 (eastern
+ * hemisphere). This method first normalizes the latitude and longitude
+ * between +/- 180. If the |latitude| > 90, then the longitude is added
+ * 180 and the latitude is normalized to fit +/-90. (Example are with
+ * degrees though radians are used) <br> No normalization takes place
+ * when either lon or lat is null.
+ */
+ normalizeLatLon: {
+ if (lat == null || lon == null) {
+ break normalizeLatLon;
+ }
+ double dlat = lat.getValue();
+ double dlon = lon.getValue();
+ if (dlon >= -LON_RANGE && dlon < LON_RANGE && dlat >= -LAT_RANGE
+ && dlat <= LAT_RANGE) {
+ break normalizeLatLon;
+ }
+ dlon = normalize(dlon, LON_RANGE);
+ dlat = normalize(dlat, LAT_RANGE * 2.0D); // First over 180 degree
+ // Check if we have to move to other side of the earth
+ if (dlat > LAT_RANGE || dlat < -LAT_RANGE) {
+ dlon = normalize(dlon - LON_RANGE, LON_RANGE);
+ dlat = normalize((LAT_RANGE * 2.0D) - dlat, LAT_RANGE);
+ }
+ lon = new Measurement(dlon, lon.getError(), lon.getUnit(), lon
+ .getTime());
+ lat = new Measurement(dlat, lat.getError(), lat.getUnit(), lat
+ .getTime());
+ }
+
+ /*
+ * Normalize track to be a value such that: 0 <= value < +2PI. This
+ * corresponds to 0 deg to +360 deg. 0 is North, 0.5PI is East, PI is
+ * South, 1.5PI is West
+ */
+ normalizeTrack: {
+ if (track == null) {
+ break normalizeTrack;
+ }
+ double dtrack = track.getValue();
+ if ((0.0D <= dtrack) && (dtrack < TRACK_RANGE)) {
+ break normalizeTrack; /* value is already normalized */
+ }
+ dtrack %= TRACK_RANGE;
+ if (dtrack < 0.0D) {
+ dtrack += TRACK_RANGE;
+ }
+ track = new Measurement(dtrack, track.getError(), track.getUnit(),
+ track.getTime());
+ }
+
+ this.latitude = lat;
+ this.longitude = lon;
+ this.altitude = alt;
+ this.speed = speed;
+ this.track = track;
+ }
+
+ /**
+ * Returns the altitude of this position in meters.
+ *
+ * @return a <code>Measurement</code> object in <code>Unit.m</code> representing
+ * the altitude in meters above the ellipsoid <code>null</code> if the
+ * altitude is not known.
+ */
+ public Measurement getAltitude() {
+ return altitude;
+ }
+
+ /**
+ * Returns the longitude of this position in radians.
+ *
+ * @return a <code>Measurement</code> object in <code>Unit.rad</code>
+ * representing the longitude, or <code>null</code> if the longitude
+ * is not known.
+ */
+ public Measurement getLongitude() {
+ return longitude;
+ }
+
+ /**
+ * Returns the latitude of this position in radians.
+ *
+ * @return a <code>Measurement</code> object in <code>Unit.rad</code>
+ * representing the latitude, or <code>null</code> if the latitude is
+ * not known..
+ */
+ public Measurement getLatitude() {
+ return latitude;
+ }
+
+ /**
+ * Returns the ground speed of this position in meters per second.
+ *
+ * @return a <code>Measurement</code> object in <code>Unit.m_s</code>
+ * representing the speed, or <code>null</code> if the speed is not
+ * known..
+ */
+ public Measurement getSpeed() {
+ return speed;
+ }
+
+ /**
+ * Returns the track of this position in radians as a compass heading. The
+ * track is the extrapolation of previous previously measured positions to a
+ * future position.
+ *
+ * @return a <code>Measurement</code> object in <code>Unit.rad</code>
+ * representing the track, or <code>null</code> if the track is not
+ * known..
+ */
+ public Measurement getTrack() {
+ return track;
+ }
+
+ private static final double LON_RANGE = Math.PI;
+ private static final double LAT_RANGE = Math.PI / 2.0D;
+
+ /**
+ * This function normalizes the a value according to a range. This is not
+ * simple modulo (as I thought when I started), but requires some special
+ * handling. For positive numbers we subtract 2*range from the number so
+ * that end up between -/+ range. For negative numbers we add this value.
+ * For example, if the value is 270 and the range is +/- 180. Then sign=1 so
+ * the (int) factor becomes 270+180/360 = 1. This means that 270-360=-90 is
+ * the result. (degrees are only used to make it easier to understand, this
+ * function is agnostic for radians/degrees). The result will be in
+ * [range,range> The algorithm is not very fast, but it handling the
+ * [> ranges made it very messy using integer arithmetic, and this is
+ * very readable. Note that it is highly unlikely that this method is called
+ * in normal situations. Normally input values to position are already
+ * normalized because they come from a GPS. And this is much more readable.
+ *
+ * @param value The value that needs adjusting
+ * @param range -range = < value < range
+ */
+ private static double normalize(double value, double range) {
+ double twiceRange = 2.0D * range;
+ while (value >= range) {
+ value -= twiceRange;
+ }
+ while (value < -range) {
+ value += twiceRange;
+ }
+ return value;
+ }
+
+ private static final double TRACK_RANGE = Math.PI * 2.0D;
+}
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/package.html b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/package.html
new file mode 100644
index 0000000..d0d745f
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/package.html
@@ -0,0 +1,10 @@
+<!-- $Revision: 6204 $ -->
+<BODY>
+<p>Position Package Version 1.0.
+<p>Bundles wishing to use this package must list the package
+in the Import-Package header of the bundle's manifest.
+For example:
+<pre>
+Import-Package: org.osgi.util.position; version="[1.0,2.0)"
+</pre>
+</BODY>
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/packageinfo b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/packageinfo
new file mode 100644
index 0000000..c266447
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/position/packageinfo
@@ -0,0 +1 @@
+version 1.0.1
\ No newline at end of file
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/XMLParserActivator.java b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/XMLParserActivator.java
new file mode 100644
index 0000000..963c092
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/XMLParserActivator.java
@@ -0,0 +1,513 @@
+/*
+ * Copyright (c) OSGi Alliance (2002, 2008). All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.osgi.util.xml;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * A BundleActivator class that allows any JAXP compliant XML Parser to register
+ * itself as an OSGi parser service.
+ *
+ * Multiple JAXP compliant parsers can concurrently register by using this
+ * BundleActivator class. Bundles who wish to use an XML parser can then use the
+ * framework's service registry to locate available XML Parsers with the desired
+ * characteristics such as validating and namespace-aware.
+ *
+ * <p>
+ * The services that this bundle activator enables a bundle to provide are:
+ * <ul>
+ * <li><code>javax.xml.parsers.SAXParserFactory</code>({@link #SAXFACTORYNAME})
+ * <li><code>javax.xml.parsers.DocumentBuilderFactory</code>(
+ * {@link #DOMFACTORYNAME})
+ * </ul>
+ *
+ * <p>
+ * The algorithm to find the implementations of the abstract parsers is derived
+ * from the JAR file specifications, specifically the Services API.
+ * <p>
+ * An XMLParserActivator assumes that it can find the class file names of the
+ * factory classes in the following files:
+ * <ul>
+ * <li><code>/META-INF/services/javax.xml.parsers.SAXParserFactory</code> is a
+ * file contained in a jar available to the runtime which contains the
+ * implementation class name(s) of the SAXParserFactory.
+ * <li><code>/META-INF/services/javax.xml.parsers.DocumentBuilderFactory</code>
+ * is a file contained in a jar available to the runtime which contains the
+ * implementation class name(s) of the <code>DocumentBuilderFactory</code>
+ * </ul>
+ * <p>
+ * If either of the files does not exist, <code>XMLParserActivator</code>
+ * assumes that the parser does not support that parser type.
+ *
+ * <p>
+ * <code>XMLParserActivator</code> attempts to instantiate both the
+ * <code>SAXParserFactory</code> and the <code>DocumentBuilderFactory</code>. It
+ * registers each factory with the framework along with service properties:
+ * <ul>
+ * <li>{@link #PARSER_VALIDATING}- indicates if this factory supports validating
+ * parsers. It's value is a <code>Boolean</code>.
+ * <li>{@link #PARSER_NAMESPACEAWARE}- indicates if this factory supports
+ * namespace aware parsers It's value is a <code>Boolean</code>.
+ * </ul>
+ * <p>
+ * Individual parser implementations may have additional features, properties,
+ * or attributes which could be used to select a parser with a filter. These can
+ * be added by extending this class and overriding the
+ * <code>setSAXProperties</code> and <code>setDOMProperties</code> methods.
+ *
+ * @ThreadSafe
+ * @version $Revision: 5900 $
+ */
+public class XMLParserActivator implements BundleActivator, ServiceFactory {
+ /** Context of this bundle */
+ private volatile BundleContext context;
+ /**
+ * Filename containing the SAX Parser Factory Class name. Also used as the
+ * basis for the <code>SERVICE_PID<code> registration property.
+ */
+ public static final String SAXFACTORYNAME = "javax.xml.parsers.SAXParserFactory";
+ /**
+ * Filename containing the DOM Parser Factory Class name. Also used as the
+ * basis for the <code>SERVICE_PID</code> registration property.
+ */
+ public static final String DOMFACTORYNAME = "javax.xml.parsers.DocumentBuilderFactory";
+ /** Path to the factory class name files */
+ private static final String PARSERCLASSFILEPATH = "/META-INF/services/";
+ /** Fully qualified path name of SAX Parser Factory Class Name file */
+ public static final String SAXCLASSFILE = PARSERCLASSFILEPATH
+ + SAXFACTORYNAME;
+ /** Fully qualified path name of DOM Parser Factory Class Name file */
+ public static final String DOMCLASSFILE = PARSERCLASSFILEPATH
+ + DOMFACTORYNAME;
+ /** SAX Factory Service Description */
+ private static final String SAXFACTORYDESCRIPTION = "A JAXP Compliant SAX Parser";
+ /** DOM Factory Service Description */
+ private static final String DOMFACTORYDESCRIPTION = "A JAXP Compliant DOM Parser";
+ /**
+ * Service property specifying if factory is configured to support
+ * validating parsers. The value is of type <code>Boolean</code>.
+ */
+ public static final String PARSER_VALIDATING = "parser.validating";
+ /**
+ * Service property specifying if factory is configured to support namespace
+ * aware parsers. The value is of type <code>Boolean</code>.
+ */
+ public static final String PARSER_NAMESPACEAWARE = "parser.namespaceAware";
+ /**
+ * Key for parser factory name property - this must be saved in the parsers
+ * properties hashtable so that the parser factory can be instantiated from
+ * a ServiceReference
+ */
+ private static final String FACTORYNAMEKEY = "parser.factoryname";
+
+ /**
+ * Called when this bundle is started so the Framework can perform the
+ * bundle-specific activities necessary to start this bundle. This method
+ * can be used to register services or to allocate any resources that this
+ * bundle needs.
+ *
+ * <p>
+ * This method must complete and return to its caller in a timely manner.
+ *
+ * <p>
+ * This method attempts to register a SAX and DOM parser with the
+ * Framework's service registry.
+ *
+ * @param context The execution context of the bundle being started.
+ * @throws java.lang.Exception If this method throws an exception, this
+ * bundle is marked as stopped and the Framework will remove this
+ * bundle's listeners, unregister all services registered by this
+ * bundle, and release all services used by this bundle.
+ */
+ public void start(BundleContext context) throws Exception {
+ this.context = context;
+ Bundle parserBundle = context.getBundle();
+ // check for sax parsers
+ registerSAXParsers(getParserFactoryClassNames(parserBundle
+ .getResource(SAXCLASSFILE)));
+ // check for dom parsers
+ registerDOMParsers(getParserFactoryClassNames(parserBundle
+ .getResource(DOMCLASSFILE)));
+ }
+
+ /**
+ * This method has nothing to do as all active service registrations will
+ * automatically get unregistered when the bundle stops.
+ *
+ * @param context The execution context of the bundle being stopped.
+ * @throws java.lang.Exception If this method throws an exception, the
+ * bundle is still marked as stopped, and the Framework will remove
+ * the bundle's listeners, unregister all services registered by the
+ * bundle, and release all services used by the bundle.
+ */
+ public void stop(BundleContext context) throws Exception {
+ // framework will automatically unregister the parser services
+ }
+
+ /**
+ * Given the URL for a file, reads and returns the parser class names. There
+ * may be multiple classes specified in this file, one per line. There may
+ * also be comment lines in the file, which begin with "#".
+ *
+ * @param parserUrl The URL of the service file containing the parser class
+ * names
+ * @return A List of strings containing the parser class names.
+ * @throws IOException if there is a problem reading the URL input stream
+ */
+ private List getParserFactoryClassNames(URL parserUrl) throws IOException {
+ if (parserUrl == null) {
+ return Collections.EMPTY_LIST;
+ }
+ List v = new ArrayList(1);
+ String parserFactoryClassName = null;
+ InputStream is = parserUrl.openStream();
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ while (true) {
+ parserFactoryClassName = br.readLine();
+ if (parserFactoryClassName == null) {
+ break; // end of file reached
+ }
+ String pfcName = parserFactoryClassName.trim();
+ if (pfcName.length() == 0) {
+ continue; // blank line
+ }
+ int commentIdx = pfcName.indexOf("#");
+ if (commentIdx == 0) { // comment line
+ continue;
+ }
+ else
+ if (commentIdx < 0) { // no comment on this line
+ v.add(pfcName);
+ }
+ else {
+ v.add(pfcName.substring(0, commentIdx).trim());
+ }
+ }
+ return v;
+ }
+
+ /**
+ * Register SAX Parser Factory Services with the framework.
+ *
+ * @param parserFactoryClassNames - a <code>List</code> of
+ * <code>String</code> objects containing the names of the parser
+ * Factory Classes
+ * @throws FactoryConfigurationError if thrown from <code>getFactory</code>
+ */
+ private void registerSAXParsers(List parserFactoryClassNames)
+ throws FactoryConfigurationError {
+ Iterator e = parserFactoryClassNames.iterator();
+ int index = 0;
+ while (e.hasNext()) {
+ String parserFactoryClassName = (String) e.next();
+ // create a sax parser factory just to get it's default
+ // properties. It will never be used since
+ // this class will operate as a service factory and give each
+ // service requestor it's own SaxParserFactory
+ SAXParserFactory factory = (SAXParserFactory) getFactory(parserFactoryClassName);
+ Hashtable properties = new Hashtable(7);
+ // figure out the default properties of the parser
+ setDefaultSAXProperties(factory, properties, index);
+ // store the parser factory class name in the properties so that
+ // it can be retrieved when getService is called
+ // to return a parser factory
+ properties.put(FACTORYNAMEKEY, parserFactoryClassName);
+ // register the factory as a service
+ context.registerService(SAXFACTORYNAME, this, properties);
+ index++;
+ }
+ }
+
+ /**
+ * <p>
+ * Set the SAX Parser Service Properties. By default, the following
+ * properties are set:
+ * <ul>
+ * <li><code>SERVICE_DESCRIPTION</code>
+ * <li><code>SERVICE_PID</code>
+ * <li><code>PARSER_VALIDATING</code>- instantiates a parser and queries
+ * it to find out whether it is validating or not
+ * <li><code>PARSER_NAMESPACEAWARE</code>- instantiates a parser and
+ * queries it to find out whether it is namespace aware or not
+ * <ul>
+ *
+ * @param factory The <code>SAXParserFactory</code> object
+ * @param props <code>Hashtable</code> of service properties.
+ */
+ private void setDefaultSAXProperties(SAXParserFactory factory,
+ Hashtable props, int index) {
+ props.put(Constants.SERVICE_DESCRIPTION, SAXFACTORYDESCRIPTION);
+ props.put(Constants.SERVICE_PID, SAXFACTORYNAME + "."
+ + context.getBundle().getBundleId() + "." + index);
+ setSAXProperties(factory, props);
+ }
+
+ /**
+ * <p>
+ * Set the customizable SAX Parser Service Properties.
+ *
+ * <p>
+ * This method attempts to instantiate a validating parser and a namespace
+ * aware parser to determine if the parser can support those features. The
+ * appropriate properties are then set in the specified properties object.
+ *
+ * <p>
+ * This method can be overridden to add additional SAX2 features and
+ * properties. If you want to be able to filter searches of the OSGi service
+ * registry, this method must put a key, value pair into the properties
+ * object for each feature or property. For example,
+ *
+ * properties.put("http://www.acme.com/features/foo", Boolean.TRUE);
+ *
+ * @param factory - the SAXParserFactory object
+ * @param properties - the properties object for the service
+ */
+ public void setSAXProperties(SAXParserFactory factory, Hashtable properties) {
+ // check if this parser can be configured to validate
+ boolean validating = true;
+ factory.setValidating(true);
+ factory.setNamespaceAware(false);
+ try {
+ factory.newSAXParser();
+ }
+ catch (Exception pce_val) {
+ validating = false;
+ }
+ // check if this parser can be configured to be namespaceaware
+ boolean namespaceaware = true;
+ factory.setValidating(false);
+ factory.setNamespaceAware(true);
+ try {
+ factory.newSAXParser();
+ }
+ catch (Exception pce_nsa) {
+ namespaceaware = false;
+ }
+ // set the factory values
+ factory.setValidating(validating);
+ factory.setNamespaceAware(namespaceaware);
+ // set the OSGi service properties
+ properties.put(PARSER_NAMESPACEAWARE, new Boolean(namespaceaware));
+ properties.put(PARSER_VALIDATING, new Boolean(validating));
+ }
+
+ /**
+ * Register DOM Parser Factory Services with the framework.
+ *
+ * @param parserFactoryClassNames - a <code>List</code> of
+ * <code>String</code> objects containing the names of the parser
+ * Factory Classes
+ * @throws FactoryConfigurationError if thrown from <code>getFactory</code>
+ */
+ private void registerDOMParsers(List parserFactoryClassNames)
+ throws FactoryConfigurationError {
+ Iterator e = parserFactoryClassNames.iterator();
+ int index = 0;
+ while (e.hasNext()) {
+ String parserFactoryClassName = (String) e.next();
+ // create a dom parser factory just to get it's default
+ // properties. It will never be used since
+ // this class will operate as a service factory and give each
+ // service requestor it's own DocumentBuilderFactory
+ DocumentBuilderFactory factory = (DocumentBuilderFactory) getFactory(parserFactoryClassName);
+ Hashtable properties = new Hashtable(7);
+ // figure out the default properties of the parser
+ setDefaultDOMProperties(factory, properties, index);
+ // store the parser factory class name in the properties so that
+ // it can be retrieved when getService is called
+ // to return a parser factory
+ properties.put(FACTORYNAMEKEY, parserFactoryClassName);
+ // register the factory as a service
+ context.registerService(DOMFACTORYNAME, this, properties);
+ index++;
+ }
+ }
+
+ /**
+ * Set the DOM parser service properties.
+ *
+ * By default, the following properties are set:
+ * <ul>
+ * <li><code>SERVICE_DESCRIPTION</code>
+ * <li><code>SERVICE_PID</code>
+ * <li><code>PARSER_VALIDATING</code>
+ * <li><code>PARSER_NAMESPACEAWARE</code>
+ * <ul>
+ *
+ * @param factory The <code>DocumentBuilderFactory</code> object
+ * @param props <code>Hashtable</code> of service properties.
+ */
+ private void setDefaultDOMProperties(DocumentBuilderFactory factory,
+ Hashtable props, int index) {
+ props.put(Constants.SERVICE_DESCRIPTION, DOMFACTORYDESCRIPTION);
+ props.put(Constants.SERVICE_PID, DOMFACTORYNAME + "."
+ + context.getBundle().getBundleId() + "." + index);
+ setDOMProperties(factory, props);
+ }
+
+ /**
+ * <p>
+ * Set the customizable DOM Parser Service Properties.
+ *
+ * <p>
+ * This method attempts to instantiate a validating parser and a namespace
+ * aware parser to determine if the parser can support those features. The
+ * appropriate properties are then set in the specified props object.
+ *
+ * <p>
+ * This method can be overridden to add additional DOM2 features and
+ * properties. If you want to be able to filter searches of the OSGi service
+ * registry, this method must put a key, value pair into the properties
+ * object for each feature or property. For example,
+ *
+ * properties.put("http://www.acme.com/features/foo", Boolean.TRUE);
+ *
+ * @param factory - the DocumentBuilderFactory object
+ * @param props - Hashtable of service properties.
+ */
+ public void setDOMProperties(DocumentBuilderFactory factory, Hashtable props) {
+ // check if this parser can be configured to validate
+ boolean validating = true;
+ factory.setValidating(true);
+ factory.setNamespaceAware(false);
+ try {
+ factory.newDocumentBuilder();
+ }
+ catch (Exception pce_val) {
+ validating = false;
+ }
+ // check if this parser can be configured to be namespaceaware
+ boolean namespaceaware = true;
+ factory.setValidating(false);
+ factory.setNamespaceAware(true);
+ try {
+ factory.newDocumentBuilder();
+ }
+ catch (Exception pce_nsa) {
+ namespaceaware = false;
+ }
+ // set the factory values
+ factory.setValidating(validating);
+ factory.setNamespaceAware(namespaceaware);
+ // set the OSGi service properties
+ props.put(PARSER_VALIDATING, new Boolean(validating));
+ props.put(PARSER_NAMESPACEAWARE, new Boolean(namespaceaware));
+ }
+
+ /**
+ * Given a parser factory class name, instantiate that class.
+ *
+ * @param parserFactoryClassName A <code>String</code> object containing
+ * the name of the parser factory class
+ * @return a parserFactoryClass Object
+ * @pre parserFactoryClassName!=null
+ */
+ private Object getFactory(String parserFactoryClassName)
+ throws FactoryConfigurationError {
+ try {
+ return context.getBundle().loadClass(parserFactoryClassName)
+ .newInstance();
+ }
+ catch (RuntimeException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ throw new FactoryConfigurationError(e);
+ }
+ }
+
+ /**
+ * Creates a new XML Parser Factory object.
+ *
+ * <p>
+ * A unique XML Parser Factory object is returned for each call to this
+ * method.
+ *
+ * <p>
+ * The returned XML Parser Factory object will be configured for validating
+ * and namespace aware support as specified in the service properties of the
+ * specified ServiceRegistration object.
+ *
+ * This method can be overridden to configure additional features in the
+ * returned XML Parser Factory object.
+ *
+ * @param bundle The bundle using the service.
+ * @param registration The <code>ServiceRegistration</code> object for the
+ * service.
+ * @return A new, configured XML Parser Factory object or null if a
+ * configuration error was encountered
+ */
+ public Object getService(Bundle bundle, ServiceRegistration registration) {
+ ServiceReference sref = registration.getReference();
+ String parserFactoryClassName = (String) sref
+ .getProperty(FACTORYNAMEKEY);
+ // need to set factory properties
+ Object factory = getFactory(parserFactoryClassName);
+ if (factory instanceof SAXParserFactory) {
+ ((SAXParserFactory) factory).setValidating(((Boolean) sref
+ .getProperty(PARSER_VALIDATING)).booleanValue());
+ ((SAXParserFactory) factory).setNamespaceAware(((Boolean) sref
+ .getProperty(PARSER_NAMESPACEAWARE)).booleanValue());
+ }
+ else {
+ if (factory instanceof DocumentBuilderFactory) {
+ ((DocumentBuilderFactory) factory)
+ .setValidating(((Boolean) sref
+ .getProperty(PARSER_VALIDATING)).booleanValue());
+ ((DocumentBuilderFactory) factory)
+ .setNamespaceAware(((Boolean) sref
+ .getProperty(PARSER_NAMESPACEAWARE))
+ .booleanValue());
+ }
+ }
+ return factory;
+ }
+
+ /**
+ * Releases a XML Parser Factory object.
+ *
+ * @param bundle The bundle releasing the service.
+ * @param registration The <code>ServiceRegistration</code> object for the
+ * service.
+ * @param service The XML Parser Factory object returned by a previous call
+ * to the <code>getService</code> method.
+ */
+ public void ungetService(Bundle bundle, ServiceRegistration registration,
+ Object service) {
+ }
+}
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/package.html b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/package.html
new file mode 100644
index 0000000..e153322
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/package.html
@@ -0,0 +1,10 @@
+<!-- $Revision: 6204 $ -->
+<BODY>
+<p>XML Parser Package Version 1.0.
+<p>Bundles wishing to use this package must list the package
+in the Import-Package header of the bundle's manifest.
+For example:
+<pre>
+Import-Package: org.osgi.util.xml; version="[1.0,2.0)"
+</pre>
+</BODY>
diff --git a/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/packageinfo b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/packageinfo
new file mode 100644
index 0000000..c266447
--- /dev/null
+++ b/eclipse/plugins/org.eclipse.osgi.util/src/org/osgi/util/xml/packageinfo
@@ -0,0 +1 @@
+version 1.0.1
\ No newline at end of file
diff --git a/patches/osgi-util.patch b/patches/osgi-util.patch
new file mode 100644
index 0000000..c75d6be
--- /dev/null
+++ b/patches/osgi-util.patch
@@ -0,0 +1,20 @@
+diff --git a/eclipse/plugins/org.eclipse.osgi.util/build.properties b/eclipse/plugins/org.eclipse.osgi.util/build.properties
+index 2a015f5..270afcd 100644
+--- a/plugins/org.eclipse.osgi.util/build.properties
++++ b/plugins/org.eclipse.osgi.util/build.properties
+@@ -12,10 +12,10 @@ bin.includes = plugin.properties,\
+ org/,\
+ about.html,\
+ META-INF/,\
++ about_files/,\
++ .
++src.includes = about.html,\
+ about_files/
+-src.includes = src.zip,\
+- about.html,\
+- about_files/
+-source.. = .
++source.. = src/
+ output.. = .
+-customBuildCallbacks=customBuildCallbacks.xml
++#customBuildCallbacks=customBuildCallbacks.xml
hooks/post-receive
--
eclipse - Powerful IDE written in java - Debian package.
More information about the pkg-java-commits
mailing list