|  | /* | 
|  | * 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 java.util.regex.Pattern.compile; | 
|  | import static org.eclipse.xtext.util.Strings.*; | 
|  |  | 
|  | import java.util.regex.Pattern; | 
|  |  | 
|  | import org.eclipse.xtext.conversion.ValueConverterException; | 
|  | import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter; | 
|  | import org.eclipse.xtext.nodemodel.INode; | 
|  |  | 
|  | /** | 
|  | * Converts multi-line strings to {@code String}s. | 
|  | * | 
|  | * @author alruiz@google.com (Alex Ruiz) | 
|  | */ | 
|  | public class STRINGValueConverter extends AbstractLexerBasedConverter<String> { | 
|  |  | 
|  | private static final Pattern LINE_BREAK = compile("\"[\t\r\n]+\"|'[\t\r\n]+'"); | 
|  |  | 
|  | @Override | 
|  | protected String toEscapedString(String value) { | 
|  | if (value == null) return null; | 
|  | return '"' + convertToJavaString(removeLineBreaksFrom(value), false) + '"'; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Creates a {@code String} from the given input, if the given input represents a multi-line string. | 
|  | * @param string the given input. | 
|  | * @param node the parsed node including hidden parts. | 
|  | * @return the new integer. | 
|  | * @throws ValueConverterException if the given input has illegal characters. | 
|  | */ | 
|  | @Override public String toValue(String string, INode node) throws ValueConverterException { | 
|  | if (string == null) return null; | 
|  | try { | 
|  | String clean = removeLineBreaksFrom(string).trim(); | 
|  | return convertToJavaString(clean.substring(1, clean.length() - 1), true); | 
|  | } catch (IllegalArgumentException e) { | 
|  | throw parsingError(string, node, e); | 
|  | } | 
|  | } | 
|  |  | 
|  | private static String removeLineBreaksFrom(String s) { | 
|  | if (isEmpty(s)) return s; | 
|  | return LINE_BREAK.matcher(s).replaceAll(""); | 
|  | } | 
|  |  | 
|  | private ValueConverterException parsingError(String string, INode node, Exception cause) { | 
|  | return new ValueConverterException("Couldn't convert '" + string + "' to String.", node, cause); | 
|  | } | 
|  | } |