From 79612aa4ff740d8e7951661719bf759911f961b2 Mon Sep 17 00:00:00 2001 From: Werner Keil Date: Thu, 25 Aug 2016 23:06:34 +0200 Subject: [PATCH] UNITSOFMEASUREMENT-94: Explain that formulas with units may be different than formulas with numerical values Task-Url: https://java.net/jira/browse/UNITSOFMEASUREMENT-94 --- src/doc/JSR-275.uml | 1463 +++++++++++++++++ src/doc/quantity.jpg | Bin 0 -> 20508 bytes src/doc/unit.jpg | Bin 0 -> 80776 bytes .../measure/quantity/ElectricCapacitance.java | 18 + .../measure/quantity/ElectricCharge.java | 18 + .../measure/quantity/ElectricConductance.java | 18 + .../measure/quantity/ElectricCurrent.java | 19 + .../measure/quantity/ElectricInductance.java | 18 + .../measure/quantity/ElectricPotential.java | 18 + .../measure/quantity/ElectricResistance.java | 18 + .../javax/measure/quantity/LuminousFlux.java | 18 + .../measure/quantity/LuminousIntensity.java | 19 + .../javax/measure/quantity/MagneticFlux.java | 18 + .../measure/quantity/MagneticFluxDensity.java | 18 + .../java/javax/measure/quantity/Quantity.java | 91 + .../measure/quantity/QuantityFactory.java | 237 +++ .../quantity/RadiationDoseAbsorbed.java | 18 + .../quantity/RadiationDoseEffective.java | 19 + .../measure/quantity/RadioactiveActivity.java | 18 + .../measure/unit/ConversionException.java | 31 + .../java/javax/measure/unit/Dimension.java | 292 ++++ .../javax/measure/unit/SystemOfUnits.java | 56 + .../javax/measure/unit/USCustomarySystem.java | 336 ++++ src/main/java/javax/measure/unit/Unit.java | 530 ++++++ .../javax/measure/unit/UnitConverter.java | 288 ++++ .../measure/unit/converter/AddConverter.java | 115 ++ .../measure/unit/converter/ExpConverter.java | 99 ++ .../measure/unit/converter/LogConverter.java | 100 ++ .../unit/converter/MultiplyConverter.java | 108 ++ .../unit/converter/RationalConverter.java | 142 ++ .../measure/unit/format/AnnotatedUnit.java | 139 ++ .../measure/unit/format/LocalFormat.java | 589 +++++++ .../measure/unit/format/ParseException.java | 197 +++ .../measure/unit/format/ParsePrefix.java | 61 + .../measure/unit/format/SimpleCharStream.java | 477 ++++++ .../measure/unit/format/SymbolMapImpl.java | 184 +++ .../java/javax/measure/unit/format/Token.java | 137 ++ .../measure/unit/format/TokenMgrError.java | 154 ++ .../javax/measure/unit/format/UnitParser.java | 781 +++++++++ .../unit/format/UnitParserConstants.java | 88 + .../unit/format/UnitParserTokenManager.java | 478 ++++++ src/main/java/src.zip | Bin 0 -> 89903 bytes .../javax/measure/unit/format/UnitParser.jj | 337 ++++ .../measure/unit/format/messages.properties | 85 + .../unit/format/messages_de.properties | 118 ++ .../unit/format/messages_en_GB.properties | 97 ++ .../unit/format/messages_en_US.properties | 12 + .../unit/format/messages_fr.properties | 11 + .../unit/format/messages_fr_CA.properties | 14 + .../unit/format/messages_ja.properties | 83 + .../unit/format/messages_pt.properties | 13 + .../unit/format/messages_ru.properties | 68 + src/test/java/javax/measure/Benchmark.java | 73 + .../javax/measure/quantity/QuantityTest.java | 72 + src/test/java/javax/measure/unit/Planet.java | 58 + 55 files changed, 8469 insertions(+) create mode 100644 src/doc/JSR-275.uml create mode 100644 src/doc/quantity.jpg create mode 100644 src/doc/unit.jpg create mode 100644 src/main/java/javax/measure/quantity/ElectricCapacitance.java create mode 100644 src/main/java/javax/measure/quantity/ElectricCharge.java create mode 100644 src/main/java/javax/measure/quantity/ElectricConductance.java create mode 100644 src/main/java/javax/measure/quantity/ElectricCurrent.java create mode 100644 src/main/java/javax/measure/quantity/ElectricInductance.java create mode 100644 src/main/java/javax/measure/quantity/ElectricPotential.java create mode 100644 src/main/java/javax/measure/quantity/ElectricResistance.java create mode 100644 src/main/java/javax/measure/quantity/LuminousFlux.java create mode 100644 src/main/java/javax/measure/quantity/LuminousIntensity.java create mode 100644 src/main/java/javax/measure/quantity/MagneticFlux.java create mode 100644 src/main/java/javax/measure/quantity/MagneticFluxDensity.java create mode 100644 src/main/java/javax/measure/quantity/Quantity.java create mode 100644 src/main/java/javax/measure/quantity/QuantityFactory.java create mode 100644 src/main/java/javax/measure/quantity/RadiationDoseAbsorbed.java create mode 100644 src/main/java/javax/measure/quantity/RadiationDoseEffective.java create mode 100644 src/main/java/javax/measure/quantity/RadioactiveActivity.java create mode 100644 src/main/java/javax/measure/unit/ConversionException.java create mode 100644 src/main/java/javax/measure/unit/Dimension.java create mode 100644 src/main/java/javax/measure/unit/SystemOfUnits.java create mode 100644 src/main/java/javax/measure/unit/USCustomarySystem.java create mode 100644 src/main/java/javax/measure/unit/Unit.java create mode 100644 src/main/java/javax/measure/unit/UnitConverter.java create mode 100644 src/main/java/javax/measure/unit/converter/AddConverter.java create mode 100644 src/main/java/javax/measure/unit/converter/ExpConverter.java create mode 100644 src/main/java/javax/measure/unit/converter/LogConverter.java create mode 100644 src/main/java/javax/measure/unit/converter/MultiplyConverter.java create mode 100644 src/main/java/javax/measure/unit/converter/RationalConverter.java create mode 100644 src/main/java/javax/measure/unit/format/AnnotatedUnit.java create mode 100644 src/main/java/javax/measure/unit/format/LocalFormat.java create mode 100644 src/main/java/javax/measure/unit/format/ParseException.java create mode 100644 src/main/java/javax/measure/unit/format/ParsePrefix.java create mode 100644 src/main/java/javax/measure/unit/format/SimpleCharStream.java create mode 100644 src/main/java/javax/measure/unit/format/SymbolMapImpl.java create mode 100644 src/main/java/javax/measure/unit/format/Token.java create mode 100644 src/main/java/javax/measure/unit/format/TokenMgrError.java create mode 100644 src/main/java/javax/measure/unit/format/UnitParser.java create mode 100644 src/main/java/javax/measure/unit/format/UnitParserConstants.java create mode 100644 src/main/java/javax/measure/unit/format/UnitParserTokenManager.java create mode 100644 src/main/java/src.zip create mode 100644 src/main/javacc/javax/measure/unit/format/UnitParser.jj create mode 100644 src/main/resources/javax/measure/unit/format/messages.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_de.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_en_GB.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_en_US.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_fr.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_fr_CA.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_ja.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_pt.properties create mode 100644 src/main/resources/javax/measure/unit/format/messages_ru.properties create mode 100644 src/test/java/javax/measure/Benchmark.java create mode 100644 src/test/java/javax/measure/quantity/QuantityTest.java create mode 100644 src/test/java/javax/measure/unit/Planet.java diff --git a/src/doc/JSR-275.uml b/src/doc/JSR-275.uml new file mode 100644 index 0000000..afdf856 --- /dev/null +++ b/src/doc/JSR-275.uml @@ -0,0 +1,1463 @@ + + + + + + +UMLStandard + + + + +Untitled +5 + +Use Case Model +UMLStandard +useCaseModel +VcAKAm5HLkua0s+gDWv7jwAA +1 + +Main +42MWb3qbPUCE24ty9WEjigAA + +8SsA7P7M+kyY0ty+/t1LmQAA + + + + +Analysis Model +UMLStandard +analysisModel +VcAKAm5HLkua0s+gDWv7jwAA +1 + +Main +True +RobustnessDiagram +b1lpK9K0UEatJHWJLEM+ZgAA + +cBkKshXOyEaIi+360S68WAAA + + + + +Design Model +UMLStandard +designModel +VcAKAm5HLkua0s+gDWv7jwAA +1 + +Main +True +WR7RVMRaZk++bLdyR0MWMQAA + +pc4NorAoZ02H4Z2vZKD1eQAA +4 + +clMaroon +$00B9FFFF +20 +8 +120 +70 +EYisqWLRuEin21GF7Se8XAAA + + +quantity + + +False + + +False + + + + +clMaroon +$00B9FFFF +20 +88 +120 +70 +mtWYKGwud0O8JgiZ275cwgAA + + +unit + + +False + + +False + + + + +clMaroon +$00B9FFFF +212 +16 +59 +45 +sdkIcon +XaPoBenZZEu29iS1fAxisQAA + + +1 +Quantity + + +False + + +False + + + +False +XaPoBenZZEu29iS1fAxisQAA + + +False +XaPoBenZZEu29iS1fAxisQAA + + + +clMaroon +$00B9FFFF +208 +92 +317 +303 +Sh59W1JzjEKyBSV/ecykRAAA + + +1 +Unit + + +False + + +False + + + +Sh59W1JzjEKyBSV/ecykRAAA + + +Sh59W1JzjEKyBSV/ecykRAAA + + +False +Sh59W1JzjEKyBSV/ecykRAAA + + + + +1 + +javax +WR7RVMRaZk++bLdyR0MWMQAA +1 + +measure +/9Fn4Qmh7k6nJQv1LQiS0AAA +2 + +quantity +uSOo6kEo0UuBcq54UmvLXQAA +1 +GzCzyEPljE6YzDaqxqYwNQAA +1 + +quantity +EYisqWLRuEin21GF7Se8XAAA + +5LUtTEJwT0O+Fynr5Yx2RQAA +1 + +clMaroon +$00B9FFFF +12 +56 +44 +286 +154 +sdkIcon +XaPoBenZZEu29iS1fAxisQAA + + +1 +Quantity + + +False + + +False + + + +False +XaPoBenZZEu29iS1fAxisQAA + + +XaPoBenZZEu29iS1fAxisQAA + + + + +1 + +Quantity +EYisqWLRuEin21GF7Se8XAAA +6 +68W8YpSDJEuisxQxT/Vq4QAA +WXh8r+9LS0a2j6G05mbrNQAA +XkMl8Xxay06oFxIBBdRhcQAA +eO8F6STJPkynH0jnPxIL4gAA +NRF7ceZxo0aG5cNmwEEvRgAA +P/EPYj/rq0aUukjE0yoSmwAA +5 + +getUnit +XaPoBenZZEu29iS1fAxisQAA +1 + +pdkReturn +Unit<Q> +/BsxOfOSd0ehXwMIu6U6wgAA + + + +getValue +XaPoBenZZEu29iS1fAxisQAA +1 + +pdkReturn +Number ++yojku0EYEyYgZqPh/JDZQAA + + + +getValue +XaPoBenZZEu29iS1fAxisQAA +2 + +pdkReturn +Number +8z/XDa/m+kKda5+BpuFrGwAA + + +Unit<Q> unit +8z/XDa/m+kKda5+BpuFrGwAA + + + +doubleValue +XaPoBenZZEu29iS1fAxisQAA +2 + +pdkReturn +double +QZL/U1OYp0WHz9l7XnNZFAAA + + +Unit<Q> unit +QZL/U1OYp0WHz9l7XnNZFAAA + + + +longValue +XaPoBenZZEu29iS1fAxisQAA +2 + +pdkReturn +long +4rYAY7nVkEu0lsKFtO1/0gAA + + +Unit<Q> unit +4rYAY7nVkEu0lsKFtO1/0gAA + + + + + +unit +uSOo6kEo0UuBcq54UmvLXQAA +1 +5Lm2Ah6s+kGNHvzklYeXAAAA +1 + +unit +mtWYKGwud0O8JgiZ275cwgAA + +XigisKGk6Umkx9Gp+I0LegAA +1 + +clMaroon +$00B9FFFF +12 +56 +52 +456 +429 +Sh59W1JzjEKyBSV/ecykRAAA + + +1 +Unit + + +False + + +False + + + +Sh59W1JzjEKyBSV/ecykRAAA + + +Sh59W1JzjEKyBSV/ecykRAAA + + +False +Sh59W1JzjEKyBSV/ecykRAAA + + + + +4 + +format +mtWYKGwud0O8JgiZ275cwgAA +9 + +ParseException +vkPackage +oRQMLn37g0S0p6GQfyKzagAA +4 + +ParseException +UMLStandard +create +4UKkYBZpxkGzsZrlJ8fpCgAA +3 + +currentTokenVal +6j6bxQAPCEqIJVTNnKS7ZgAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + +expectedTokenSequencesVal +int +6j6bxQAPCEqIJVTNnKS7ZgAA +1 + +Java +JavaDimensions +JavaDimensions +2 +yeNDjof980mK5+fxXomOMQAA + + + +tokenImageVal +String +6j6bxQAPCEqIJVTNnKS7ZgAA +1 + +Java +JavaDimensions +JavaDimensions +1 +YYmSVxKayUSFgc5mTson4AAA + + + + +ParseException +UMLStandard +create +4UKkYBZpxkGzsZrlJ8fpCgAA + + +ParseException +UMLStandard +create +4UKkYBZpxkGzsZrlJ8fpCgAA +1 + +message +String +6BiNPAb+jky4Tn8DjhbsKwAA + + + +add_escapes +vkPackage +skClassifier +4UKkYBZpxkGzsZrlJ8fpCgAA +2 + +str +String +Y41o1s+8Fka76d3q0rkldwAA + + +return +pdkReturn +String +Y41o1s+8Fka76d3q0rkldwAA + + +1 +tBYCmOiwPEmrJS3J5yl7OwAA +3 + +expectedTokenSequences +* +int +4UKkYBZpxkGzsZrlJ8fpCgAA +1 + +Java +JavaDimensions +JavaDimensions +2 +zACd4TQo+UaWztLMXIEGTQAA + + + +tokenImage +* +String +4UKkYBZpxkGzsZrlJ8fpCgAA +1 + +Java +JavaDimensions +JavaDimensions +1 +6sWvbQBXpU20zFtsa5PzXgAA + + + +eol +vkProtected +String +System.getProperty("line.separator", "\n") +4UKkYBZpxkGzsZrlJ8fpCgAA + + + +Token +vkPackage +oRQMLn37g0S0p6GQfyKzagAA +7 + +Token +UMLStandard +create +YB5KmgJ3d0eBOKBDDO/MJAAA + + +Token +UMLStandard +create +YB5KmgJ3d0eBOKBDDO/MJAAA +1 + +kind +int +ylsrpDUSOU2/B9HYWiYclwAA + + + +Token +UMLStandard +create +YB5KmgJ3d0eBOKBDDO/MJAAA +2 + +kind +int +xwCp6BfjE0arH3N/raqEfQAA + + +image +String +xwCp6BfjE0arH3N/raqEfQAA + + + +getValue +YB5KmgJ3d0eBOKBDDO/MJAAA +1 + +return +pdkReturn +Object +casr0pchvkCLWR9DoJRduwAA + + + +toString +YB5KmgJ3d0eBOKBDDO/MJAAA +1 + +return +pdkReturn +String +7tc7Ge/BuEGcLaUwJYKXXAAA + + + +newToken +skClassifier +YB5KmgJ3d0eBOKBDDO/MJAAA +3 + +ofKind +int +IK4c80HyQkOQu2DfihQRAgAA + + +image +String +IK4c80HyQkOQu2DfihQRAgAA + + +return +pdkReturn +IK4c80HyQkOQu2DfihQRAgAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + + +newToken +skClassifier +YB5KmgJ3d0eBOKBDDO/MJAAA +2 + +ofKind +int +F+NzrdZ1HESzyvUmb1Hj7gAA + + +return +pdkReturn +F+NzrdZ1HESzyvUmb1Hj7gAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + +5 +S+ER+Zj2RUmoLbvLwQYYugAA +YZC1I1yZhkiR0Za7kYRDJwAA +wfIsdVPT40yMRohyLHksgQAA +2LIbVKJMX0yks9t6/TAidgAA +6Ujiwo09iEuw/A4iozBSTwAA +5 +ryIgZpF8MUCWYaIj54u2FAAA +OZDCziIDgEmHpAkZwqaF6wAA +tA1wOg2SlkKgGY4Ibo8eJwAA +SvhLethaBUSr08mgqeXQ5gAA +W6sGRXRIOEisfoQJNQPvtAAA +6 + +kind +vkPackage +int +YB5KmgJ3d0eBOKBDDO/MJAAA + + +beginLine +vkPackage +int +YB5KmgJ3d0eBOKBDDO/MJAAA + + +beginColumn +vkPackage +int +YB5KmgJ3d0eBOKBDDO/MJAAA + + +endLine +vkPackage +int +YB5KmgJ3d0eBOKBDDO/MJAAA + + +endColumn +vkPackage +int +YB5KmgJ3d0eBOKBDDO/MJAAA + + +image +vkPackage +String +YB5KmgJ3d0eBOKBDDO/MJAAA + + + +TokenMgrError +vkPackage +oRQMLn37g0S0p6GQfyKzagAA +6 + +TokenMgrError +UMLStandard +create +WXz8GbdLj0qSscfk9G4ZAgAA + + +TokenMgrError +UMLStandard +create +WXz8GbdLj0qSscfk9G4ZAgAA +2 + +message +String +h4+6qQOyBEmEqgDrUjA8NgAA + + +reason +int +h4+6qQOyBEmEqgDrUjA8NgAA + + + +TokenMgrError +UMLStandard +create +WXz8GbdLj0qSscfk9G4ZAgAA +7 + +EOFSeen +boolean +9qZhxYYZC0GCV7M8YtJUpwAA + + +lexState +int +9qZhxYYZC0GCV7M8YtJUpwAA + + +errorLine +int +9qZhxYYZC0GCV7M8YtJUpwAA + + +errorColumn +int +9qZhxYYZC0GCV7M8YtJUpwAA + + +errorAfter +String +9qZhxYYZC0GCV7M8YtJUpwAA + + +curChar +char +9qZhxYYZC0GCV7M8YtJUpwAA + + +reason +int +9qZhxYYZC0GCV7M8YtJUpwAA + + + +addEscapes +vkProtected +skClassifier +True +WXz8GbdLj0qSscfk9G4ZAgAA +2 + +str +String +xer33lhdr0OBw0Uz17Y0BAAA + + +return +pdkReturn +String +xer33lhdr0OBw0Uz17Y0BAAA + + + +LexicalError +vkProtected +skClassifier +WXz8GbdLj0qSscfk9G4ZAgAA +7 + +EOFSeen +boolean ++KTistYlV0KAGC0mKFAbKAAA + + +lexState +int ++KTistYlV0KAGC0mKFAbKAAA + + +errorLine +int ++KTistYlV0KAGC0mKFAbKAAA + + +errorColumn +int ++KTistYlV0KAGC0mKFAbKAAA + + +errorAfter +String ++KTistYlV0KAGC0mKFAbKAAA + + +curChar +char ++KTistYlV0KAGC0mKFAbKAAA + + +return +pdkReturn +String ++KTistYlV0KAGC0mKFAbKAAA + + + +getMessage +WXz8GbdLj0qSscfk9G4ZAgAA +1 + +return +pdkReturn +String +xAuFzx99i0qss0WInRI9fQAA + + +5 + +LEXICAL_ERROR +vkPackage +skClassifier +ckFrozen +int +0 +WXz8GbdLj0qSscfk9G4ZAgAA + + +STATIC_LEXER_ERROR +vkPackage +skClassifier +ckFrozen +int +1 +WXz8GbdLj0qSscfk9G4ZAgAA + + +INVALID_LEXICAL_STATE +vkPackage +skClassifier +ckFrozen +int +2 +WXz8GbdLj0qSscfk9G4ZAgAA + + +LOOP_DETECTED +vkPackage +skClassifier +ckFrozen +int +3 +WXz8GbdLj0qSscfk9G4ZAgAA + + +errorCode +vkPackage +int +WXz8GbdLj0qSscfk9G4ZAgAA + + + +UnitParserConstants +oRQMLn37g0S0p6GQfyKzagAA +1 +BTV0fEjO50CErlf0uoon/QAA + + +UnitParserTokenManager +vkPackage +oRQMLn37g0S0p6GQfyKzagAA +1 +BTV0fEjO50CErlf0uoon/QAA +8 + +UnitParserTokenManager +UMLStandard +create +vkPackage +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +stream +SimpleCharStream +u6AQRrd1eUmKIytwsyPn3QAA + + + +UnitParserTokenManager +UMLStandard +create +vkPackage +ErNvzFqiOUKyT9Ntr7fi/wAA +2 + +stream +SimpleCharStream +ze1V8q79J0O2Jo0tKNZj0wAA + + +lexState +int +ze1V8q79J0O2Jo0tKNZj0wAA + + + +setDebugStream +vkPackage +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +ds +java.io.PrintStream +R2BYiGE/SkC/+/K6q+9MoAAA + + + +reInit +vkPackage +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +stream +SimpleCharStream +wAOC2fkcnUOd6STT/V4ZJAAA + + + +reInit +vkPackage +ErNvzFqiOUKyT9Ntr7fi/wAA +2 + +stream +SimpleCharStream +6N6wxxzT+U+RquwJUn3UDgAA + + +lexState +int +6N6wxxzT+U+RquwJUn3UDgAA + + + +switchTo +vkPackage +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +lexState +int +nlkmoy3/BU+v5gwOXqu4vgAA + + + +jjFillToken +vkProtected +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +return +pdkReturn +vc8OhdTPKEqN4xfD8Ba6mgAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + + +getNextToken +vkPackage +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +return +pdkReturn +WsFPqys9K0akkgyLKvSVNgAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + +15 + +debugStream +vkPackage +java.io.PrintStream +System.out +ErNvzFqiOUKyT9Ntr7fi/wAA + + +jjbitVec0 +vkPackage +skClassifier +* +ckFrozen +long +{ + 0x0L, 0x0L, 0x20c000000000000L, 0x0L +} +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +Java +JavaDimensions +JavaDimensions +1 +gni4HVK5TU6z0kI79p6U1gAA + + + +jjbitVec1 +vkPackage +skClassifier +* +ckFrozen +long +{ + 0x0L, 0x3f1000000000000L, 0x0L, 0x0L +} +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +Java +JavaDimensions +JavaDimensions +1 +6tqShggAXEWkUG6RPNHBtAAA + + + +jjbitVec2 +vkPackage +skClassifier +* +ckFrozen +long +{ + 0xfffffffefffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL +} +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +Java +JavaDimensions +JavaDimensions +1 +a/hwmZZHEkmeU2jmMmzqUgAA + + + +jjbitVec4 +vkPackage +skClassifier +* +ckFrozen +long +{ + 0x0L, 0x0L, 0xfd73ffffffffffffL, 0xffffffffffffffffL +} +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +Java +JavaDimensions +JavaDimensions +1 +QSGjO8VnzEeVGX0k1Bu6CQAA + + + +jjbitVec5 +vkPackage +skClassifier +* +ckFrozen +long +{ + 0xffffffffffffffffL, 0xfc0effffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL +} +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +Java +JavaDimensions +JavaDimensions +1 +2PZNSoumC0OfZ534Kh2SJQAA + + + +jjnextStates +vkPackage +skClassifier +* +ckFrozen +int +{ + 9, 1, 2, 3, 10, 1, 2, 3, 10, 12, 14, 4, 5, +} +ErNvzFqiOUKyT9Ntr7fi/wAA +1 + +Java +JavaDimensions +JavaDimensions +1 +Rswq0Qw87kmAeHsDv10+mgAA + + + +input_stream +vkProtected +SimpleCharStream +ErNvzFqiOUKyT9Ntr7fi/wAA + + +curChar +vkProtected +char +ErNvzFqiOUKyT9Ntr7fi/wAA + + +curLexState +vkPackage +int +0 +ErNvzFqiOUKyT9Ntr7fi/wAA + + +defaultLexState +vkPackage +int +0 +ErNvzFqiOUKyT9Ntr7fi/wAA + + +jjnewStateCnt +vkPackage +int +ErNvzFqiOUKyT9Ntr7fi/wAA + + +jjround +vkPackage +int +ErNvzFqiOUKyT9Ntr7fi/wAA + + +jjmatchedPos +vkPackage +int +ErNvzFqiOUKyT9Ntr7fi/wAA + + +jjmatchedKind +vkPackage +int +ErNvzFqiOUKyT9Ntr7fi/wAA + + + +oRQMLn37g0S0p6GQfyKzagAA +ErNvzFqiOUKyT9Ntr7fi/wAA +MS8ueXbA0U60hfK48wRh3wAA + + +oRQMLn37g0S0p6GQfyKzagAA +2 + +False +999233tYskygVheGhQt0AwAA +4UKkYBZpxkGzsZrlJ8fpCgAA + + +currentToken +999233tYskygVheGhQt0AwAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + + +oRQMLn37g0S0p6GQfyKzagAA +2 + +False +M7cI4SXi1U63Vk2AoBiCXwAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + +next +vkPackage +M7cI4SXi1U63Vk2AoBiCXwAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + + +oRQMLn37g0S0p6GQfyKzagAA +2 + +False +FoKd4q1nxEe1YBCO7GXTLQAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + +specialToken +vkPackage +FoKd4q1nxEe1YBCO7GXTLQAA +YB5KmgJ3d0eBOKBDDO/MJAAA + + + + +ConversionException +mtWYKGwud0O8JgiZ275cwgAA +1 + +ConversionException +UMLStandard +create +a/zndA8QY0emfqYo0GRNNQAA +1 + +message +String +lgdY5/37VUSkgHp8qO11FwAA + + + + +Unit +mtWYKGwud0O8JgiZ275cwgAA +8 +8ACYa5GUHkWhyo1903+BzgAA +dlxjvMHxFEiS+2cqcM0KtwAA +xod/lcvQiE+6C0Ue9mdXXAAA +eiruX8dDuU62TD6hYC+YmwAA +Jb5l2YrurE297xl2GOlmbwAA +iABuWzxFgk6LVbT57FLNZQAA +66iHt2h33kak2T3NpBh+kQAA +9yeT3iJe1EWwW6rJAGVulQAA +19 + +Unit +UMLStandard +create +vkProtected +Sh59W1JzjEKyBSV/ecykRAAA + + +valueOf +UMLStandard +create +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<?> +D0Ud3DhgF0K4QZdDmZ23YAAA + + +CharSequence charSequencel +D0Ud3DhgF0K4QZdDmZ23YAAA + + + +add +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +Is7H7D+UvEuC5TlBWu9kMQAA + + +double offset +Is7H7D+UvEuC5TlBWu9kMQAA + + + +alternate +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<A> +z06ObhJOQEWOBegQn4wr2gAA + + +String symbol +z06ObhJOQEWOBegQn4wr2gAA + + + +getSymbol +Sh59W1JzjEKyBSV/ecykRAAA +1 + +pdkReturn +String +t6ipoTRnXk602mgsYjszOQAA + + + +asType +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<T> +t5C1y2RsJUKv3io1pxZFCwAA + + +Class<T> type +t5C1y2RsJUKv3io1pxZFCwAA + + + +divide +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +eZ2nxL3ljUm88Q84hh1aAgAA + + +double divisor +eZ2nxL3ljUm88Q84hh1aAgAA + + + +divide +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +1NmkTNePqUqObXwQEuGluQAA + + +long divisor +1NmkTNePqUqObXwQEuGluQAA + + + +divide +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +e06s86R3tUiDTR+BBImRBwAA + + +Unit<?> that +e06s86R3tUiDTR+BBImRBwAA + + + +inverse +Sh59W1JzjEKyBSV/ecykRAAA +1 + +pdkReturn +Unit<?> +aenqDdZmPUqoBf4bUWatcwAA + + + +isCompatible +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +boolean +c8EyUo9JFE6URG4yzf+oqQAA + + +Unit<?> that +c8EyUo9JFE6URG4yzf+oqQAA + + + +multiply +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +zpKjTLZYMEGC70P9fn6wWwAA + + +double factor +zpKjTLZYMEGC70P9fn6wWwAA + + + +multiply +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +mB9qqXsSDUO8nkFDvhYsAgAA + + +long factor +mB9qqXsSDUO8nkFDvhYsAgAA + + + +multiply +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +MmKzHVFMJ0ute1tumwjpmQAA + + +Unit<?> that +MmKzHVFMJ0ute1tumwjpmQAA + + + +pow +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<?> +rylsX7BDe0WLLeNY4b/fPwAA + + +int n +rylsX7BDe0WLLeNY4b/fPwAA + + + +root +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<?> +a8dzOJ7IcE2/E/JGxLrIiQAA + + +int n +a8dzOJ7IcE2/E/JGxLrIiQAA + + + +toMetric +Sh59W1JzjEKyBSV/ecykRAAA +1 + +pdkReturn +Unit<Q> +S9Ej6ea53Uuw9L17HkD00AAA + + + +toString +Sh59W1JzjEKyBSV/ecykRAAA +1 + +pdkReturn +String +ZnmdNuqlqUe0BxVPj7yWSwAA + + + +transform +Sh59W1JzjEKyBSV/ecykRAAA +2 + +pdkReturn +Unit<Q> +KnX/iZhZFUODKbrrv1cfTAAA + + +UnitConverter operation +KnX/iZhZFUODKbrrv1cfTAAA + + +1 + +ONE +ckFrozen +Unit<Dimensionless> +Sh59W1JzjEKyBSV/ecykRAAA + + + +UnitConverter +mtWYKGwud0O8JgiZ275cwgAA + + + + + + +Implementation Model +UMLStandard +implementationModel +VcAKAm5HLkua0s+gDWv7jwAA +1 + +Main +vpARAVlv3Uu2xtpGD6cyXQAA + +C9jOXpcShEetPQwo7XAjMQAA + + + + +Deployment Model +UMLStandard +deploymentModel +VcAKAm5HLkua0s+gDWv7jwAA +1 + +Main +2kacznXMQEm22W1/CUwEkgAA + +/WkLqDQmAUKPUi7NCd1Z1AAA + + + + + + diff --git a/src/doc/quantity.jpg b/src/doc/quantity.jpg new file mode 100644 index 0000000000000000000000000000000000000000..609458d8424d111370be7cf47362f0fbeeeb4935 GIT binary patch literal 20508 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 literal 0 HcmV?d00001 diff --git a/src/main/java/javax/measure/quantity/ElectricCapacitance.java b/src/main/java/javax/measure/quantity/ElectricCapacitance.java new file mode 100644 index 0000000..e0e23e2 --- /dev/null +++ b/src/main/java/javax/measure/quantity/ElectricCapacitance.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents an electric capacitance. + * The metric system unit for this quantity is "F" (Farad). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface ElectricCapacitance extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/ElectricCharge.java b/src/main/java/javax/measure/quantity/ElectricCharge.java new file mode 100644 index 0000000..3b0b6dd --- /dev/null +++ b/src/main/java/javax/measure/quantity/ElectricCharge.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents an electric charge. + * The metric system unit for this quantity is "C" (Coulomb). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface ElectricCharge extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/ElectricConductance.java b/src/main/java/javax/measure/quantity/ElectricConductance.java new file mode 100644 index 0000000..1721021 --- /dev/null +++ b/src/main/java/javax/measure/quantity/ElectricConductance.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents an electric conductance. + * The metric system unit for this quantity "S" (Siemens). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface ElectricConductance extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/ElectricCurrent.java b/src/main/java/javax/measure/quantity/ElectricCurrent.java new file mode 100644 index 0000000..bc70672 --- /dev/null +++ b/src/main/java/javax/measure/quantity/ElectricCurrent.java @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents the amount of electric charge flowing past + * a specified circuit point per unit time. + * The metric system unit for this quantity is "A" (Ampere). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface ElectricCurrent extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/ElectricInductance.java b/src/main/java/javax/measure/quantity/ElectricInductance.java new file mode 100644 index 0000000..7e992f5 --- /dev/null +++ b/src/main/java/javax/measure/quantity/ElectricInductance.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents an electric inductance. + * The metric system unit for this quantity is "H" (Henry). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface ElectricInductance extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/ElectricPotential.java b/src/main/java/javax/measure/quantity/ElectricPotential.java new file mode 100644 index 0000000..20c1ce1 --- /dev/null +++ b/src/main/java/javax/measure/quantity/ElectricPotential.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents an electric potential or electromotive force. + * The metric system unit for this quantity is "V" (Volt). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface ElectricPotential extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/ElectricResistance.java b/src/main/java/javax/measure/quantity/ElectricResistance.java new file mode 100644 index 0000000..cb95bb0 --- /dev/null +++ b/src/main/java/javax/measure/quantity/ElectricResistance.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents an electric resistance. + * The metric system unit for this quantity is "Ohm" (Ω). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface ElectricResistance extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/LuminousFlux.java b/src/main/java/javax/measure/quantity/LuminousFlux.java new file mode 100644 index 0000000..3f72f27 --- /dev/null +++ b/src/main/java/javax/measure/quantity/LuminousFlux.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents a luminous flux. + * The metric system unit for this quantity is "lm" (lumen). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface LuminousFlux extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/LuminousIntensity.java b/src/main/java/javax/measure/quantity/LuminousIntensity.java new file mode 100644 index 0000000..526d823 --- /dev/null +++ b/src/main/java/javax/measure/quantity/LuminousIntensity.java @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents the luminous flux density per solid angle as + * measured in a given direction relative to the emitting source. + * The metric system unit for this quantity is "cd" (candela). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface LuminousIntensity extends Quantity { + +} \ No newline at end of file diff --git a/src/main/java/javax/measure/quantity/MagneticFlux.java b/src/main/java/javax/measure/quantity/MagneticFlux.java new file mode 100644 index 0000000..05425fb --- /dev/null +++ b/src/main/java/javax/measure/quantity/MagneticFlux.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents a magnetic flux. + * The metric system unit for this quantity is "Wb" (Weber). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface MagneticFlux extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/MagneticFluxDensity.java b/src/main/java/javax/measure/quantity/MagneticFluxDensity.java new file mode 100644 index 0000000..b8d13d8 --- /dev/null +++ b/src/main/java/javax/measure/quantity/MagneticFluxDensity.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents a magnetic flux density. + * The metric system unit for this quantity is "T" (Tesla). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface MagneticFluxDensity extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/Quantity.java b/src/main/java/javax/measure/quantity/Quantity.java new file mode 100644 index 0000000..56e33d6 --- /dev/null +++ b/src/main/java/javax/measure/quantity/Quantity.java @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +import javax.measure.unit.Unit; + +/** + *

