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}