content: /*
   * 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.extraction.engine;
  
  
  import java.nio.charset.Charset;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.Set;
  import java.util.TreeMap;
  
  import org.apache.hadoop.record.Buffer;
  
  public class ChukwaRecord extends ChukwaRecordJT implements Record {
    public ChukwaRecord() {
    }
  
    public void add(String key, String value) {
      synchronized (this) {
        if (this.mapFields == null) {
          this.mapFields = new TreeMap<String, Buffer>();
        }
      }
      this.mapFields.put(key, new Buffer(value.getBytes(Charset.forName("UTF-8"))));
    }
  
    public String[] getFields() {
      return this.mapFields.keySet().toArray(new String[0]);
    }
  
    public String getValue(String field) {
      if (this.mapFields.containsKey(field)) {
        return new String(this.mapFields.get(field).get(), Charset.forName("UTF-8"));
      } else {
        return null;
      }
    }
  
    public boolean containsField(String field) {
      return this.mapFields.containsKey(field);
    }
  
    public void removeValue(String field) {
      if (this.mapFields.containsKey(field)) {
        this.mapFields.remove(field);
      }
    }
  
    @Override
    public String toString() {
      Set<Map.Entry<String, Buffer>> f = this.mapFields.entrySet();
      Iterator<Map.Entry<String, Buffer>> it = f.iterator();
  
      Map.Entry<String, Buffer> entry = null;
      StringBuilder sb = new StringBuilder();
      sb.append("<event  ");
      StringBuilder body = new StringBuilder();
  
      String key = null;
      String val = null;
      boolean hasBody = false;
      String bodyVal = null;
      while (it.hasNext()) {
        entry = it.next();
        key = entry.getKey().intern();
        val = new String(entry.getValue().get(), Charset.forName("UTF-8"));
        if (key.intern() == Record.bodyField.intern()) {
          hasBody = true;
          bodyVal = val;
        } else {
          sb.append(key).append("=\"").append(val).append("\" ");
          body.append(key).append(" = ").append(val).append("<br>");
        }
  
      }
      if (hasBody) {
        sb.append(">").append(bodyVal);
      } else {
        sb.append(">").append(body);
      }
      sb.append("</event>");
  
      return sb.toString();
    }
  
  }
  