Mercurial > hg > ltpda
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 +