001/** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019package org.apache.hadoop.crypto.key; 020 021import java.io.IOException; 022import java.security.NoSuchAlgorithmException; 023import java.util.List; 024 025/** 026 * This is a utility class used to extend the functionality of KeyProvider, that 027 * takes a KeyProvider and an Extension. It implements all the required methods 028 * of the KeyProvider by delegating it to the provided KeyProvider. 029 */ 030public abstract class KeyProviderExtension 031<E extends KeyProviderExtension.Extension> extends KeyProvider { 032 033 /** 034 * A marker interface for the KeyProviderExtension subclass implement. 035 */ 036 public static interface Extension { 037 } 038 039 private KeyProvider keyProvider; 040 private E extension; 041 042 public KeyProviderExtension(KeyProvider keyProvider, E extensions) { 043 super(keyProvider.getConf()); 044 this.keyProvider = keyProvider; 045 this.extension = extensions; 046 } 047 048 protected E getExtension() { 049 return extension; 050 } 051 052 protected KeyProvider getKeyProvider() { 053 return keyProvider; 054 } 055 056 @Override 057 public boolean isTransient() { 058 return keyProvider.isTransient(); 059 } 060 061 @Override 062 public Metadata[] getKeysMetadata(String... names) throws IOException { 063 return keyProvider.getKeysMetadata(names); 064 } 065 066 @Override 067 public KeyVersion getCurrentKey(String name) throws IOException { 068 return keyProvider.getCurrentKey(name); 069 } 070 071 @Override 072 public KeyVersion createKey(String name, Options options) 073 throws NoSuchAlgorithmException, IOException { 074 return keyProvider.createKey(name, options); 075 } 076 077 @Override 078 public KeyVersion rollNewVersion(String name) 079 throws NoSuchAlgorithmException, IOException { 080 return keyProvider.rollNewVersion(name); 081 } 082 083 @Override 084 public KeyVersion getKeyVersion(String versionName) throws IOException { 085 return keyProvider.getKeyVersion(versionName); 086 } 087 088 @Override 089 public List<String> getKeys() throws IOException { 090 return keyProvider.getKeys(); 091 } 092 093 @Override 094 public List<KeyVersion> getKeyVersions(String name) throws IOException { 095 return keyProvider.getKeyVersions(name); 096 } 097 098 @Override 099 public Metadata getMetadata(String name) throws IOException { 100 return keyProvider.getMetadata(name); 101 } 102 103 @Override 104 public KeyVersion createKey(String name, byte[] material, Options options) 105 throws IOException { 106 return keyProvider.createKey(name, material, options); 107 } 108 109 @Override 110 public void deleteKey(String name) throws IOException { 111 keyProvider.deleteKey(name); 112 } 113 114 @Override 115 public KeyVersion rollNewVersion(String name, byte[] material) 116 throws IOException { 117 return keyProvider.rollNewVersion(name, material); 118 } 119 120 @Override 121 public void flush() throws IOException { 122 keyProvider.flush(); 123 } 124 125 @Override 126 public String toString() { 127 return getClass().getSimpleName() + ": " + keyProvider.toString(); 128 } 129}