Browse Source

Refactor StorageManager

pull/36/head
Artur Arseniev 10 years ago
parent
commit
bb7f2dd35e
  1. 2
      src/asset_manager/view/AssetsView.js
  2. 6
      src/editor/model/Editor.js
  3. 41
      src/storage_manager/config/config.js
  4. 201
      src/storage_manager/main.js
  5. 5
      src/storage_manager/model/LocalStorage.js
  6. 5
      src/storage_manager/model/RemoteStorage.js
  7. 19
      src/storage_manager/model/StorageInterface.js

2
src/asset_manager/view/AssetsView.js

@ -16,7 +16,7 @@ define(['backbone', './AssetView', './AssetImageView', './FileUploader'],
// Check if storage is required and if Storage Manager is available
if(this.config.stm && this.config.storageType !== ''){
var type = this.config.storageType;
this.provider = this.config.stm.getProvider(type);
this.provider = this.config.stm.get(type);
this.storeName = this.config.storageName ? this.config.storageName : this.className;
if(this.provider){
// Create new instance of provider

6
src/editor/model/Editor.js

@ -124,7 +124,7 @@ define([
avSt = opt ? opt.avoidStore : 0;
this.set('changesCount', count);
if(this.stm.isAutosave() && count < this.stm.getChangesBeforeSave())
if(this.stm.isAutosave() && count < this.stm.getStepsBeforeSave())
return;
if(!avSt){
@ -219,7 +219,7 @@ define([
initStorage: function()
{
this.stm = new StorageManager(this.config.storageManager);
this.stm.loadDefaultProviders().setCurrentProvider(this.config.storageType);
this.stm.loadDefaultProviders().setCurrent(this.config.storageType);
this.set('StorageManager', this.stm);
},
@ -355,7 +355,7 @@ define([
var updatedCount = this.get('changesCount') + 1,
avSt = opt ? opt.avoidStore : 0;
this.set('changesCount', updatedCount);
if(this.stm.isAutosave() && updatedCount < this.stm.getChangesBeforeSave()){
if(this.stm.isAutosave() && updatedCount < this.stm.getStepsBeforeSave()){
return;
}

41
src/storage_manager/config/config.js

@ -1,19 +1,48 @@
define(function () {
return {
// Enable/Disable autosaving
autosave : 1,
autosave: 1,
// Indicates which storage to use. Available: local | remote
storageType : 'local',
storageType: 'local',
// If autosave enabled, indicates how many changes (general changes to structure)
// need to be done before save. Useful with remoteStorage to reduce remote calls
changesBeforeSave : 1,
stepsBeforeSave: 1,
//Enable/Disable components model (JSON format)
storeComponents: true,
//Enable/Disable styles model (JSON format)
storeStyles: false,
//Enable/Disable saving HTML template
storeHtml: false,
//Enable/Disable saving HTML template
storeCss: false,
// ONLY FOR REMOTE STORAGE
// Custom params that should be passed with each store/load request
params: {},
// Endpoint where to save all stuff
urlStore: '',
// Endpoint where to fetch data
urlLoad: '',
//Callback before request
beforeSend: function(jqXHR, settings){},
//Callback after request
onComplete: function(jqXHR, status){},
// Defaults for remote storage
remoteStorage : {
remoteStorage: {
//Enable/Disable components model (JSON format)
storeComponents: true,
storeComponents: true,
//Enable/Disable styles model (JSON format)
storeStyles: false,
//Enable/Disable saving HTML template
@ -47,6 +76,6 @@ define(function () {
},
// Defaults for local storage
localStorage : {},
localStorage: {},
};
});

201
src/storage_manager/main.js

@ -5,190 +5,153 @@ define(function(require) {
*
* @return {Object}
* */
function StorageManager(config)
{
var c = config || {},
defaults = require('./config/config'),
LocalStorage = require('./model/LocalStorage'),
RemoteStorage = require('./model/RemoteStorage'),
StorageInterface = require('./model/StorageInterface');
var StorageManager = function(config) {
var c = config || {},
defaults = require('./config/config'),
LocalStorage = require('./model/LocalStorage'),
RemoteStorage = require('./model/RemoteStorage');
for (var name in defaults){
if (!(name in c))
c[name] = defaults[name];
}
this.providers = {};
this.defaultProviders = {};
this.autosave = c.autosave;
this.currentProvider = c.storageType || null;
this.changesBeforeSave = c.changesBeforeSave;
this.si = new StorageInterface();
var storages = {};
var defaultStorages = {};
var Local = new LocalStorage(c.localStorage),
Remote = new RemoteStorage(c.remoteStorage);
defaultStorages.remote = new RemoteStorage(c.remoteStorage);
defaultStorages.local = new LocalStorage(c.localStorage);
this.defaultProviders[Local.getId()] = Local;
this.defaultProviders[Remote.getId()] = Remote;
}
StorageManager.prototype = {
return {
/**
* Check if autosave enabled
*
* @return boolean
* Checks if autosave is enabled
* @return {Boolean}
* */
isAutosave : function(){
return this.autosave;
isAutosave: function(){
return c.autosave;
},
/**
* Set autosave
* @param {Mixed} v Value
*
* @return this
* Set autosave value
* @param {Boolean} v
* @return {this}
* */
setAutosave : function(v){
this.autosave = v;
c.autosave = !!v;
return this;
},
/**
* Returns value of changes required before save
*
* @return {Integer}
* Returns number of steps required before trigger autosave
* @return {number}
* */
getChangesBeforeSave : function(){
return this.changesBeforeSave;
getStepsBeforeSave: function(){
return c.stepsBeforeSave;
},
/**
* Set changesBeforeSave value
* @param {Mixed} v Value
*
* @return this
* Set steps required before trigger autosave
* @param {number} v
* @return {this}
* */
setChangesBeforeSave : function(v){
this.changesBeforeSave = v;
setStepsBeforeSave: function(v){
c.stepsBeforeSave = v;
return this;
},
/**
* Add new storage provider
* @param {StorageInterface} provider
*
* @return self
* Add new storage
* @param {string} id Storage ID
* @param {Object} storage Storage wrapper
* @param {Function} storage.load Load method
* @param {Function} storage.store Store method
* @return {this}
* @example
* storageManager.add('local2', {
* load: function(item){
* return localStorage.getItem(name);
* },
* store: function(item, value){
* localStorage.setItem(item, value);
* }
* });
* */
addProvider : function(provider) {
// Check interface implementation
for (var method in this.si)
if(!provider[method])
console.warn("addProvider: method '"+ method +"' was not found inside '"+ provider.getId() +"' object");
this.providers[provider.getId()] = provider;
if(!this.currentProvider)
this.currentProvider = provider.getId();
add: function(id, storage) {
storages[id] = storage;
return this;
},
/**
* Returns storage provider
* @param {Integer} id Storage provider ID
*
* @return {StorageInterface}|null
* Returns storage by id
* @param {string} id Storage ID
* @return {Object|null}
* */
getProvider : function(id){
var provider = null;
if(id && this.providers[id])
provider = this.providers[id];
return provider;
get: function(id){
return storages[id] || null;
},
/**
* Returns storage providers
*
* Returns all storages
* @return {Array}
* */
getProviders : function(){
return this.providers;
},
/**
* Get current provider
*
* @return {StorageInterface}
* */
getCurrentProvider : function() {
if(!this.currentProvider)
this.loadDefaultProviders();
return this.getProvider(this.currentProvider);
getStorages: function() {
return storages;
},
/**
* Set current provider
* @param {Integer} id Storage provider ID
*
* @return this
* Returns current storage type
* @return {string}
* */
setCurrentProvider : function(id) {
this.currentProvider = id;
return this;
getCurrent: function() {
return c.currentStorage;
},
/**
* Load default providers
*
* @return this
* Set current storage type
* @param {string} id Storage ID
* @return {this}
* */
loadDefaultProviders : function() {
for (var id in this.defaultProviders) {
this.addProvider(this.defaultProviders[id]);
}
setCurrent: function(id) {
c.currentStorage = id;
return this;
},
/**
* Store resource
* @param {String} name Name of the resource
* @param {String} value Value of the resource
*
* @return {Object|null}
* @param {String} name Resource's name
* @param {String} value Resource's value
* @return {Object|null}
* */
store : function(name, value){
var pv = this.getCurrentProvider();
if(pv)
return pv.store(name, value);
return;
store: function(name, value){
var st = this.get(this.getCurrent());
return st ? st.store(name, value) : null;
},
/**
* Load resource
* @param {String} name Name of the resource
*
* @return {Object|null}
* @param {string} name Resource's name
* @return {Object|null} Loaded resource
* */
load : function(name){
var pv = this.getCurrentProvider();
if(pv)
return pv.load(name);
return;
load: function(name){
var st = this.get(this.getCurrent());
return st ? st.load(name) : null;
},
/**
* Remove resource
* @param {String} name Name of the resource
*
* @return {Object}|void
* Load default storages
* @return {this}
* @private
* */
remove : function(name){
return this.getCurrentProvider().remove(name);
loadDefaultProviders : function() {
for (var id in defaultStorages)
this.add(id, defaultStorages[id]);
return this;
},
};
};
return StorageManager;
});

5
src/storage_manager/model/LocalStorage.js

@ -10,11 +10,6 @@ define(['backbone'],
errorNoSupport : 'Error encountered while parsing JSON response',
},
/** @inheritdoc */
getId : function() {
return 'local';
},
/** @inheritdoc */
store : function(name, value) {
this.checkStorageEnvironment();

5
src/storage_manager/model/RemoteStorage.js

@ -15,11 +15,6 @@ define(['backbone'],
errorLoad : 'Response is not a valid JSON',
},
/** @inheritdoc */
getId : function() {
return 'remote';
},
/** @inheritdoc */
store : function(name, value) {
var fd = new FormData(),

19
src/storage_manager/model/StorageInterface.js

@ -1,19 +0,0 @@
define(function() {
/**
* @class StorageInterface
* */
function StorageInterface() {}
StorageInterface.prototype = {
getId : function() {},
store : function(name, value) {},
load : function(name) {},
remove : function(name) {},
};
return StorageInterface;
});
Loading…
Cancel
Save