diff m-toolbox/classes/@ltpda_uo/save.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/@ltpda_uo/save.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,283 @@
+% SAVE overloads save operator for ltpda objects.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: SAVE overloads save operator for ltpda objects.
+%
+% CALL:        save(obj, 'blah.mat') Save an object obj as a .mat file.
+%              obj.save('blah.mat')  Save an object obj as a .mat file.
+%              obj.save(plist('filename', 'blah.mat'))
+%              save(obj, plist('filename', 'blah.mat'))
+%              save(a, 'blah.xml') Save an object as an XML file.
+%              a.save(plist('filename', 'blah.xml'))
+%
+% The method accepts multiple input objects (in a list or in a vector), 
+% that will be save inside a single file or in multiple files according to the
+% "INDIVIDUAL FILES" parameter (see the Parameters Description below)
+%
+% <a href="matlab:utils.helper.displayMethodInfo('ltpda_uo', 'save')">Parameters Description</a>
+%
+% VERSION:     $Id: save.m,v 1.41 2011/10/05 09:49:31 ingo Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function varargout = save(varargin)
+  
+  %%% Check if this is a call for parameters
+  if utils.helper.isinfocall(varargin{:})
+    varargout{1} = getInfo(varargin{3});
+    return
+  end
+  
+  import utils.const.*
+  utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename);
+  
+  %%% Collect input variable names
+  in_names = cell(size(varargin));
+  for ii = 1:nargin,in_names{ii} = inputname(ii);end
+  
+  [objs, objinvars, rest] = utils.helper.collect_objects(varargin(:), '', in_names);
+  [pls,  invars, rest] = utils.helper.collect_objects(rest(:), 'plist', in_names);
+  
+  %%% REMARK: Special case for the plist-class because collect_objects collects
+  %%%         ALL plist-objects even the plist which should set the property.
+  %%%         In this case must be the plist which sets thte property
+  %%%         at the last position.
+  if isa(objs, 'plist')
+    if nparams(objs(end)) == 1 && isparam(objs(end), 'filename')
+      pls = [pls objs(end)];
+      objs(end) = [];
+    end
+  end
+  
+  %%% Combine the plists
+  pls = combine(pls, getDefaultPlist());
+  
+  %%%
+  % 1. Use the filename from the PLIST
+  % 2. Use the input string as the filename
+  % 3. Use the object name and the current folder for the filename
+  %    Must be defined for each object.
+  % 4. If there are more than one input objects and the 'individual files'
+  %    Switch is false then use the variable name.
+  filename = '';
+  if ~isempty(pls.find('filename'))
+    filename = pls.find('filename');
+  elseif ~isempty(rest) && numel(rest) == 1 && iscellstr(rest)
+    filename = rest{1};
+    pls.pset('filename', filename);
+  end
+  
+  %%% Make sure that the UUID is set for all objects. This should only
+  %%% happen for PLISTs.
+  %%% REMARK: This command will also change the plist in the workspace.
+  for ii = 1:numel(objs)
+    if isempty(objs(ii).UUID)
+      objs(ii).UUID = char(java.util.UUID.randomUUID);
+    end
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   Save object   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  % Inspect filename
+  [path, fname, ext] = fileparts(filename);
+  
+  % Save the objects as MAT files if the user doesn't specify a extension type
+  if isempty(ext)
+    ext = '.mat';
+  end
+  
+  % Get pre-, and postfix from the input PLIST
+  prefix  = pls.find('prefix');
+  postfix = pls.find('postfix');
+  
+  individualFiles = pls.find('individual files');
+  
+  % ATTENTION: We keep the meaning of t0 for backwars compatibility.
+  %            This means 
+  %              - before saving, t0 = t0 + toffset
+  %              - after loading, t0 = t0 - toffset
+  %            But be careful. For XML files it is done in the tsdata
+  %            methods 'attachToDom' and 'fromDom' because for submitting
+  %            we don't use this method.
+  
+  switch ext
+    case '.mat'
+      
+      % ATTENTION: We moved the changing to the t0 to the MATLAB methods:
+      % tsdata/loadobj and tsdata/saveobj
+      
+      objsout = objs;
+      
+      v = ver('MATLAB');
+      % MATLAB version number of 2008b is 7.7
+      if utils.helper.ver2num(v.Version) < utils.helper.ver2num('7.7')
+        
+        warning('off', 'all')
+        shape = size(objs);
+        objs  = utils.prog.rstruct(objs);
+        objs  = reshape(objs, shape);
+        warning('on', 'all')
+      else
+      end
+      
+      if (individualFiles == true)
+        
+        %%%%% Save each object in individual file
+        dummy = objs;
+        for ii = 1:numel(dummy)
+          objs = dummy(ii);
+          % Define full filename
+          if isempty(fname)
+            fullFilename = getFullFilename(objs.name);
+          else
+            postfix = sprintf('%s_%03d', pls.find('postfix'), ii);
+            fullFilename = getFullFilename(fname);
+          end
+          save(fullFilename, 'objs');
+        end
+        
+      else
+        
+        %%%%% Save all objects in one file
+        if isempty(fname)
+          fullFilename = getFullFilename(inputname(1));
+          warning('!!! You have not specified any file name -> Using first variable name as file name.');
+        else
+          fullFilename = getFullFilename(fname);
+        end
+        
+        save(fullFilename, 'objs');
+        objs = objsout;
+      end
+      
+    case '.xml'
+      
+      if (individualFiles == true)
+        %%%%% Save each object in individual file
+        
+        for ii = 1:numel(objs)
+          if isempty(fname)
+            fullFilename = getFullFilename(objs(ii).name);
+          else
+            postfix = sprintf('%s_%03d', pls.find('postfix'), ii);
+            fullFilename = getFullFilename(fname);
+          end
+          saveObjectAsXML(objs(ii), fullFilename);
+        end
+        
+      else
+        %%%%% Save all objects in one file
+        if isempty(fname)
+          fullFilename = getFullFilename(inputname(1));
+          warning('!!! You have not specified any file name -> Using first variable name as file name.');
+        else
+          fullFilename = getFullFilename(fname);
+        end
+        
+        saveObjectAsXML (objs, fullFilename);
+      end
+      
+      
+    otherwise
+      error('### unknown file extension [%s].', ext);
+  end
+  
+  varargout{1} = objs;
+  
+  %--------------------------------------------------------------------------
+  % Return the full file name
+  %--------------------------------------------------------------------------
+  function fullFilename = getFullFilename(fname)
+    
+    % concatenate the prefix, filename, postfix and the file extension.
+    fname = strcat(prefix, fname, postfix, ext);
+    
+    % build full filename
+    fullFilename = fullfile(path, fname);
+    
+  end
+  
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                               Local Functions                               %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%--------------------------------------------------------------------------
+% save object as XML file
+%--------------------------------------------------------------------------
+function saveObjectAsXML (obj, fullFilename)
+  
+  % Create DOM node
+  dom = com.mathworks.xml.XMLUtils.createDocument('ltpda_object');
+  parent = dom.getDocumentElement;
+  
+  % add Attribute 'ltpda_version' to the root node
+  ltpda_version = getappdata(0, 'ltpda_version');
+  parent.setAttribute('ltpda_version', ltpda_version);
+  
+  if  (utils.helper.ver2num(ltpda_version) > utils.helper.ver2num('2.3')) || ...
+      (strcmp(strtok(ltpda_version), '2.3'))
+    %%%%%%%%%%%%%%%%%%   saving of a new XML file   %%%%%%%%%%%%%%%%%%
+    
+    % Create history root node
+    % The attachToDom methods will attach their histories to this node.
+    historyRootNode = dom.createElement('historyRoot');
+    parent.appendChild(historyRootNode);
+    
+    % Write objects
+    obj.attachToDom(dom, parent, []);
+    
+  else
+    %%%%%%%%%%%%%%%%%%   saving of a old XML file   %%%%%%%%%%%%%%%%%%
+    utils.xml.xmlwrite(obj, dom, parent, '');    % Save the XML document.
+  end
+  
+  % Write to file
+  
+  % Ingo: I want to use our own XML write method because I miss on my
+  %       machine the indent.
+  if isempty(strfind(fullFilename, filesep))
+    result = javax.xml.transform.stream.StreamResult(fullfile(pwd, fullFilename));
+  else
+    result = javax.xml.transform.stream.StreamResult(fullFilename);
+  end
+  mpipeline.utils.XMLUtils.serializeXML(dom, result, 'UTF-8')
+%   xmlwrite(fullFilename, dom);
+  
+end
+
+
+%--------------------------------------------------------------------------
+% Get Info Object
+%--------------------------------------------------------------------------
+function ii = getInfo(varargin)
+  if nargin == 1 && strcmpi(varargin{1}, 'None')
+    sets = {};
+    pl   = [];
+  else
+    sets = {'Default'};
+    pl   = getDefaultPlist();
+  end
+  % Build info object
+  ii = minfo(mfilename, 'ltpda_uo', 'ltpda', utils.const.categories.output, '$Id: save.m,v 1.41 2011/10/05 09:49:31 ingo Exp $', sets, pl);
+  ii.setOutmin(0);
+end
+
+%--------------------------------------------------------------------------
+% Get Default Plist
+%--------------------------------------------------------------------------
+function plout = getDefaultPlist()
+  persistent pl;  
+  if ~exist('pl', 'var') || isempty(pl)
+    pl = buildplist();
+  end
+  plout = pl;  
+end
+
+function pl = buildplist()
+  % General plist for saving objects
+  pl = plist.SAVE_OBJ_PLIST;
+  
+end
+