1 6 7 package de.schlichtherle.io.archive.spi; 8 9 import de.schlichtherle.io.archive.Archive; 10 import java.io.CharConversionException ; 11 import java.io.Serializable ; 12 import java.io.UnsupportedEncodingException ; 13 import java.lang.reflect.UndeclaredThrowableException ; 14 import java.nio.charset.Charset ; 15 import java.nio.charset.CharsetEncoder ; 16 import java.nio.charset.UnsupportedCharsetException ; 17 import javax.swing.Icon ; 18 19 30 public abstract class AbstractArchiveDriver 31 implements ArchiveDriver, Serializable { 32 33 private final String encoding; 34 35 41 private final transient ThreadLocalEncoder tlEncoder = new ThreadLocalEncoder(); 43 44 private final Icon openIcon; 45 46 private final Icon closedIcon; 47 48 53 protected AbstractArchiveDriver( 54 String encoding, 55 Icon openIcon, 56 Icon closedIcon) { 57 this.encoding = encoding; 58 this.openIcon = openIcon; 59 this.closedIcon = closedIcon; 60 61 67 try { 70 new String (new byte[0], encoding); 71 } catch (UnsupportedEncodingException uee) { 72 UnsupportedCharsetException uce 73 = new UnsupportedCharsetException (encoding); 74 uce.initCause(uee); 75 throw uce; 76 } 77 78 tlEncoder.get(); 83 } 84 85 92 public final String getEncoding() { 93 return encoding; 94 } 95 96 107 protected final void ensureEncodable(final String entryName) 108 throws CharConversionException { 109 if (!tlEncoder.canEncode(entryName)) 110 throw new CharConversionException (entryName + 111 ": Illegal characters in entry name!"); 112 } 113 114 public Icon getOpenIcon(Archive archive) { 115 return openIcon; 116 } 117 118 public Icon getClosedIcon(Archive archive) { 119 return closedIcon; 120 } 121 122 private final class ThreadLocalEncoder extends ThreadLocal { 123 protected Object initialValue() { 124 return Charset.forName(getEncoding()).newEncoder(); 125 } 126 127 130 131 public boolean canEncode(CharSequence cs) { 132 return ((CharsetEncoder ) get()).canEncode(cs); 133 } 134 } 135 } 136 | Popular Tags |