content: package net.lingala.zip4j.unzip;
  
  import java.io.File;
  
  import net.lingala.zip4j.exception.ZipException;
  import net.lingala.zip4j.model.FileHeader;
  import net.lingala.zip4j.model.UnzipParameters;
  import net.lingala.zip4j.util.InternalZipConstants;
  import net.lingala.zip4j.util.Zip4jUtil;
  
  public class UnzipUtil {
  	
  	public static void applyFileAttributes(FileHeader fileHeader, File file) throws ZipException {
  		applyFileAttributes(fileHeader, file, null);
  	}
  	
  	public static void applyFileAttributes(FileHeader fileHeader, File file,
  			UnzipParameters unzipParameters) throws ZipException{
  		
  		if (fileHeader == null) {
  			throw new ZipException("cannot set file properties: file header is null");
  		}
  		
  		if (file == null) {
  			throw new ZipException("cannot set file properties: output file is null");
  		}
  		
  		if (!Zip4jUtil.checkFileExists(file)) {
  			throw new ZipException("cannot set file properties: file doesnot exist");
  		}
  		
  		if (unzipParameters == null || !unzipParameters.isIgnoreDateTimeAttributes()) {
  			setFileLastModifiedTime(fileHeader, file);
  		}
  		
  		if (unzipParameters == null) {
  			setFileAttributes(fileHeader, file, true, true, true, true);
  		} else {
  			if (unzipParameters.isIgnoreAllFileAttributes()) {
  				setFileAttributes(fileHeader, file, false, false, false, false);
  			} else {
  				setFileAttributes(fileHeader, file, !unzipParameters.isIgnoreReadOnlyFileAttribute(),
  						!unzipParameters.isIgnoreHiddenFileAttribute(), 
  						!unzipParameters.isIgnoreArchiveFileAttribute(),
  						!unzipParameters.isIgnoreSystemFileAttribute());
  			}
  		}
  	}
  	
  	private static void setFileAttributes(FileHeader fileHeader, File file, boolean setReadOnly, 
  			boolean setHidden, boolean setArchive, boolean setSystem) throws ZipException {
  		if (fileHeader == null) {
  			throw new ZipException("invalid file header. cannot set file attributes");
  		}
  		
  		byte[] externalAttrbs = fileHeader.getExternalFileAttr();
  		if (externalAttrbs == null) {
  			return;
  		}
  		
  		int atrrib = externalAttrbs[0];
  		switch (atrrib) {
  		case InternalZipConstants.FILE_MODE_READ_ONLY:
  			if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
  			break;
  		case InternalZipConstants.FILE_MODE_HIDDEN:
  		case InternalZipConstants.FOLDER_MODE_HIDDEN:
  			if (setHidden) Zip4jUtil.setFileHidden(file);
  			break;
  		case InternalZipConstants.FILE_MODE_ARCHIVE:
  		case InternalZipConstants.FOLDER_MODE_ARCHIVE:
  			if (setArchive) Zip4jUtil.setFileArchive(file);
  			break;
  		case InternalZipConstants.FILE_MODE_READ_ONLY_HIDDEN:
  			if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
  			if (setHidden) Zip4jUtil.setFileHidden(file);
  			break;
  		case InternalZipConstants.FILE_MODE_READ_ONLY_ARCHIVE:
  			if (setArchive) Zip4jUtil.setFileArchive(file);
  			if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
  			break;
  		case InternalZipConstants.FILE_MODE_HIDDEN_ARCHIVE:
  		case InternalZipConstants.FOLDER_MODE_HIDDEN_ARCHIVE:
  			if (setArchive) Zip4jUtil.setFileArchive(file);
  			if (setHidden) Zip4jUtil.setFileHidden(file);
  			break;
  		case InternalZipConstants.FILE_MODE_READ_ONLY_HIDDEN_ARCHIVE:
  			if (setArchive) Zip4jUtil.setFileArchive(file);
  			if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
  			if (setHidden) Zip4jUtil.setFileHidden(file);
  			break;
  		case InternalZipConstants.FILE_MODE_SYSTEM:
  			if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
  			if (setHidden) Zip4jUtil.setFileHidden(file);
  			if (setSystem) Zip4jUtil.setFileSystemMode(file);
  			break;
  		default:
  			//do nothing
  			break;
  		}
  	}
  	
  	private static void setFileLastModifiedTime(FileHeader fileHeader, File file) throws ZipException {
  		if (fileHeader.getLastModFileTime() <= 0) {
  			return;
  		}
  		
  		if (file.exists()) {
  			file.setLastModified(Zip4jUtil.dosToJavaTme(fileHeader.getLastModFileTime()));
  		}
  	}
  	
  }
  