parent
a7b5c8c36c
commit
ca5d3b0d03
@ -0,0 +1,11 @@ |
||||
package me.bearns.fias.exceptions; |
||||
|
||||
public class UnzipException extends Exception { |
||||
public UnzipException(Exception e){ |
||||
super(e); |
||||
} |
||||
|
||||
public UnzipException(String s) { |
||||
super(s); |
||||
} |
||||
} |
@ -1,43 +0,0 @@ |
||||
package me.bearns.fias.util; |
||||
|
||||
import me.bearns.fias.domain.FiasVersion; |
||||
import me.bearns.fias.service.Downloader; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
||||
import java.io.File; |
||||
import java.util.concurrent.ExecutionException; |
||||
import java.util.concurrent.Future; |
||||
|
||||
public class DownlodableUpdate { |
||||
|
||||
@Autowired |
||||
private static Downloader service; |
||||
|
||||
private final FiasVersion update; |
||||
private final Future<File> file; |
||||
|
||||
private static DownlodableUpdate process(FiasVersion ver, boolean reload) { |
||||
return new DownlodableUpdate(ver, service.download(reload ? ver.getFiasCompleteXmlUrl() : ver.getFiasDeltaXmlUrl())); |
||||
} |
||||
|
||||
public static DownlodableUpdate processReload(FiasVersion ver){ |
||||
return process(ver, true); |
||||
} |
||||
|
||||
public static DownlodableUpdate processUpdate(FiasVersion ver){ |
||||
return process(ver, false); |
||||
} |
||||
|
||||
private DownlodableUpdate(FiasVersion update, Future<File> file) { |
||||
this.update = update; |
||||
this.file = file; |
||||
} |
||||
|
||||
public File getFile() throws ExecutionException, InterruptedException { |
||||
return file.get(); |
||||
} |
||||
|
||||
public FiasVersion getVersion() { |
||||
return update; |
||||
} |
||||
} |
@ -0,0 +1,164 @@ |
||||
package me.bearns.fias.util; |
||||
|
||||
import me.bearns.fias.exceptions.UnzipException; |
||||
|
||||
import java.io.Closeable; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
import java.util.concurrent.locks.ReentrantLock; |
||||
import java.util.zip.ZipEntry; |
||||
import java.util.zip.ZipInputStream; |
||||
|
||||
public class ZipReader implements Closeable { |
||||
|
||||
private final InputStream in; |
||||
private final Set<String> set = new HashSet<>(); |
||||
private final ReentrantLock mutex = new ReentrantLock(); |
||||
|
||||
public ZipReader(InputStream in){ |
||||
this.in = in; |
||||
} |
||||
|
||||
public Set<String> list() throws UnzipException { |
||||
|
||||
if(set.isEmpty()) init(); |
||||
|
||||
return set; |
||||
|
||||
} |
||||
|
||||
public InputStream read(String file) throws UnzipException { |
||||
|
||||
if(file == null) throw new UnzipException("Filename in archive cannot be null"); |
||||
|
||||
mutex.lock(); |
||||
|
||||
InputStream retval = null; |
||||
ZipInputStream zis = null; |
||||
|
||||
try{ |
||||
zis = new ZipInputStream(in); |
||||
|
||||
ZipEntry zipEntry; |
||||
while ((zipEntry = zis.getNextEntry()) != null) { |
||||
|
||||
if(file.equals(zipEntry.getName())) { |
||||
//TODO
|
||||
retval = new FileStream(zis); |
||||
|
||||
} |
||||
zis.closeEntry(); |
||||
} |
||||
|
||||
} catch (IOException e) { |
||||
throw new UnzipException(e); |
||||
} finally { |
||||
if(retval == null) { |
||||
|
||||
mutex.unlock(); |
||||
|
||||
try { |
||||
if(zis!=null) zis.close(); |
||||
} catch (IOException e) { |
||||
//log
|
||||
} |
||||
|
||||
throw new UnzipException("File not found in archive"); |
||||
} |
||||
} |
||||
|
||||
return retval; |
||||
|
||||
} |
||||
|
||||
private synchronized void init() throws UnzipException { |
||||
|
||||
mutex.lock(); |
||||
|
||||
try(ZipInputStream zis = new ZipInputStream(in)){ |
||||
|
||||
ZipEntry zipEntry; |
||||
while ((zipEntry = zis.getNextEntry()) != null) { |
||||
|
||||
set.add(zipEntry.getName()); |
||||
zis.closeEntry(); |
||||
} |
||||
|
||||
} catch (IOException e) { |
||||
throw new UnzipException(e); |
||||
} finally { |
||||
mutex.unlock(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws IOException { |
||||
|
||||
mutex.unlock(); |
||||
|
||||
if(in!=null) { |
||||
in.close(); |
||||
} |
||||
} |
||||
|
||||
public class FileStream extends InputStream{ |
||||
|
||||
private ZipInputStream zis; |
||||
|
||||
public FileStream(ZipInputStream zis) { |
||||
this.zis = zis; |
||||
} |
||||
|
||||
@Override |
||||
public int read() throws IOException { |
||||
return zis.read(); |
||||
} |
||||
|
||||
@Override |
||||
public int read(byte[] b) throws IOException { |
||||
return zis.read(b); |
||||
} |
||||
|
||||
@Override |
||||
public int read(byte[] b, int off, int len) throws IOException { |
||||
return zis.read(b, off, len); |
||||
} |
||||
|
||||
@Override |
||||
public long skip(long n) throws IOException { |
||||
return zis.skip(n); |
||||
} |
||||
|
||||
@Override |
||||
public int available() throws IOException { |
||||
return zis.available(); |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws IOException { |
||||
try { |
||||
zis.closeEntry(); |
||||
zis.close(); |
||||
} finally { |
||||
mutex.unlock(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public synchronized void mark(int readlimit) { |
||||
zis.mark(readlimit); |
||||
} |
||||
|
||||
@Override |
||||
public synchronized void reset() throws IOException { |
||||
zis.reset(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean markSupported() { |
||||
return zis.markSupported(); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue