This repository has been archived by the owner on Dec 15, 2020. It is now read-only.
/
BigIntegerConverter.java
106 lines (98 loc) · 4.03 KB
/
BigIntegerConverter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.tamaya.core.internal.converters;
import org.apache.tamaya.spi.ConversionContext;
import org.apache.tamaya.spi.PropertyConverter;
import org.osgi.service.component.annotations.Component;
import java.math.BigInteger;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Converter, converting from String to BigInteger, the supported format is one of the following:
* <ul>
* <li>0xFFFFFF</li>
* <li>0XFFFFAC</li>
* <li>23257352735276352753</li>
* <li>-0xFFFFFF</li>
* <li>-0XFFFFAC</li>
* <li>-23257352735276352753</li>
* </ul>
*/
@Component(service = PropertyConverter.class)
public class BigIntegerConverter implements PropertyConverter<BigInteger>{
/** The logger. */
private static final Logger LOG = Logger.getLogger(BigIntegerConverter.class.getName());
/** Converter used to decode hex, octal values. */
private final ByteConverter byteConverter = new ByteConverter();
@Override
public BigInteger convert(String value, ConversionContext context) {
context.addSupportedFormats(getClass(), "[-]0X.. (hex)", "[-]0x... (hex)", "<bigint> -> new BigInteger(bigint)");
String trimmed = Objects.requireNonNull(value).trim();
if(trimmed.startsWith("0x") || trimmed.startsWith("0X")){
LOG.finest("Parsing Hex value to BigInteger: " + value);
trimmed = trimmed.substring(2);
StringBuilder decimal = new StringBuilder();
for(int offset = 0;offset < trimmed.length();offset+=2){
if(offset==trimmed.length()-1){
LOG.finest("Invalid Hex-Byte-String: " + value);
return null;
}
byte val = byteConverter.convert("0x" + trimmed.substring(offset, offset + 2), context);
if(val<10){
decimal.append('0').append(val);
} else{
decimal.append(val);
}
}
return new BigInteger(decimal.toString());
} else if(trimmed.startsWith("-0x") || trimmed.startsWith("-0X")){
LOG.finest("Parsing Hex value to BigInteger: " + value);
trimmed = trimmed.substring(3);
StringBuilder decimal = new StringBuilder();
for(int offset = 0;offset < trimmed.length();offset+=2){
if(offset==trimmed.length()-1){
LOG.finest("Invalid Hex-Byte-String: " + trimmed);
return null;
}
byte val = byteConverter.convert("0x" + trimmed.substring(offset, offset + 2), context);
if(val<10){
decimal.append('0').append(val);
} else{
decimal.append(val);
}
}
return new BigInteger('-' + decimal.toString());
}
try{
return new BigInteger(trimmed);
} catch(Exception e){
LOG.log(Level.FINEST, "Failed to parse BigInteger from: " + value, e);
return null;
}
}
@Override
public boolean equals(Object o){
return getClass().equals(o.getClass());
}
@Override
public int hashCode(){
return getClass().hashCode();
}
}