/* * 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.hadoop.chukwa.util; public class RecordConstants { static final char[] CTRL_A = { '\u0001' }; static final char[] CTRL_B = { '\u0002' }; static final char[] CTRL_C = { '\u0003' }; static final char[] CTRL_D = { '\u0004' }; // public static final String FIELD_SEPARATOR = new String(CTRL_A); public static final String DEFAULT_FIELD_SEPARATOR = "-#-"; public static final String DEFAULT_RECORD_SEPARATOR = "\n"; public static final String RECORD_SEPARATOR_ESCAPE_SEQ = new String(CTRL_D);// may // want // this // to // be // very // obscure // , // e // . // g // . // new // String // ( // CTRL_B // ) // + // new // String // ( // CTRL_C // ) // + // new // String // ( // CTRL_D // ) /** * Insert the default chukwa escape sequence in <code>record</code> before all * occurances of <code>recordSeparator</code> <i>except</i> the final one if * the final record separator occurs at the end of the <code>record</code> * * @param recordSeparator The record separator that we are escaping. This is * chunk source application specific * @param record The string representing the entire record, including the * final record delimiter * @return The string with appropriate <code>recordSeparator</code>s escaped */ public static String escapeAllButLastRecordSeparator(String recordSeparator, String record) { String escapedRecord = ""; if (record.endsWith(recordSeparator)) { escapedRecord = record.substring(0, record.length() - recordSeparator.length()).replaceAll( recordSeparator, RECORD_SEPARATOR_ESCAPE_SEQ + recordSeparator) + recordSeparator; } return escapedRecord; } /** * Insert the default chukwa escape sequence in <code>record</code> before all * occurances of <code>recordSeparator</code>. This is assuming that you are * not passing the final record separator in with the <code>record</code>, * because it would be escaped too. * * @param recordSeparator The record separator that we are escaping. This is * chunk source application specific * @param record The string representing the entire record, including the * final record delimiter * @return The string with all <code>recordSeparator</code>s escaped */ public static String escapeAllRecordSeparators(String recordSeparator, String record) { return record.replaceAll(recordSeparator, RECORD_SEPARATOR_ESCAPE_SEQ + recordSeparator); } public static String recoverRecordSeparators(String recordSeparator, String record) { return record.replaceAll(RECORD_SEPARATOR_ESCAPE_SEQ + recordSeparator, recordSeparator); } }