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