AbstractMapWritable.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:7k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Copyright 2007 The Apache Software Foundation
  3.  *
  4.  * Licensed to the Apache Software Foundation (ASF) under one
  5.  * or more contributor license agreements.  See the NOTICE file
  6.  * distributed with this work for additional information
  7.  * regarding copyright ownership.  The ASF licenses this file
  8.  * to you under the Apache License, Version 2.0 (the
  9.  * "License"); you may not use this file except in compliance
  10.  * with the License.  You may obtain a copy of the License at
  11.  *
  12.  *     http://www.apache.org/licenses/LICENSE-2.0
  13.  *
  14.  * Unless required by applicable law or agreed to in writing, software
  15.  * distributed under the License is distributed on an "AS IS" BASIS,
  16.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17.  * See the License for the specific language governing permissions and
  18.  * limitations under the License.
  19.  */
  20. package org.apache.hadoop.io;
  21. import java.io.DataInput;
  22. import java.io.DataOutput;
  23. import java.io.IOException;
  24. import java.util.Map;
  25. import java.util.concurrent.ConcurrentHashMap;
  26. import java.util.concurrent.atomic.AtomicReference;
  27. import org.apache.hadoop.conf.Configurable;
  28. import org.apache.hadoop.conf.Configuration;
  29. /**
  30.  * Abstract base class for MapWritable and SortedMapWritable
  31.  * 
  32.  * Unlike org.apache.nutch.crawl.MapWritable, this class allows creation of
  33.  * MapWritable<Writable, MapWritable> so the CLASS_TO_ID and ID_TO_CLASS
  34.  * maps travel with the class instead of being static.
  35.  * 
  36.  * Class ids range from 1 to 127 so there can be at most 127 distinct classes
  37.  * in any specific map instance.
  38.  */
  39. public abstract class AbstractMapWritable implements Writable, Configurable {
  40.   private AtomicReference<Configuration> conf;
  41.   
  42.   /* Class to id mappings */
  43.   private Map<Class, Byte> classToIdMap = new ConcurrentHashMap<Class, Byte>();
  44.   
  45.   /* Id to Class mappings */
  46.   private Map<Byte, Class> idToClassMap = new ConcurrentHashMap<Byte, Class>();
  47.   
  48.   /* The number of new classes (those not established by the constructor) */
  49.   private volatile byte newClasses = 0;
  50.   
  51.   /** @return the number of known classes */
  52.   byte getNewClasses() {
  53.     return newClasses;
  54.   }
  55.   /**
  56.    * Used to add "predefined" classes and by Writable to copy "new" classes.
  57.    */
  58.   private synchronized void addToMap(Class clazz, byte id) {
  59.     if (classToIdMap.containsKey(clazz)) {
  60.       byte b = classToIdMap.get(clazz);
  61.       if (b != id) {
  62.         throw new IllegalArgumentException ("Class " + clazz.getName() +
  63.           " already registered but maps to " + b + " and not " + id);
  64.       }
  65.     }
  66.     if (idToClassMap.containsKey(id)) {
  67.       Class c = idToClassMap.get(id);
  68.       if (!c.equals(clazz)) {
  69.         throw new IllegalArgumentException("Id " + id + " exists but maps to " +
  70.             c.getName() + " and not " + clazz.getName());
  71.       }
  72.     }
  73.     classToIdMap.put(clazz, id);
  74.     idToClassMap.put(id, clazz);
  75.   }
  76.   
  77.   /** Add a Class to the maps if it is not already present. */ 
  78.   protected synchronized void addToMap(Class clazz) {
  79.     if (classToIdMap.containsKey(clazz)) {
  80.       return;
  81.     }
  82.     if (newClasses + 1 > Byte.MAX_VALUE) {
  83.       throw new IndexOutOfBoundsException("adding an additional class would" +
  84.       " exceed the maximum number allowed");
  85.     }
  86.     byte id = ++newClasses;
  87.     addToMap(clazz, id);
  88.   }
  89.   /** @return the Class class for the specified id */
  90.   protected Class getClass(byte id) {
  91.     return idToClassMap.get(id);
  92.   }
  93.   /** @return the id for the specified Class */
  94.   protected byte getId(Class clazz) {
  95.     return classToIdMap.containsKey(clazz) ? classToIdMap.get(clazz) : -1;
  96.   }
  97.   /** Used by child copy constructors. */
  98.   protected synchronized void copy(Writable other) {
  99.     if (other != null) {
  100.       try {
  101.         DataOutputBuffer out = new DataOutputBuffer();
  102.         other.write(out);
  103.         DataInputBuffer in = new DataInputBuffer();
  104.         in.reset(out.getData(), out.getLength());
  105.         readFields(in);
  106.         
  107.       } catch (IOException e) {
  108.         throw new IllegalArgumentException("map cannot be copied: " +
  109.             e.getMessage());
  110.       }
  111.       
  112.     } else {
  113.       throw new IllegalArgumentException("source map cannot be null");
  114.     }
  115.   }
  116.   
  117.   /** constructor. */
  118.   protected AbstractMapWritable() {
  119.     this.conf = new AtomicReference<Configuration>();
  120.     addToMap(ArrayWritable.class,
  121.         Byte.valueOf(Integer.valueOf(-127).byteValue())); 
  122.     addToMap(BooleanWritable.class,
  123.         Byte.valueOf(Integer.valueOf(-126).byteValue()));
  124.     addToMap(BytesWritable.class,
  125.         Byte.valueOf(Integer.valueOf(-125).byteValue()));
  126.     addToMap(FloatWritable.class,
  127.         Byte.valueOf(Integer.valueOf(-124).byteValue()));
  128.     addToMap(IntWritable.class,
  129.         Byte.valueOf(Integer.valueOf(-123).byteValue()));
  130.     addToMap(LongWritable.class,
  131.         Byte.valueOf(Integer.valueOf(-122).byteValue()));
  132.     addToMap(MapWritable.class,
  133.         Byte.valueOf(Integer.valueOf(-121).byteValue()));
  134.     addToMap(MD5Hash.class,
  135.         Byte.valueOf(Integer.valueOf(-120).byteValue()));
  136.     addToMap(NullWritable.class,
  137.         Byte.valueOf(Integer.valueOf(-119).byteValue()));
  138.     addToMap(ObjectWritable.class,
  139.         Byte.valueOf(Integer.valueOf(-118).byteValue()));
  140.     addToMap(SortedMapWritable.class,
  141.         Byte.valueOf(Integer.valueOf(-117).byteValue()));
  142.     addToMap(Text.class,
  143.         Byte.valueOf(Integer.valueOf(-116).byteValue()));
  144.     addToMap(TwoDArrayWritable.class,
  145.         Byte.valueOf(Integer.valueOf(-115).byteValue()));
  146.     
  147.     // UTF8 is deprecated so we don't support it
  148.     addToMap(VIntWritable.class,
  149.         Byte.valueOf(Integer.valueOf(-114).byteValue()));
  150.     addToMap(VLongWritable.class,
  151.         Byte.valueOf(Integer.valueOf(-113).byteValue()));
  152.   }
  153.   /** @return the conf */
  154.   public Configuration getConf() {
  155.     return conf.get();
  156.   }
  157.   /** @param conf the conf to set */
  158.   public void setConf(Configuration conf) {
  159.     this.conf.set(conf);
  160.   }
  161.   
  162.   /** {@inheritDoc} */
  163.   public void write(DataOutput out) throws IOException {
  164.     
  165.     // First write out the size of the class table and any classes that are
  166.     // "unknown" classes
  167.     
  168.     out.writeByte(newClasses);
  169.     for (byte i = 1; i <= newClasses; i++) {
  170.       out.writeByte(i);
  171.       out.writeUTF(getClass(i).getName());
  172.     }
  173.   }
  174.   
  175.   /** {@inheritDoc} */
  176.   public void readFields(DataInput in) throws IOException {
  177.     
  178.     // Get the number of "unknown" classes
  179.     
  180.     newClasses = in.readByte();
  181.     
  182.     // Then read in the class names and add them to our tables
  183.     
  184.     for (int i = 0; i < newClasses; i++) {
  185.       byte id = in.readByte();
  186.       String className = in.readUTF();
  187.       try {
  188.         addToMap(Class.forName(className), id);
  189.         
  190.       } catch (ClassNotFoundException e) {
  191.         throw new IOException("can't find class: " + className + " because "+
  192.             e.getMessage());
  193.       }
  194.     }
  195.   }    
  196. }