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

网格计算

开发平台:

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.hdfs.server.common;
  19. import java.io.IOException;
  20. import java.util.SortedSet;
  21. import java.util.TreeSet;
  22. import org.apache.hadoop.hdfs.protocol.FSConstants;
  23. import org.apache.hadoop.util.StringUtils;
  24. /**
  25.  * Collection of upgrade objects.
  26.  *
  27.  * Upgrade objects should be registered here before they can be used. 
  28.  */
  29. public class UpgradeObjectCollection {
  30.   static {
  31.     initialize();
  32.     // Registered distributed upgrade objects here
  33.     // registerUpgrade(new UpgradeObject());
  34.   }
  35.   static class UOSignature implements Comparable<UOSignature> {
  36.     int version;
  37.     HdfsConstants.NodeType type;
  38.     String className;
  39.     UOSignature(Upgradeable uo) {
  40.       this.version = uo.getVersion();
  41.       this.type = uo.getType();
  42.       this.className = uo.getClass().getCanonicalName();
  43.     }
  44.     int getVersion() {
  45.       return version;
  46.     }
  47.     HdfsConstants.NodeType getType() {
  48.       return type;
  49.     }
  50.     String getClassName() {
  51.       return className;
  52.     }
  53.     Upgradeable instantiate() throws IOException {
  54.       try {
  55.         return (Upgradeable)Class.forName(getClassName()).newInstance();
  56.       } catch(ClassNotFoundException e) {
  57.         throw new IOException(StringUtils.stringifyException(e));
  58.       } catch(InstantiationException e) {
  59.         throw new IOException(StringUtils.stringifyException(e));
  60.       } catch(IllegalAccessException e) {
  61.         throw new IOException(StringUtils.stringifyException(e));
  62.       }
  63.     }
  64.     public int compareTo(UOSignature o) {
  65.       if(this.version != o.version)
  66.         return (version < o.version ? -1 : 1);
  67.       int res = this.getType().toString().compareTo(o.getType().toString());
  68.       if(res != 0)
  69.         return res;
  70.       return className.compareTo(o.className);
  71.     }
  72.     public boolean equals(Object o) {
  73.         if (!(o instanceof UOSignature)) {
  74.           return false;
  75.         }
  76.         return this.compareTo((UOSignature)o) == 0;
  77.       }
  78.       public int hashCode() {
  79.         return version ^ ((type==null)?0:type.hashCode()) 
  80.                        ^ ((className==null)?0:className.hashCode());
  81.       }
  82.   }
  83.   /**
  84.    * Static collection of upgrade objects sorted by version.
  85.    * Layout versions are negative therefore newer versions will go first.
  86.    */
  87.   static SortedSet<UOSignature> upgradeTable;
  88.   static final void initialize() {
  89.     upgradeTable = new TreeSet<UOSignature>();
  90.   }
  91.   static void registerUpgrade(Upgradeable uo) {
  92.     // Registered distributed upgrade objects here
  93.     upgradeTable.add(new UOSignature(uo));
  94.   }
  95.   public static SortedSet<Upgradeable> getDistributedUpgrades(int versionFrom, 
  96.                                                        HdfsConstants.NodeType type
  97.                                                        ) throws IOException {
  98.     assert FSConstants.LAYOUT_VERSION <= versionFrom : "Incorrect version " 
  99.       + versionFrom + ". Expected to be <= " + FSConstants.LAYOUT_VERSION;
  100.     SortedSet<Upgradeable> upgradeObjects = new TreeSet<Upgradeable>();
  101.     for(UOSignature sig : upgradeTable) {
  102.       if(sig.getVersion() < FSConstants.LAYOUT_VERSION)
  103.         continue;
  104.       if(sig.getVersion() > versionFrom)
  105.         break;
  106.       if(sig.getType() != type )
  107.         continue;
  108.       upgradeObjects.add(sig.instantiate());
  109.     }
  110.     if(upgradeObjects.size() == 0)
  111.       return null;
  112.     return upgradeObjects;
  113.   }
  114. }