package com.akjava.gwt.html5test.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.akjava.gwt.html5.client.file.Blob;
import com.akjava.gwt.html5.client.file.DirectoryReader;
import com.akjava.gwt.html5.client.file.File;
import com.akjava.gwt.html5.client.file.FileError;
import com.akjava.gwt.html5.client.file.FileHandler;
import com.akjava.gwt.html5.client.file.FileIOUtils;
import com.akjava.gwt.html5.client.file.FileIOUtils.GetFileSystemListener;
import com.akjava.gwt.html5.client.file.FileIOUtils.MakeDirectoryCallback;
import com.akjava.gwt.html5.client.file.FileIOUtils.ReadStringCallback;
import com.akjava.gwt.html5.client.file.FileIOUtils.RequestPersitentFileQuotaListener;
import com.akjava.gwt.html5.client.file.FileIOUtils.WriteCallback;
import com.akjava.gwt.html5.client.file.FileReader;
import com.akjava.gwt.html5.client.file.FileSystem;
import com.akjava.gwt.html5.client.file.FileUploadForm;
import com.akjava.gwt.html5.client.file.FileUtils;
import com.akjava.gwt.html5.client.file.FileUtils.DataURLListener;
import com.akjava.gwt.html5.client.file.FileWriter;
import com.akjava.gwt.html5.client.file.ProgressEvent;
import com.akjava.gwt.html5.client.file.RequestFileSystem;
import com.akjava.gwt.html5.client.file.RequestFileSystem.FileSystemCallback;
import com.akjava.gwt.html5.client.file.callback.FileEntryCallback;
import com.akjava.gwt.html5.client.file.callback.FileErrorCallback;
import com.akjava.gwt.html5.client.file.callback.FileWriterCallback;
import com.akjava.gwt.html5.client.file.callback.ProgressEventCallback;
import com.akjava.gwt.html5.client.file.callback.VoidCallback;
import com.akjava.gwt.html5.client.file.webkit.DirectoryCallback;
import com.akjava.gwt.html5.client.file.webkit.FileCallback;
import com.akjava.gwt.html5.client.file.webkit.FileEntry;
import com.akjava.gwt.html5.client.file.webkit.WebkitStorageInfo;
import com.akjava.gwt.html5.client.file.webkit.WebkitStorageInfo.RequestQuotaCallback;
import com.akjava.gwt.html5.client.file.webkit.WebkitStorageInfo.StorageInfoUsageCallback;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
public class FileSystemTest extends VerticalPanel{
public FileSystemTest(){
this.setSpacing(16);
createSimpleButton(this);
createQuotaButton(this);
createQuotaInfoButton(this);
createWriterButton(this);
createImageUploadButton(this);
createListButton(this);
createFileIOButton(this);
}
private void createFileIOButton(Panel panel){
VerticalPanel main=new VerticalPanel();
HorizontalPanel requestButtons=new HorizontalPanel();
panel.add(main);
main.add(requestButtons);
final Label label=new Label();
main.add(label);
requestButtons.add(new Label("FileIOUtils Test"));
Button request=new Button("request",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FileIOUtils.requestPersitentFileQuota(1000, new RequestPersitentFileQuotaListener() {
@Override
public void onError(String message, Object option) {
HTML5Test.log("error:"+message);
if(option instanceof FileError){
int code=((FileError)option).getCode();
label.setText("error:"+FileIOUtils.getErrorCodeValue(code));
}
}
@Override
public void onAccepted(FileSystem fileSystem, double acceptedSize) {
label.setText("accepted:"+acceptedSize);
}
});
}
});
requestButtons.add(request);
Button getRoot=new Button("getRoot",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FileIOUtils.getFileSystem(true, new GetFileSystemListener() {
@Override
public void onError(String message, Object option) {
HTML5Test.log("error:"+message);
if(option instanceof FileError){
int code=((FileError)option).getCode();
label.setText("error:"+FileIOUtils.getErrorCodeValue(code));
}
}
@Override
public void onGetFileSystem(FileSystem fileSystem) {
label.setText("getRoot done:"+fileSystem.getRoot().getFullPath());
}
});
}
});
requestButtons.add(getRoot);
Button mkdir=new Button("mkdir",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FileIOUtils.makeDirectory(true, "dir", new MakeDirectoryCallback() {
@Override
public void onError(String message, Object option) {
HTML5Test.log("error:"+message);
if(option instanceof FileError){
int code=((FileError)option).getCode();
label.setText("error:"+FileIOUtils.getErrorCodeValue(code));
}
}
@Override
public void onMakeDirectory(FileEntry file) {
label.setText("make done:"+file.getFullPath());
}
});
}
});
requestButtons.add(mkdir);
Button write=new Button("write",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FileIOUtils.writeFile(true, "dir/a.txt", "fileio", new WriteCallback() {
@Override
public void onError(String message, Object option) {
HTML5Test.log("error:"+message);
if(option instanceof FileError){
int code=((FileError)option).getCode();
label.setText("error:"+FileIOUtils.getErrorCodeValue(code));
}
}
@Override
public void onWriteEnd(FileEntry file) {
label.setText("write done:"+file.getFullPath());
}
}, false);
}
});
requestButtons.add(write);
Button read=new Button("read",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FileIOUtils.readFileAsString(true, "dir/a.txt", new ReadStringCallback() {
@Override
public void onError(String message, Object option) {
HTML5Test.log("error:"+message);
if(option instanceof FileError){
int code=((FileError)option).getCode();
label.setText("error:"+FileIOUtils.getErrorCodeValue(code));
}
}
@Override
public void onReadString(String text, FileEntry file) {
label.setText("read done:"+file.getFullPath());
previewTextArea.setText(text);
}
});
}
});
requestButtons.add(read);
}
private void createSimpleButton(Panel panel){
HorizontalPanel requestButtons=new HorizontalPanel();
panel.add(requestButtons);
requestButtons.add(new Label("Simple Request"));
final CheckBox check=new CheckBox("PERSISTENT");
requestButtons.add(check);
final Label label=new Label();
Button simpleRequest=new Button("simple request",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int type=RequestFileSystem.TEMPORARY;
if(check.getValue()){
type=RequestFileSystem.PERSISTENT;
}
RequestFileSystem.requestFileSystem(type,1000,new FileSystemCallback() {
@Override
public void fileSystemCallback(FileSystem fileSystem) {
label.setText("[file]"+fileSystem.getName());
}
}
,
new FileErrorCallback(){
@Override
public void fileErrorCallback(FileError fileError) {
label.setText("[error]"+fileError.getCode()+" "+FileIOUtils.getErrorCodeValue(fileError.getCode()));
}});
}
});
requestButtons.add(simpleRequest);
requestButtons.add(label);
}
private void createQuotaInfoButton(Panel panel){
HorizontalPanel requestButtons=new HorizontalPanel();
panel.add(requestButtons);
requestButtons.add(new Label("Quota Info"));
final CheckBox check=new CheckBox("PERSISTENT");
requestButtons.add(check);
final Label label=new Label();
Button simpleRequest=new Button("quota info request",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
final int type=check.getValue()?RequestFileSystem.PERSISTENT:RequestFileSystem.TEMPORARY;
//WebkitStorageInfo.test();
WebkitStorageInfo.queryUsageAndQuota(type, new StorageInfoUsageCallback() {
@Override
public void storageInfoUsageCallback(double usage,double quota) {
label.setText("[info]usage="+(long)usage+" quota="+(long)quota);
}
});
}
});
requestButtons.add(simpleRequest);
requestButtons.add(label);
}
private void createQuotaButton(Panel panel){
HorizontalPanel requestButtons=new HorizontalPanel();
panel.add(requestButtons);
requestButtons.add(new Label("Quota Request"));
final CheckBox check=new CheckBox("PERSISTENT");
requestButtons.add(check);
final Label label=new Label();
Button simpleRequest=new Button("quota request",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
final int type=check.getValue()?RequestFileSystem.PERSISTENT:RequestFileSystem.TEMPORARY;
//WebkitStorageInfo.test();
WebkitStorageInfo.requestQuota(type, 10, new RequestQuotaCallback() {
@Override
public void requestQuotaCallback(double grantedBytes) {
final long size=(long) grantedBytes;
RequestFileSystem.requestFileSystem(type,size,new FileSystemCallback() {
@Override
public void fileSystemCallback(FileSystem fileSystem) {
label.setText("[file]"+fileSystem.getName()+" size="+size);
}
}
,
new FileErrorCallback(){
@Override
public void fileErrorCallback(FileError fileError) {
label.setText("[error]"+fileError.getCode());
label.setText("[error]"+fileError.getCode()+" "+FileIOUtils.getErrorCodeValue(fileError.getCode()));
}});
}
});
}
});
requestButtons.add(simpleRequest);
requestButtons.add(label);
}
private void createImageUploadButton(Panel panel){
HorizontalPanel requestButtons=new HorizontalPanel();
panel.add(requestButtons);
requestButtons.add(new Label("Image Upload"));
final CheckBox check=new CheckBox("PERSISTENT");
requestButtons.add(check);
final Label label=new Label();
final FileErrorCallback errorCallback=new FileErrorCallback(){
@Override
public void fileErrorCallback(FileError fileError) {
label.setText("[error]"+fileError.getCode());
label.setText("[error]"+fileError.getCode()+" "+FileIOUtils.getErrorCodeValue(fileError.getCode()));
}};
FileUploadForm form=FileUtils.createSingleFileUploadForm(new DataURLListener(){
@Override
public void uploaded(final File uploadFile, String value) {
HTML5Test.doneDrop();//this panel 100% converd background change border
int type=RequestFileSystem.TEMPORARY;
if(check.getValue()){
type=RequestFileSystem.PERSISTENT;
}
RequestFileSystem.requestFileSystem(type,100,new FileSystemCallback() {
@Override
public void fileSystemCallback(FileSystem fileSystem) {
//if already exists call code: 9
fileSystem.getRoot().getFile("test.png", true, false, new FileEntryCallback(){
@Override
public void fileEntryCallback(final FileEntry file) {
file.createWriter(new FileWriterCallback() {
@Override
public void createWriterCallback(FileWriter fileWriter) {
fileWriter.setOnError(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
HTML5Test.log("error:"+progressEvent.getType());
}
});
fileWriter.setOnWriteEnd(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
HTML5Test.log("done:"+progressEvent.getType());
Image img=new Image(file.toURL());
add(img);
}
});
//DownloadBlobBuilder blobBuilder=new HTML5Download().BlobBuilder();
//blobBuilder.append("hello world");
fileWriter.write(uploadFile);
}
}, errorCallback);
label.setText(file.getFullPath());
}}, errorCallback);
}
}
,errorCallback
);
}},false);
form.setShowDragOverBorder(true);
requestButtons.add(form);
requestButtons.add(label);
}
private void createWriterButton(Panel panel){
HorizontalPanel requestButtons=new HorizontalPanel();
panel.add(requestButtons);
requestButtons.add(new Label("Write Test"));
final CheckBox check=new CheckBox("PERSISTENT");
requestButtons.add(check);
final Label label=new Label();
final FileErrorCallback errorCallback=new FileErrorCallback(){
@Override
public void fileErrorCallback(FileError fileError) {
label.setText("[error]"+fileError.getCode());
label.setText("[error]"+fileError.getCode()+" "+FileIOUtils.getErrorCodeValue(fileError.getCode()));
}};
Button simpleRequest=new Button("Write",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int type=RequestFileSystem.TEMPORARY;
if(check.getValue()){
type=RequestFileSystem.PERSISTENT;
}
RequestFileSystem.requestFileSystem(type,100,new FileSystemCallback() {
@Override
public void fileSystemCallback(FileSystem fileSystem) {
//if already exists call code: 9
fileSystem.getRoot().getFile("test.txt", true, false, new FileEntryCallback(){
@Override
public void fileEntryCallback(FileEntry file) {
file.createWriter(new FileWriterCallback() {
@Override
public void createWriterCallback(FileWriter fileWriter) {
fileWriter.setOnError(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
HTML5Test.log("error:"+progressEvent.getType());
}
});
fileWriter.setOnWriteEnd(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
HTML5Test.log("done:"+progressEvent.getType());
}
});
fileWriter.write(Blob.createBlob("hello world hello world"));
}
}, errorCallback);
label.setText(file.getFullPath());
}}, errorCallback);
}
}
,errorCallback
);
}
});
requestButtons.add(simpleRequest);
requestButtons.add(label);
}
private Map<String,FileEntry> fileEntryList=new HashMap<String,FileEntry>();
private CellList<FileEntry> cellList;
private SingleSelectionModel<FileEntry> selectionModel;
private Handler selectionChangeHandler;
private FileEntry currentSelectionFileEntry;
private TextArea previewTextArea;
private void createListButton(final Panel panel){
VerticalPanel main=new VerticalPanel();
HorizontalPanel requestButtons=new HorizontalPanel();
panel.add(main);
main.add(requestButtons);
requestButtons.add(new Label("File List"));
final CheckBox check=new CheckBox("PERSISTENT");
requestButtons.add(check);
final Label label=new Label();
main.add(label);
previewTextArea = new TextArea();
final FileErrorCallback errorCallback=new FileErrorCallback(){
@Override
public void fileErrorCallback(FileError fileError) {
label.setText("[error]"+fileError.getCode()+" "+FileIOUtils.getErrorCodeValue(fileError.getCode()));
}};
FileEntryCell cell=new FileEntryCell();
cellList = new CellList<FileEntry>(cell);
cellList.setStylePrimaryName("table");
panel.add(cellList);
selectionModel = new SingleSelectionModel<FileEntry>();
cellList.setSelectionModel(selectionModel);
selectionChangeHandler = new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
FileEntry fileEntry=selectionModel.getSelectedObject();
HTML5Test.log("selection-changed:"+fileEntry.getFullPath());
currentSelectionFileEntry=fileEntry;
fileEntry.file(new FileCallback() {
@Override
public void callback(File file) {
final FileReader reader=FileReader.createFileReader();
reader.setOnLoad(new FileHandler() {
@Override
public void onLoad() {
previewTextArea.setValue(reader.getResultAsString());
}
});
reader.readAsText(file, "UTF-8");
}
});
}
};
selectionModel.addSelectionChangeHandler(selectionChangeHandler);
Button simpleRequest=new Button("Update",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int type=RequestFileSystem.TEMPORARY;
if(check.getValue()){
type=RequestFileSystem.PERSISTENT;
}
RequestFileSystem.requestFileSystem(type,100,new FileSystemCallback() {
@Override
public void fileSystemCallback(FileSystem fileSystem) {
fileEntryList.clear();
DirectoryReader reader=fileSystem.getRoot().getReader();
reader.readEntries(new DirectoryCallback() {
@Override
public void callback(JsArray<FileEntry> entries) {
for(int i=0;i<entries.length();i++){
fileAdd(entries.get(i),fileEntryList,cellList);
}
updateCellList();
}
});
}
}
,errorCallback
);
}
});
Button removeButton=new Button("Remove",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
final FileEntry entry=getCurrentSelection();
if(entry==null){
return;
}
entry.remove(new VoidCallback() {
@Override
public void callback() {
fileEntryList.remove(entry.getFullPath());
updateCellList();
HTML5Test.log("removed:"+fileEntryList.size());
}
}, errorCallback);
}
});
Button mkdirButton=new Button("Create Dir",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FileEntry entry=getCurrentSelection();
if(entry!=null && entry.isFile()){
return;
}
if(entry==null){
int type=RequestFileSystem.TEMPORARY;
if(check.getValue()){
type=RequestFileSystem.PERSISTENT;
}
RequestFileSystem.requestFileSystem(type,100,new FileSystemCallback() {
@Override
public void fileSystemCallback(FileSystem fileSystem) {
createDir(fileSystem.getRoot(),"dir",errorCallback);
}
}
,errorCallback
);
}else{
createDir(entry,"dir",errorCallback);
}
}
});
Button writeButton=new Button("Add File",new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FileEntry entry=getCurrentSelection();
final JavaScriptObject blob=Blob.createBlob("hello world", "text/plain");
final FileEntryCallback onwriteend=new FileEntryCallback() {
@Override
public void fileEntryCallback(FileEntry fileEntry) {
fileEntryList.put(fileEntry.getFullPath(),fileEntry);
updateCellList();
HTML5Test.log("write end");
}
};
final FileEntryCallback onerror=new FileEntryCallback() {
@Override
public void fileEntryCallback(FileEntry fileEntry){
HTML5Test.log("error-on write:");
fileEntry.remove(new VoidCallback() {
@Override
public void callback() {
HTML5Test.log("write error & removed");
}
}, errorCallback);
}
};
if(entry==null || entry.isFile()){
int type=RequestFileSystem.TEMPORARY;
if(check.getValue()){
type=RequestFileSystem.PERSISTENT;
}
RequestFileSystem.requestFileSystem(type,100,new FileSystemCallback() {
@Override
public void fileSystemCallback(FileSystem fileSystem) {
//how to overwrite?
writeFile(fileSystem.getRoot(),"hello.txt",true,false,blob,false,onwriteend,onerror,errorCallback);
}
}
,errorCallback
);
}else{
writeFile(entry,"hello.txt",true,false,blob,false,onwriteend,onerror,errorCallback);
}
}
});
requestButtons.add(simpleRequest);
requestButtons.add(removeButton);
requestButtons.add(mkdirButton);
requestButtons.add(writeButton);
add(previewTextArea);
}
protected FileEntry getCurrentSelection() {
//selectionModel.getSelectedObject();
return currentSelectionFileEntry;
}
private void fileAdd(FileEntry entry,final Map<String,FileEntry> container,final CellList<FileEntry> list){
container.put(entry.getFullPath(),entry);
if(entry.isDirectory()){
DirectoryReader reader=entry.getReader();
reader.readEntries(new DirectoryCallback() {
@Override
public void callback(JsArray<FileEntry> entries) {
for(int i=0;i<entries.length();i++){
fileAdd(entries.get(i),container,list);
}
}
});
}
list.setRowCount(fileEntryList.size());
List<FileEntry> entries=new ArrayList<FileEntry>();
entries.addAll(fileEntryList.values());
list.setRowData(0, entries);
}
private void createDir(FileEntry parent,String name,FileErrorCallback fileErrorCallback){
parent.getDirectory(name, true, false, new FileEntryCallback() {
@Override
public void fileEntryCallback(FileEntry file) {
fileEntryList.put(file.getFullPath(),file);
HTML5Test.log("directory created:"+fileEntryList.size());
updateCellList();
}
}, fileErrorCallback);
}
private void updateCellList(){
currentSelectionFileEntry=null;
cellList.setRowCount(fileEntryList.size());
List<FileEntry> entries=new ArrayList<FileEntry>();
entries.addAll(fileEntryList.values());
cellList.setRowData(0, entries);
//TODO test selectionModel.clear()
previewTextArea.setText("");
/*
selectionModel=new SingleSelectionModel<FileEntry>();
selectionModel.addSelectionChangeHandler(selectionChangeHandler);
cellList.setSelectionModel(selectionModel);
*/
}
private void writeFile(FileEntry parent,String name,boolean create,boolean exclusive,final JavaScriptObject blob,final boolean append,final FileEntryCallback onwriteend,final FileEntryCallback onerror,final FileErrorCallback errorCallback){
parent.getFile(name,create,exclusive, new FileEntryCallback(){
@Override
public void fileEntryCallback(final FileEntry file) {
file.createWriter(new FileWriterCallback() {
@Override
public void createWriterCallback(final FileWriter fileWriter) {
fileWriter.setOnError(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
onerror.fileEntryCallback(file);
}
});//maybe should remove it
if(fileWriter.length()>0 &&!append){
fileWriter.setOnWriteEnd(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
fileWriter.setOnWriteEnd(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
onwriteend.fileEntryCallback(file);
}
});
fileWriter.write(blob);
}
});
HTML5Test.log("truncated");
fileWriter.truncate(0);//TODO blob support length
}else{
HTML5Test.log("empty ust write");
fileWriter.setOnWriteEnd(new ProgressEventCallback() {
@Override
public void progressEventCallback(ProgressEvent progressEvent) {
onwriteend.fileEntryCallback(file);
}
});
if(fileWriter.length()>0){
fileWriter.seek(fileWriter.length());
}
fileWriter.write(blob);
}
}
}, errorCallback);
}}, errorCallback);
}
}