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

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.io;
  19. import java.util.HashMap;
  20. import java.io.IOException;
  21. import org.apache.hadoop.conf.Configuration;
  22. /** Utility to permit renaming of Writable implementation classes without
  23.  * invalidiating files that contain their class name.
  24.  */
  25. public class WritableName {
  26.   private static HashMap<String, Class<?>> NAME_TO_CLASS =
  27.     new HashMap<String, Class<?>>();
  28.   private static HashMap<Class<?>, String> CLASS_TO_NAME =
  29.     new HashMap<Class<?>, String>();
  30.   static {                                        // define important types
  31.     WritableName.setName(NullWritable.class, "null");
  32.     WritableName.setName(LongWritable.class, "long");
  33.     WritableName.setName(UTF8.class, "UTF8");
  34.     WritableName.setName(MD5Hash.class, "MD5Hash");
  35.   }
  36.   private WritableName() {}                      // no public ctor
  37.   /** Set the name that a class should be known as to something other than the
  38.    * class name. */
  39.   public static synchronized void setName(Class writableClass, String name) {
  40.     CLASS_TO_NAME.put(writableClass, name);
  41.     NAME_TO_CLASS.put(name, writableClass);
  42.   }
  43.   /** Add an alternate name for a class. */
  44.   public static synchronized void addName(Class writableClass, String name) {
  45.     NAME_TO_CLASS.put(name, writableClass);
  46.   }
  47.   /** Return the name for a class.  Default is {@link Class#getName()}. */
  48.   public static synchronized String getName(Class writableClass) {
  49.     String name = CLASS_TO_NAME.get(writableClass);
  50.     if (name != null)
  51.       return name;
  52.     return writableClass.getName();
  53.   }
  54.   /** Return the class for a name.  Default is {@link Class#forName(String)}.*/
  55.   public static synchronized Class<?> getClass(String name, Configuration conf
  56.                                             ) throws IOException {
  57.     Class<?> writableClass = NAME_TO_CLASS.get(name);
  58.     if (writableClass != null)
  59.       return writableClass.asSubclass(Writable.class);
  60.     try {
  61.       return conf.getClassByName(name);
  62.     } catch (ClassNotFoundException e) {
  63.       IOException newE = new IOException("WritableName can't load class: " + name);
  64.       newE.initCause(e);
  65.       throw newE;
  66.     }
  67.   }
  68. }