package Ġcom . be ust . k ob alt . archive Ċ Ċ import Ġcom . be ust . k ob alt . Glob Ċ import Ġcom . be ust . k ob alt . misc . K Files Ċ import Ġorg . apache . commons . compress . arch ivers . Archive Entry Ċ import Ġorg . apache . commons . compress . arch ivers . zip . Zip Archive Entry Ċ import Ġorg . apache . commons . compress . arch ivers . zip . Zip Archive OutputStream Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util . jar . Manifest Ċ import Ġorg . apache . commons . compress . arch ivers . zip . Zip File Ġas ĠApache Zip File Ċ Ċ /** Ċ Ġ* ĠAb straction Ġof Ġa Ġzip / jar / war Ġarchive Ġthat Ġautomatically Ġmanages Ġthe Ġaddition Ġof Ġexpanded Ġjar Ġfiles . Ċ Ġ* ĠUses ĠZip Archive OutputStream Ġfor Ġfast Ġinclusion Ġof Ġexpanded Ġjar Ġfiles . Ċ Ġ*/ Ċ class ĠMeta Archive ( outputFile : ĠFile , Ġval Ġmanifest : ĠManifest ?) Ġ: ĠClose able Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠMAN IFEST _ MF Ġ= Ġ" META - INF / MAN IFEST . MF " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġz os Ġ= ĠZip Archive OutputStream ( outputFile ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġencoding Ġ= Ġ" UTF - 8 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd File ( f : ĠFile , Ġentry File : ĠFile , Ġpath : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġf . normalize () ĊĠĠĠĠĠĠĠ ĠFileInputStream ( file ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Path Ġ= ĠK Files . fix Sl ashes ( if Ġ( path Ġ!= Ġnull ) Ġpath Ġ+ Ġentry File . path Ġelse Ġentry File . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZip Archive Entry ( actual Path ). let Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Add Entry ( entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Entry ( entry , ĠinputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Archive ( jar File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApache Zip File ( jar File ). use Ġ{ Ġjar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar Entries Ġ= Ġjar . entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġjar Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Add Entry ( entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz os . add Raw Archive Entry ( entry , Ġjar . getRaw InputStream ( entry )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ JAR _ EXCL UDE S Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lob (" META - INF /*. SF ", Ġ" META - INF /*. D SA ", Ġ" META - INF /*. RSA ") ĊĊĠĠĠ Ġprivate Ġval Ġseen Ġ= Ġhash Set Of < String >() ĊĊĠĠĠ Ġprivate Ġfun Ġok ToAdd ( name : ĠString ): ĠBoolean Ġ= Ġ! Ġseen . contains ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! ĠK Files . is Excluded ( name , ĠDEFAULT _ JAR _ EXCL UDE S ) ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( manifest Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create TempFile (" aaa ", Ġ" bbb "). to File (). let Ġ{ Ġmanifest File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( manifest File ). use Ġ{ Ġf os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest . write ( fos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġz os . create Archive Entry ( manifest File , ĠMeta Archive . MAN IFEST _ MF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Entry ( entry , ĠFileInputStream ( manifest File )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġz os . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Entry ( entry : ĠArchive Entry , ĠinputStream : ĠFileInputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġz os . put Archive Entry ( entry ) ĊĠĠĠĠĠĠĠ ĠinputStream . use Ġ{ Ġins Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġins . copy To ( zos , Ġ 5 0 Ġ* Ġ 1 0 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġz os . close Archive Entry () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmaybe Add Entry ( entry : ĠArchive Entry , Ġaction : () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ok ToAdd ( entry . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġseen . add ( entry . name ) ĊĠĠĠ Ġ} Ċ } Ċ