/*
* Copyright 2009-2010 Shashank Tulsyan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* File: MonitoredRealFile.java
* Author: Shashank Tulsyan
*/
package neembuu.vfs.test;
import java.io.IOException;
import java.util.logging.Logger;
import jpfm.AccessLevel;
import jpfm.DirectoryStream;
import jpfm.FileDescriptor;
import jpfm.FileFlags;
import jpfm.FileId;
import jpfm.FileType;
import jpfm.annotations.NonBlocking;
import jpfm.fs.ReadOnlyRawFileData;
import jpfm.operations.readwrite.ReadRequest;
import jpfm.util.ReadUtils;
import jpfm.volume.CascadableAbstractFile;
import jpfm.volume.RealFile;
import jpfm.volume.RealFileProvider;
import neembuu.rangearray.RangeArray;
import neembuu.rangearray.RangeArrayFactory;
import neembuu.rangearray.RangeArrayParams;
import neembuu.rangearray.UIRangeArrayAccess;
/**
*
* @author Shashank Tulsyan
*/
public class MonitoredRealFile implements MonitorableNonHttpFile, CascadableAbstractFile{
private final RangeArray requestedRegion;
private MonitoredFilePanel filePanel;
public final Logger logger;
private final RealFile realFile;
public MonitoredRealFile(String srcfile,DirectoryStream fileContainer) throws IOException{
this(new java.io.File(srcfile), fileContainer);
}
public MonitoredRealFile(java.io.File srcfile,DirectoryStream fileContainer) throws IOException{
realFile = RealFileProvider.getNonBlockingRealFile(srcfile.getAbsolutePath());
requestedRegion = RangeArrayFactory.newDefaultRangeArray(
new RangeArrayParams.Builder()
.build() );
requestedRegion.setFileSize(realFile.getFileSize());
logger = Logger.getLogger(realFile.getName());
filePanel = new MonitoredFilePanel(this);
//this(Paths.get(srcfile),fileContainer);
}
@Override
@NonBlocking
public void read(ReadRequest read) throws Exception {
//System.gc();
//logger.log(Level.INFO,"requested=\t"+read.getFileOffset() +"\t"+ read.getByteBuffer().capacity() );
requestedRegion.addElement(read.getFileOffset(), ReadUtils.endingOffset(read), null);
realFile.read(read);
//super.read(read);
//reading is quick as source is real
int x = 0;
while(!read.isCompleted()){
x++;
try{
Thread.sleep(100);
}catch(Exception any){
any.printStackTrace();
}
if(x>5)System.out.println("waiting...in"+this+" with req="+read);
}
//logger.log(Level.INFO,"completed=\t"+read.getFileOffset() +"\t"+ ContentPeek.generatePeekString(read));
}
@Override
public UIRangeArrayAccess getRequestedRegion() {
return requestedRegion;
}
public MonitoredFilePanel getFilePanel() {
return filePanel;
}
public Logger getLogger(){
return logger;
}
@Override
public void open() {
realFile.open();
}
public final boolean isOpen(){
return realFile.getFileDescriptor().isOpen();
}
@Override
public void close() {
realFile.close();
}
@Override
public final FileType getFileType() {
return realFile.getFileType();
}
@Override
public final FileDescriptor getFileDescriptor() {
return realFile.getFileDescriptor();
}
@Override
public final long getFileSize() {
return realFile.getFileSize();
}
@Override
public final long getCreateTime() {
return realFile.getCreateTime();
}
@Override
public final long getAccessTime() {
return realFile.getAccessTime();
}
@Override
public final long getWriteTime() {
return realFile.getWriteTime();
}
@Override
public final long getChangeTime() {
return realFile.getChangeTime();
}
@Override
public final String getName() {
return realFile.getName();
}
@Override
public final FileDescriptor getParentFileDescriptor() {
return realFile.getParentFileDescriptor();
}
@Override
public final FileFlags getFileFlags() {
return realFile.getFileFlags();
}
@Override
public final boolean isOpenByCascading() {
return realFile.isOpenByCascading();
}
@Override
public final void setCannotClose(boolean cannotClose) {
realFile.setCannotClose(cannotClose);
}
@Override
public final ReadOnlyRawFileData getReference(FileId fileId, AccessLevel level) {
return realFile.getReference(fileId, level);
}
@Override
public final DirectoryStream getParent() {
return realFile.getParent();
}
}