Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  DivConq
  #
  #  http://divconq.com/
  #
  #  Copyright:
  #    Copyright 2014 eTimeline, LLC. All rights reserved.
  #
 #  License:
 #    See the license.txt file in the project's top-level directory for details.
 #
 #  Authors:
 #    * Andy White
 #
 ************************************************************************ */
 package divconq.io.stream;
 
 
 
 
 
 public class TarStream extends BaseStream implements IStreamSource {
     protected CyclingByteBufferOutputStream bstream = null;
     protected TarArchiveOutputStream tstream = null;
     protected boolean archiveopenflag = false;
     protected boolean finalflag = false;
     protected String nameHint = null;
     protected String lastpath = null;
     
     public TarStream() {
     }
     
     public TarStream withNameHint(String v) {
     	this. = v;
     	return this;
     }
 
 	public void init(StackEntry stackXElement el) {
 		this. = stack.stringFromElement(el"NameHint");
 	}
 
     public void close() {
 		//System.out.println("Tar killed");	// TODO
 		
     	if (this. != null)
 			try {
 				this..close();
 			} 
     		catch (IOException x) {
 			}
     	
     	this. = null;
     	this. = null;
     
     	super.close();
     }
     
 	// make sure we don't return without first releasing the file reference content
     @Override
     public HandleReturn handle(TaskRun cbStreamMessage msg) {
     	if (msg == .) {
     		if (this. == null
         		return this..handle(cbmsg);
     			
     		this. = true;
     	}
     	
     	// I don't think tar cares about folder entries at this stage - tar is for file content only
     	// folder scanning is upstream in the FileSourceStream and partners
     	if (msg.isFolder())
     		return .;
     	
     	// init if not set for this round of processing 
     	if (this. == null) {
     		this. = new CyclingByteBufferOutputStream();
             this. = new TarArchiveOutputStream(this.);
     	}
         
     	ByteBuf in = msg.getPayload();
         ByteBuf out = null
     	
         // always allow for a header (512) and/or footer (1024) in addition to content
         int sizeEstimate = (in != null) ? in.readableBytes() + 2048 : 2048;
         out = ..getBufferAllocator().heapBuffer(sizeEstimate);
    	
        this..installBuffer(out);
        
        // TODO if there is no output available to send and not EOF then just request more,
        // no need to send a message that is empty and not EOF
        
		if (StringUtil.isNotEmpty(this.)) {
			blk.setPath(this.);
		}
		else {
			if (msg.getPath() != null
				this. = "/" + (StringUtil.isNotEmpty(this.) ? this. : msg.getPath().getFileName()) + ".tar"
			else if (StringUtil.isNotEmpty(this.))
				this. = "/" + this. + ".tar";
			else
				this. = "/" + FileUtil.randomFilename() + ".tar";
			blk.setPath(this.);
		}
    	
    	if (!this. && !this.) {
    		TarArchiveEntry tentry = new TarArchiveEntry(msg.getPath().toString().substring(1), true);		
    		tentry.setSize(msg.getFileSize());
    		tentry.setModTime(msg.getModified());
    		
    		try {
    		catch (IOException x) {
    			if (in != null)
    				in.release();
    			
				out.release();
				cb.kill("Problem writing tar entry: " + x);
			}
    		
    		this. = true;
    	}
    	if (in != null)
			try {
				this..write(in.array(), in.arrayOffset(), in.writerIndex());
			catch (IOException x) {
				in.release();
				out.release();
				cb.kill("Problem writing tar body: " + x);
			}
        if (msg.isEof()) {
        	try {
		        this..closeArchiveEntry();
			catch (IOException x) {
    			if (in != null)
    				in.release();
    			
				out.release();
				cb.kill("Problem closing tar entry: " + x);
			}
    		
    		this. = false;
        }
        
        if (in != null)
        	in.release();
        
    	if (msg == .) {			
        	blk.setEof(true);
        	
        	try {
		        this..close();
			catch (IOException x) {
				//in.release();
				out.release();
				cb.kill("Problem closing tar stream: " + x);
			}
        	
    		this. = null;
    		this. = null;
    	}
    	else
    		this..uninstallBuffer();		// we are done with out forever, don't reference it
    	
		blk.setPayload(out);
		..println("tar sending: " + out.readableBytes());
       	HandleReturn v = this..handle(cbblk);
       	
       	if (!this.)
       		return v;
       	
       	if (v == .)
    		return this..handle(cb.);
       		
       	return .;
    }
    
    @Override
    public void request(TaskRun cb) {
    	if (this.) {
    		return;
    	}
    	
    	this..request(cb);
    }
New to GrepCode? Check out our FAQ X