Represents a quantitative properties or attributes of thing. + * Mass, time, distance, heat, and angular separation + * are among the familiar examples of quantitative properties.

+ * + *

{@link QuantityFactory} can be used to generate simple instances of this class.[code] + * Time duration = QuantityFactory.getInstance(Time.class).create(12, MILLI(SECOND)); + * Length distance = QuantityFactory.getInstance(Length.class).create(37.4, MILES); + * [/code]

+ * + *

Quantities are used to specify the quantitative property associated + * to a class through class parameterization.[code] + * Unit pound = ... + * Sensor thermometer = ... + * Vector3D aircraftSpeed = ... + * [/code]

+ * + * @param The type of the quantity. + * + * @author Martin Desruisseaux + * @author Werner Keil + * @author Jean-Marie Dautelle + * @version 1.7 ($Revision: 198 $), $Date: 2010-02-24 19:53:02 +0100 (Mi, 24 Feb 2010) $ + * @see Wikipedia: Quantity + */ +public interface Quantity> extends Comparable> { + + /** + * Returns the magnitude or multitude value of this quantity stated in this + * quantity {@linkplain #getUnit() unit}. + * + * @return the numeric value of this quantity in the units returned by {@link #getUnit()}. + */ + Number getValue(); + + /** + * Returns the original unit of this quantity (the one specified at creation). + * + * @return the original unit of this quantity. + */ + Unit getUnit(); + + /** + * Returns the value of this quantity stated in the specified unit. + * This method is recommended over + * q.getUnit().getConverterTo(unit).convert(q.getValue()), + * it is not only faster but also detects potential overflow if the + * value stated in the specific unit cannot be represented or rounded. + * + * @param unit the unit in which the returned value is stated. + * @return the value of this quantity when stated in the specified unit. + * @throws ArithmeticException if this quantity cannot be converted to + * when stated in the specified unit (e.g. overflow). + */ + Number getValue(Unit unit) throws ArithmeticException; + + /** + * Returns the value of this quantity as double stated + * in the specified unit. This method is recommended over + * q.getUnit().getConverterTo(unit).convert(q.getValue()).doubleValue() + * + * @param unit the unit in which the returned value is stated. + * @return the value of this quantity when stated in the specified unit. + */ + double doubleValue(Unit unit); + + /** + * Returns the value of this quantity as long stated + * in the specified unit. This method is recommended over + * q.getUnit().getConverterTo(unit).convert(q.getValue()).longValue(), + * it is not only faster but also detects potential overflow if the + * value stated in the specific unit cannot be represented as + * long. + * + * @param unit the unit in which the returned value is stated. + * @return the value of this quantity when stated in the specified unit. + * @throws ArithmeticException if this quantity cannot represented as + * a long when stated in the specified unit (e.g. overflow). + */ + long longValue(Unit unit) throws ArithmeticException; +} diff --git a/src/main/java/javax/measure/quantity/QuantityFactory.java b/src/main/java/javax/measure/quantity/QuantityFactory.java new file mode 100644 index 0000000..2299cfb --- /dev/null +++ b/src/main/java/javax/measure/quantity/QuantityFactory.java @@ -0,0 +1,237 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; +import javax.measure.unit.Unit; +import static javax.measure.unit.MetricSystem.*; + +/** + * A factory producing simple quantities instances (tuples {@link Number}/{@link Unit}). + * + * For example:[code] + * Mass m = QuantityFactory.getInstance(Mass.class).create(23.0, KILOGRAM); // 23.0 Kg + * Time m = QuantityFactory.getInstance(Time.class).create(124, MILLI(SECOND)); // 124 ms + * [/code] + * @param The type of the quantity. + * + * @author Martin Desruisseaux + * @author Werner Keil + * @author Jean-Marie Dautelle + * @version 1.0.5 ($Revision: 202 $), $Date: 2010-02-25 01:24:19 +0100 (Do, 25 Feb 2010) $ + */ +public abstract class QuantityFactory> { + + /** + * Holds the current instances. + */ + @SuppressWarnings("unchecked") + private static final ConcurrentHashMap INSTANCES = new ConcurrentHashMap(); + + /** + * Returns the default instance for the specified quantity type. + * + * @param The type of the quantity + * @param type the quantity type + * @return the quantity factory for the specified type + */ + @SuppressWarnings("unchecked") + public static > QuantityFactory getInstance(final Class type) { + QuantityFactory factory = INSTANCES.get(type); + if (factory != null) return factory; + if (!Quantity.class.isAssignableFrom(type)) + // This exception is not documented because it should never happen if the + // user don't try to trick the Java generic types system with unsafe cast. + throw new ClassCastException(); + factory = new Default(type); + INSTANCES.put(type, factory); + return factory; + } + + /** + * Overrides the default implementation of the factory for the specified + * quantity type. + * + * @param The type of the quantity + * @param type the quantity type + * @param factory the quantity factory + */ + @SuppressWarnings("unchecked") + protected static > void setInstance(final Class type, QuantityFactory factory) { + if (!Quantity.class.isAssignableFrom(type)) + // This exception is not documented because it should never happen if the + // user don't try to trick the Java generic types system with unsafe cast. + throw new ClassCastException(); + INSTANCES.put(type, factory); + } + + /** + * Returns the quantity for the specified number stated in the specified unit. + * + * @param value the value stated in the specified unit + * @param unit the unit + * @return the corresponding quantity + */ + public abstract Q create(Number value, Unit unit); + + /** + * Returns the metric unit for quantities produced by this factory + * or null if unknown. + * + * @return the metric units for this factory quantities. + */ + public abstract Unit getMetricUnit(); + + /** + * The default factory implementation. This factory uses reflection for providing + * a default implementation for every {@link Quantity} sub-types. + * + * @param The type of the quantity + */ + private static final class Default> extends QuantityFactory { + + /** + * The type of the quantities created by this factory. + */ + private final Class type; + + /** + * The metric unit for quantities created by this factory. + */ + private final Unit metricUnit; + + /** + * Creates a new factory for quantities of the given type. + * + * @param type The type of the quantities created by this factory. + */ + Default(final Class type) { + this.type = type; + metricUnit = CLASS_TO_METRIC_UNIT.get(type); + } + @SuppressWarnings("unchecked") + static final HashMap CLASS_TO_METRIC_UNIT = new HashMap(); + static { + CLASS_TO_METRIC_UNIT.put(Dimensionless.class, Unit.ONE); + CLASS_TO_METRIC_UNIT.put(ElectricCurrent.class, AMPERE); + CLASS_TO_METRIC_UNIT.put(LuminousIntensity.class, CANDELA); + CLASS_TO_METRIC_UNIT.put(Temperature.class, KELVIN); + CLASS_TO_METRIC_UNIT.put(Mass.class, KILOGRAM); + CLASS_TO_METRIC_UNIT.put(Length.class, METRE); + CLASS_TO_METRIC_UNIT.put(AmountOfSubstance.class, MOLE); + CLASS_TO_METRIC_UNIT.put(Time.class, SECOND); + CLASS_TO_METRIC_UNIT.put(MagnetomotiveForce.class, AMPERE_TURN); + CLASS_TO_METRIC_UNIT.put(Angle.class, RADIAN); + CLASS_TO_METRIC_UNIT.put(SolidAngle.class, STERADIAN); + CLASS_TO_METRIC_UNIT.put(DataAmount.class, BIT); + CLASS_TO_METRIC_UNIT.put(Frequency.class, HERTZ); + CLASS_TO_METRIC_UNIT.put(Force.class, NEWTON); + CLASS_TO_METRIC_UNIT.put(Pressure.class, PASCAL); + CLASS_TO_METRIC_UNIT.put(Energy.class, JOULE); + CLASS_TO_METRIC_UNIT.put(Power.class, WATT); + CLASS_TO_METRIC_UNIT.put(ElectricCharge.class, COULOMB); + CLASS_TO_METRIC_UNIT.put(ElectricPotential.class, VOLT); + CLASS_TO_METRIC_UNIT.put(ElectricCapacitance.class, FARAD); + CLASS_TO_METRIC_UNIT.put(ElectricResistance.class, OHM); + CLASS_TO_METRIC_UNIT.put(ElectricConductance.class, SIEMENS); + CLASS_TO_METRIC_UNIT.put(MagneticFlux.class, WEBER); + CLASS_TO_METRIC_UNIT.put(MagneticFluxDensity.class, TESLA); + CLASS_TO_METRIC_UNIT.put(ElectricInductance.class, HENRY); + CLASS_TO_METRIC_UNIT.put(LuminousFlux.class, LUMEN); + CLASS_TO_METRIC_UNIT.put(Illuminance.class, LUX); + CLASS_TO_METRIC_UNIT.put(RadioactiveActivity.class, BECQUEREL); + CLASS_TO_METRIC_UNIT.put(RadiationDoseAbsorbed.class, GRAY); + CLASS_TO_METRIC_UNIT.put(RadiationDoseEffective.class, SIEVERT); + CLASS_TO_METRIC_UNIT.put(CatalyticActivity.class, KATAL); + CLASS_TO_METRIC_UNIT.put(Velocity.class, METRES_PER_SECOND); + CLASS_TO_METRIC_UNIT.put(Acceleration.class, METRES_PER_SQUARE_SECOND); + CLASS_TO_METRIC_UNIT.put(Area.class, SQUARE_METRE); + CLASS_TO_METRIC_UNIT.put(Volume.class, CUBIC_METRE); + } + + + @Override + @SuppressWarnings("unchecked") + public Q create(final Number value, final Unit unit) { + return (Q) Proxy.newProxyInstance(type.getClassLoader(), + new Class[]{type}, new GenericHandler(value, unit)); + } + + @Override + public Unit getMetricUnit() { + return metricUnit; + } + } + + /** + * The method invocation handler for implementation backed by any kind of {@link Number}. + * This is a fall back used when no specialized handler is available for the number type. + */ + private static final class GenericHandler> implements InvocationHandler { + final Unit unit; + final Number value; + + GenericHandler(final Number value, final Unit unit) { + this.unit = unit; + this.value = value; + } + + @SuppressWarnings("unchecked") + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) { + final String name = method.getName(); + if (name.equals("doubleValue")) { // Most frequent. + final Unit toUnit = (Unit) args[0]; + if ((value instanceof Double) && ((toUnit == unit) || (toUnit.equals(unit)))) + return ((Double)value).doubleValue(); // Returns value directly. + return unit.getConverterTo(toUnit).convert(value.doubleValue()); + } else if (name.equals("longValue")) { + final Unit toUnit = (Unit) args[0]; + if ((value instanceof Long) && ((toUnit == unit) || (toUnit.equals(unit)))) + return ((Long)value).doubleValue(); // Returns value directly. + double doubleValue = unit.getConverterTo(toUnit).convert(value.doubleValue()); + if ((doubleValue < Long.MIN_VALUE) || (doubleValue > Long.MAX_VALUE)) + throw new ArithmeticException("Overflow: " + doubleValue + " cannot be represented as a long"); + return (long) doubleValue; + } else if (name.equals("getValue")) { + if (args == null) { + return value; + } else { + final Unit toUnit = (Unit) args[0]; + if ((value instanceof Number) && ((toUnit == unit) || (toUnit.equals(unit)))) { + return value; // Returns value directly. + } + return unit.getConverterTo(toUnit).convert(value); + } + } else if (name.equals("getUnit")) { + return unit; + } else if (name.equals("toString")) { + final StringBuilder buffer = new StringBuilder(); + return buffer.append(value).append(' ').append(unit).toString(); + } else if (name.equals("hashCode")) { + return value.hashCode() * 31 + unit.hashCode(); + } else if (name.equals("equals")) { + final Object obj = args[0]; + if (!(obj instanceof Quantity)) + return false; + final Quantity that = (Quantity) obj; + if (!unit.isCompatible(that.getUnit())) + return false; + return value.doubleValue() == that.doubleValue(unit); + } else if (name.equals("compareTo")) { + final Quantity that = (Quantity) args[0]; + return Double.compare(value.doubleValue(), that.doubleValue(unit)); + } else { + throw new UnsupportedOperationException(name); + } + } + } +} diff --git a/src/main/java/javax/measure/quantity/RadiationDoseAbsorbed.java b/src/main/java/javax/measure/quantity/RadiationDoseAbsorbed.java new file mode 100644 index 0000000..8f7ad8a --- /dev/null +++ b/src/main/java/javax/measure/quantity/RadiationDoseAbsorbed.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents the amount of energy deposited per unit of mass. + * The system unit for this quantity is "Gy" (Gray). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface RadiationDoseAbsorbed extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/RadiationDoseEffective.java b/src/main/java/javax/measure/quantity/RadiationDoseEffective.java new file mode 100644 index 0000000..98218ca --- /dev/null +++ b/src/main/java/javax/measure/quantity/RadiationDoseEffective.java @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents the effective (or "equivalent") dose of radiation + * received by a human or some other living organism. + * The metric system unit for this quantity is "Sv" (Sievert). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface RadiationDoseEffective extends Quantity { + +} diff --git a/src/main/java/javax/measure/quantity/RadioactiveActivity.java b/src/main/java/javax/measure/quantity/RadioactiveActivity.java new file mode 100644 index 0000000..77e05fb --- /dev/null +++ b/src/main/java/javax/measure/quantity/RadioactiveActivity.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.quantity; + +/** + * Represents a radioactive activity. + * The metric system unit for this quantity is "Bq" (Becquerel). + * + * @author Jean-Marie Dautelle + * @version 1.0, April 15, 2009 + */ +public interface RadioactiveActivity extends Quantity { + +} diff --git a/src/main/java/javax/measure/unit/ConversionException.java b/src/main/java/javax/measure/unit/ConversionException.java new file mode 100644 index 0000000..d71ff7d --- /dev/null +++ b/src/main/java/javax/measure/unit/ConversionException.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.unit; + +/** + * Signals that a problem of some sort has occurred either when creating a + * converter between two units or during the conversion itself. + * + * @author Jean-Marie Dautelle + * @author Werner Keil + * @version 1.4 ($Revision: 198 $), $Date: 2010-02-24 19:53:02 +0100 (Mi, 24 Feb 2010) $ + */ +public class ConversionException extends RuntimeException { + + /** The serialVersionUID */ + private static final long serialVersionUID = -2846245619420930853L; + + /** + * Constructs a ConversionException with the specified detail + * message. + * + * @param message the detail message. + */ + public ConversionException(String message) { + super(message); + } +} diff --git a/src/main/java/javax/measure/unit/Dimension.java b/src/main/java/javax/measure/unit/Dimension.java new file mode 100644 index 0000000..2358760 --- /dev/null +++ b/src/main/java/javax/measure/unit/Dimension.java @@ -0,0 +1,292 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.unit; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import javax.measure.quantity.Dimensionless; + +/** + *

This class represents the dimension of an unit. Two units u1 + * and u2 are {@linkplain Unit#isCompatible compatible} if and + * only if (u1.getDimension().equals(u2.getDimension()))) + *

+ * + *

Instances of this class are immutable.

+ * + * @author Jean-Marie Dautelle + * @author Werner Keil + * + * @version 1.0.3 ($Revision: 176 $), $Date: 2010-02-22 19:09:37 +0100 (Mo, 22 Feb 2010) $ + * @see + * BIPM: SI Brochure Chapter 1.3 + */ +public final class Dimension implements Serializable { + + /** + * For cross-version compatibility. + */ + private static final long serialVersionUID = 2377803885472362640L; + + /** + * Holds the current physical model. + */ + private static Model model = Model.STANDARD; + + /** + * Holds dimensionless. + */ + public static final Dimension NONE = new Dimension(Unit.ONE); + + /** + * Holds length dimension (L). + */ + public static final Dimension LENGTH = new Dimension('L'); + + /** + * Holds mass dimension (M). + */ + public static final Dimension MASS = new Dimension('M'); + + /** + * Holds time dimension (T). + */ + public static final Dimension TIME = new Dimension('T'); + + /** + * Holds electric current dimension (I). + */ + public static final Dimension ELECTRIC_CURRENT = new Dimension('I'); + + /** + * Holds temperature dimension (Θ). + */ + public static final Dimension TEMPERATURE = new Dimension('Θ'); + + /** + * Holds amount of substance dimension (N). + */ + public static final Dimension AMOUNT_OF_SUBSTANCE = new Dimension('N'); + + /** + * Holds luminous intensity dimension (J). + */ + public static final Dimension LUMINOUS_INTENSITY = new Dimension('J'); + + /** + * Holds the pseudo unit associated to this dimension. + */ + private final Unit pseudoUnit; + + /** + * Creates a new dimension associated to the specified symbol. + * + * @param symbol the associated symbol. + */ + private Dimension(char symbol) { + pseudoUnit = new BaseUnit("[" + symbol + "]"); + } + + /** + * Creates a dimension having the specified pseudo-unit + * (base unit or product of base unit). + * + * @param pseudoUnit the pseudo-unit identifying this dimension. + */ + private Dimension(Unit pseudoUnit) { + this.pseudoUnit = pseudoUnit; + } + + /** + * Returns the product of this dimension with the one specified. + * + * @param that the dimension multiplicand. + * @return this * that + */ + public final Dimension multiply(Dimension that) { + return new Dimension(this.pseudoUnit.multiply(that.pseudoUnit)); + } + + /** + * Returns the quotient of this dimension with the one specified. + * + * @param that the dimension divisor. + * @return this / that + */ + public final Dimension divide(Dimension that) { + return new Dimension(this.pseudoUnit.divide(that.pseudoUnit)); + } + + /** + * Returns this dimension raised to an exponent. + * + * @param n the exponent. + * @return the result of raising this dimension to the exponent. + */ + public final Dimension pow(int n) { + return new Dimension(this.pseudoUnit.pow(n)); + } + + /** + * Returns the given root of this dimension. + * + * @param n the root's order. + * @return the result of taking the given root of this dimension. + * @throws ArithmeticException if n == 0. + */ + public final Dimension root(int n) { + return new Dimension(this.pseudoUnit.root(n)); + } + + /** + * Returns the fundamental dimensions and their exponent whose product is + * this dimension or null if this dimension is a fundamental + * dimension. + * + * @return the mapping between the fundamental dimensions and their exponent. + */ + Map getProductDimensions() { + Map, Integer> pseudoUnits = pseudoUnit.getProductUnits(); + if (pseudoUnit == null) return null; + Map fundamentalDimensions = new HashMap(); + for (Map.Entry, Integer> entry : pseudoUnits.entrySet()) { + fundamentalDimensions.put(new Dimension(entry.getKey()), entry.getValue()); + } + return fundamentalDimensions; + } + + /** + * Returns the representation of this dimension. + * + * @return the representation of this dimension. + */ + @Override + public String toString() { + return pseudoUnit.toString(); + } + + /** + * Indicates if the specified dimension is equals to the one specified. + * + * @param that the object to compare to. + * @return true if this dimension is equals to that dimension; + * false otherwise. + */ + @Override + public boolean equals(Object that) { + if (this == that) + return true; + return (that instanceof Dimension) && pseudoUnit.equals(((Dimension) that).pseudoUnit); + } + + /** + * Returns the hash code for this dimension. + * + * @return this dimension hashcode value. + */ + @Override + public int hashCode() { + return pseudoUnit.hashCode(); + } + + /** + * Sets the model used to determinate the units dimensions. + * + * @param model the new model to be used when calculating unit dimensions. + */ + public static void setModel(Model model) { + Dimension.model = model; + } + + /** + * Returns the model used to determinate the units dimensions + * (default {@link Model#STANDARD STANDARD}). + * + * @return the model used when calculating unit dimensions. + */ + public static Model getModel() { + return Dimension.model; + } + + /** + * This interface represents the mapping between {@linkplain BaseUnit base units} + * and {@linkplain Dimension dimensions}. Custom models may allow + * conversions not possible using the {@linkplain #STANDARD standard} model. + * For example:[code] + * public static void main(String[] args) { + * Dimension.Model relativistic = new Dimension.Model() { + * RationalConverter metreToSecond = new RationalConverter(BigInteger.ONE, BigInteger.valueOf(299792458)); // 1/c + * + * public Dimension getDimension(BaseUnit unit) { + * if (unit.equals(METRE)) return Dimension.TIME; + * return Dimension.Model.STANDARD.getDimension(unit); + * } + * + * public UnitConverter getTransform(BaseUnit unit) { + * if (unit.equals(METRE)) return metreToSecond; + * return Dimension.Model.STANDARD.getTransform(unit); + * }}; + * Dimension.setModel(relativistic); + * + * // Converts 1.0 GeV (energy) to kg (mass). + * System.out.println(Unit.valueOf("GeV").getConverterTo(KILOGRAM).convert(1.0)); + * } + * + * > 1.7826617302520883E-27[/code] + */ + public interface Model { + + /** + * Holds the standard model (default). + */ + public Model STANDARD = new Model() { + + public Dimension getDimension(BaseUnit unit) { + if (unit.equals(MetricSystem.METRE)) + return Dimension.LENGTH; + if (unit.equals(MetricSystem.KILOGRAM)) + return Dimension.MASS; + if (unit.equals(MetricSystem.KELVIN)) + return Dimension.TEMPERATURE; + if (unit.equals(MetricSystem.SECOND)) + return Dimension.TIME; + if (unit.equals(MetricSystem.AMPERE)) + return Dimension.ELECTRIC_CURRENT; + if (unit.equals(MetricSystem.MOLE)) + return Dimension.AMOUNT_OF_SUBSTANCE; + if (unit.equals(MetricSystem.CANDELA)) + return Dimension.LUMINOUS_INTENSITY; + return new Dimension(new BaseUnit("[" + unit.getSymbol() + "]")); + } + + public UnitConverter getTransform(BaseUnit unit) { + return UnitConverter.IDENTITY; + } + }; + + /** + * Returns the dimension of the specified base unit (a dimension + * particular to the base unit if the base unit is not recognized). + * + * @param unit the base unit for which the dimension is returned. + * @return the dimension of the specified unit. + */ + Dimension getDimension(BaseUnit unit); + + /** + * Returns the normalization transform of the specified base unit + * ({@link UnitConverter#IDENTITY IDENTITY} if the base unit is + * not recognized). + * + * @param unit the base unit for which the transform is returned. + * @return the normalization transform. + */ + UnitConverter getTransform(BaseUnit unit); + } +} diff --git a/src/main/java/javax/measure/unit/SystemOfUnits.java b/src/main/java/javax/measure/unit/SystemOfUnits.java new file mode 100644 index 0000000..dbe590f --- /dev/null +++ b/src/main/java/javax/measure/unit/SystemOfUnits.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.unit; + +import java.util.HashSet; +import java.util.Set; + +/** + *

This class represents a system of units, it groups units together + * for historical or cultural reasons. Nothing prevents a unit from + * belonging to several system of units at the same time + * (for example an imperial system would have many of the units + * held by {@link USCustomarySystem}).

+ * + * @author Jean-Marie Dautelle + * @author Werner Keil + * @version 1.1 ($Revision: 169 $), $Date: 2010-02-21 18:48:40 +0100 (So, 21 Feb 2010) $ + */ +public abstract class SystemOfUnits { + + /** + * Default constructor. + */ + protected SystemOfUnits() { + } + + /** + * Returns a read only view over the units defined in this system. + * + * @return the collection of units. + */ + public abstract Set> getUnits(); + + + /** + * Returns the units defined in this system having the specified + * dimension (convenience method). This method returns all the units + * in this system of units having the specified dimension. + * + * @param dimension the dimension of the units to be returned. + * @return the collection of units of specified dimension. + */ + public Set> getUnits(Dimension dimension) { + final Set> units = new HashSet>(); + for (Unit unit : getUnits()) { + if (unit.getDimension().equals(dimension)) { + units.add(unit); + } + } + return units; + } +} diff --git a/src/main/java/javax/measure/unit/USCustomarySystem.java b/src/main/java/javax/measure/unit/USCustomarySystem.java new file mode 100644 index 0000000..1a9a59e --- /dev/null +++ b/src/main/java/javax/measure/unit/USCustomarySystem.java @@ -0,0 +1,336 @@ +/** + * Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil + * All rights reserved. + * + * See LICENSE.txt for the Specification License + */ +package javax.measure.unit; + +import static javax.measure.unit.MetricSystem.*; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import javax.measure.quantity.Angle; +import javax.measure.quantity.Area; +import javax.measure.quantity.DataAmount; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Length; +import javax.measure.quantity.Mass; +import javax.measure.quantity.Temperature; +import javax.measure.quantity.Time; +import javax.measure.quantity.Velocity; +import javax.measure.quantity.Volume; + +/** + *

This class contains units from the United States customary system.

+ * + * @author Jean-Marie Dautelle + * @author Werner Keil + * @version 1.2 ($Revision: 192 $), $Date: 2010-02-24 17:46:38 +0100 (Mi, 24 Feb 2010) $ + * @see Wikipedia: United State Customary Units + */ +public final class USCustomarySystem extends SystemOfUnits { + + /** + * Holds collection of units. + */ + private static final Set> UNITS = new HashSet>(); + + /** + * Default constructor (prevents this class from being instantiated). + */ + private USCustomarySystem() { + } + + /** + * Returns the unique instance of this class. + * + * @return the NonSI instance. + */ + public static USCustomarySystem getInstance() { + return INSTANCE; + } + private static final USCustomarySystem INSTANCE = new USCustomarySystem(); + + + // ////////// + // Length // + // ////////// + /** + * US name for {@link MetricSystem#METRE}. + */ + public static final Unit METER = METRE; + + /** + * A unit of length equal to 0.3048 m (standard name + * ft). + */ + public static final Unit FOOT = addUnit(METER.multiply( + 3048).divide(10000)); + + /** + * A unit of length equal to 1200/3937 m (standard name + * foot_survey_us). See also: foot + */ + public static final Unit FOOT_SURVEY = addUnit(METER.multiply(1200).divide(3937)); + + /** + * A unit of length equal to 0.9144 m (standard name + * yd). + */ + public static final Unit YARD = addUnit(FOOT.multiply(3)); + + /** + * A unit of length equal to 0.0254 m (standard name + * in). + */ + public static final Unit INCH = addUnit(FOOT.divide(12)); + + /** + * A unit of length equal to 1609.344 m (standard name + * mi). + */ + public static final Unit MILE = addUnit(METER.multiply(1609344).divide( + 1000)); + + /** + * A unit of length equal to 1852.0 m (standard name + * nmi). + */ + public static final Unit NAUTICAL_MILE = addUnit(METER.multiply(1852)); + + + // //////// + // Mass // + // //////// + + /** + * A unit of mass equal to 453.59237 grams (avoirdupois pound, + * standard name lb). + */ + public static final Unit POUND = addUnit(KILOGRAM.multiply( + 45359237).divide(100000000)); + + /** + * A unit of mass equal to 1 / 16 {@link #POUND} (standard name oz). + */ + public static final Unit OUNCE = addUnit(POUND.divide(16)); + + /** + * A unit of mass equal to 2000 {@link #POUND} (short ton, standard name + * ton). + */ + public static final Unit TON = addUnit(POUND.multiply(2000)); + + + // /////////////// + // Temperature // + // /////////////// + + /** + * A unit of temperature equal to 5/9 °K (standard name + * °R). + */ + public static final Unit RANKINE = addUnit(KELVIN.multiply(5).divide(9)); + + /** + * A unit of temperature equal to degree Rankine minus + * 459.67 °R (standard name °F). + * + * @see #RANKINE + */ + public static final Unit FAHRENHEIT = addUnit(RANKINE.add(459.67)); + + + // ///////// + // Angle // + // ///////// + + /** + * A unit of angle equal to a full circle or 2π + * {@link MetricSystem#RADIAN} (standard name rev). + */ + public static final Unit REVOLUTION = addUnit(RADIAN.multiply(2).multiply(Math.PI).asType(Angle.class)); + + /** + * A unit of angle equal to 1/360 {@link #REVOLUTION} (standard name deg). + */ + public static final Unit DEGREE_ANGLE = addUnit(REVOLUTION.divide(360)); + + /** + * A unit of angle equal to 1/60 {@link #DEGREE_ANGLE} (standard name '). + */ + public static final Unit MINUTE_ANGLE = addUnit(DEGREE_ANGLE.divide(60)); + + /** + * A unit of angle equal to 1/60 {@link #MINUTE_ANGLE} (standard name "). + */ + public static final Unit SECOND_ANGLE = addUnit(MINUTE_ANGLE.divide(60)); + + + // //////////// + // Duration // + // //////////// + /** + * A unit of time equal to 60 s (standard name + * min). + */ + public static final Unit