| /* |
| * Copyright (c) 2011 Google Inc. |
| * |
| * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse |
| * Public License v1.0 which accompanies this distribution, and is available at |
| * |
| * http://www.eclipse.org/legal/epl-v10.html |
| */ |
| package com.google.eclipse.protobuf.conversion; |
| |
| import static org.eclipse.xtext.util.Strings.isEmpty; |
| |
| import java.math.BigInteger; |
| |
| import org.eclipse.xtext.conversion.ValueConverterException; |
| import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter; |
| import org.eclipse.xtext.nodemodel.INode; |
| |
| /** |
| * Converts hexadecimal numbers to {@code long}s. |
| * |
| * @author alruiz@google.com (Alex Ruiz) |
| */ |
| public class HEXValueConverter extends AbstractLexerBasedConverter<Long> { |
| private static final String[] VALID_PREFIXES = { "0x", "-0x", "0X", "-0X" }; |
| |
| /** |
| * Creates an {@code int} from the given input, if the given input represents an hexadecimal number. |
| * @param string the given input. |
| * @param node the parsed node including hidden parts. |
| * @return the new {@code int}. |
| * @throws ValueConverterException if the given input is {@code null}, empty or does not represent an hexadecimal |
| * number. |
| */ |
| @Override public Long toValue(String string, INode node) throws ValueConverterException { |
| if (isEmpty(string)) { |
| throw new ValueConverterException("Couldn't convert empty string to long.", node, null); |
| } |
| if (!startsWithValidPrefix(string)) { |
| throw parsingError(string, node); |
| } |
| String withoutZeroX = removeZeroX(string); |
| try { |
| BigInteger value = new BigInteger(withoutZeroX, 16); |
| long longValue = value.longValue(); |
| return longValue != -1 ? longValue : 1L; |
| } catch (NumberFormatException e) { |
| throw parsingError(string, node, e); |
| } |
| } |
| |
| private boolean startsWithValidPrefix(String string) { |
| for (String prefix : VALID_PREFIXES) { |
| if (string.startsWith(prefix)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| private String removeZeroX(String string) { |
| if (string.startsWith("-")) { |
| String withoutSign = string.substring(3, string.length()); |
| return "-" + withoutSign; |
| } |
| return string.substring(2, string.length()); |
| } |
| |
| private ValueConverterException parsingError(String string, INode node) { |
| return parsingError(string, node, null); |
| } |
| |
| private ValueConverterException parsingError(String string, INode node, Exception cause) { |
| return new ValueConverterException("Couldn't convert '" + string + "' to long.", node, cause); |
| } |
| } |