001package ch.gbrain.gwtstorage.manager; 002 003/* 004 * #%L 005 * GwtStorage 006 * %% 007 * Copyright (C) 2016 gbrain.ch 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023 024import java.util.Date; 025import java.util.logging.Level; 026import java.util.logging.Logger; 027 028import ch.gbrain.gwtstorage.model.StorageInfo; 029import ch.gbrain.gwtstorage.model.StorageResource; 030 031import com.google.gwt.core.client.Callback; 032import com.google.gwt.storage.client.Storage; 033import com.google.gwt.user.client.Command; 034import com.googlecode.gwtphonegap.client.PhoneGap; 035import com.googlecode.gwtphonegap.client.file.EntryBase; 036import com.googlecode.gwtphonegap.client.file.FileCallback; 037import com.googlecode.gwtphonegap.client.file.FileEntry; 038import com.googlecode.gwtphonegap.client.file.FileError; 039import com.googlecode.gwtphonegap.client.file.FileObject; 040import com.googlecode.gwtphonegap.client.file.Metadata; 041 042 043/** 044 * This Command class is used to schedule the collecting of the file information for one given resource stored in the cache and 045 * referenced by the corresponding storageKey. 046 * @author Markus 047 * 048 * 049 */ 050public class StorageInfoCollector implements Command 051{ 052 private String storageKey; 053 private String version; 054 private String fileName; 055 private String filePath; 056 private String fileUrl; 057 private Long fileSize; 058 private Date lastModificationDate; 059 private Callback<StorageInfo, FileError> callback; 060 private FileEntry fileEntry; 061 private StorageManager storageManager; 062 private Logger logger; 063 private PhoneGap phonegap; 064 private Storage storage; 065 066 /** 067 * 068 * @param logger if null is given, no logging takes place. 069 * @param storage 070 * @param phonegap 071 * @param storageKey 072 * @param callback 073 */ 074 public StorageInfoCollector(StorageManager storageManager, String storageKey, Callback<StorageInfo, FileError> callback) 075 { 076 this.storageManager = storageManager; 077 this.logger = storageManager.getLogger(); 078 this.storage = storageManager.getLocalStorage(); 079 this.phonegap = storageManager.getPhonegap(); 080 this.storageKey = storageKey; 081 this.callback = callback; 082 } 083 084 private String logBaseInfo() 085 { 086 return "CollectInfo : " + storageKey + " / "; 087 } 088 089 090 public void execute() 091 { 092 String versionKey = StorageResource.getResourceVersionKey(storageKey); 093 version = storage.getItem(versionKey); 094 fileUrl = storage.getItem(storageKey); 095 // now resolve the file asynch 096 phonegap.getFile().resolveLocalFileSystemURI(fileUrl, new FileCallback<EntryBase, FileError>() 097 { 098 @Override 099 public void onSuccess(EntryBase entry) 100 { 101 if (logger!=null)logger.log(Level.INFO, logBaseInfo() + "ResolveLocalFileSystemUri success"); 102 fileEntry = entry.getAsFileEntry(); 103 fileEntry.getFile(new FileCallback<FileObject, FileError>() 104 { 105 @Override 106 public void onSuccess(FileObject entry) 107 { 108 if (logger!=null)logger.log(Level.INFO, logBaseInfo() + "FileEntry located : " + entry.getFullPath() + " name:" + entry.getName()); 109 fileName = entry.getName(); 110 filePath = entry.getFullPath(); 111 fileSize = entry.size(); 112 try 113 { // might throw an exception (unknown method in Phonegap ..... 114 // lastModificationDate = entry.getLastModifiedDate(); -> take 115 // it from Metadata instead 116 } catch (Exception ex) 117 { 118 if (logger!=null)logger.log(Level.FINEST, logBaseInfo() + "Failure in File Modification Date evaluation", ex); 119 } 120 fileEntry.getMetadata(new FileCallback<Metadata, FileError>() 121 { 122 @Override 123 public void onSuccess(Metadata metadata) 124 { 125 if (logger!=null)logger.log(Level.INFO, logBaseInfo() + "Successful FileMetadata located"); 126 try 127 { 128 lastModificationDate = metadata.getModificationTime(); 129 } catch (Exception ex) 130 { 131 if (logger!=null)logger.log(Level.FINEST, logBaseInfo() + "Failure in Metadata Modification Date evaluation", ex); 132 } 133 invokeSuccessCallback(); 134 } 135 136 @Override 137 public void onFailure(FileError error) 138 { 139 if (logger!=null)logger.log(Level.WARNING, logBaseInfo() + "Failure cache FileEntry Metadata retrieval with error : " + error.toString()); 140 // anyhow signal success even if we don't have the Metadata, but we have the FileObject data already 141 invokeSuccessCallback(); 142 } 143 }); 144 } 145 146 @Override 147 public void onFailure(FileError error) 148 { 149 if (logger!=null)logger.log(Level.SEVERE, logBaseInfo() + "Failure cache FileEntry info retrieval with error : " + error.toString()); 150 callback.onFailure(error); 151 } 152 }); 153 } 154 155 @Override 156 public void onFailure(FileError error) 157 { 158 if (logger!=null)logger.log(Level.WARNING, logBaseInfo() + "Unable to locate cache File information with error : " + error.getErrorCode()); 159 if (callback != null) 160 { 161 callback.onFailure(error); 162 } 163 } 164 }); 165 } 166 167 private void invokeSuccessCallback() 168 { 169 StorageInfo info = new StorageInfo(); 170 info.setFileName(this.fileName); 171 info.setFilePath(filePath); 172 info.setFileUrl(fileUrl); 173 info.setFileSize(fileSize); 174 info.setLastModificationDate(lastModificationDate); 175 info.setStorageKey(storageKey); 176 info.setVersion(version); 177 callback.onSuccess(info); 178 } 179 180}