1 var Importer = {}
  2 
  3 Importer.run = function() {
  4    var item;
  5    while (item = app.data.imports.shift()) {
  6       var file = item.file;
  7       var site = Site.getById(item.site);
  8       var user = User.getById(item.user);
  9 
 10       var baseDir = site.getStaticFile();
 11       var importDir = new java.io.File(baseDir, "import.temp");
 12       var zip = new helma.Zip(file);
 13       zip.extractAll(importDir);
 14 
 15       var object = Xml.read(new java.io.File(importDir, "site.xml"));
 16       for (var key in object) {
 17          switch (key) {
 18             case "name":
 19             case "origin":
 20             case "origin_id":
 21             case "version":
 22             break;
 23             case "creator":
 24             case "modifier":
 25             site[key] = user;
 26             break;
 27             default:
 28             res.debug("Settting " + key + " to " + object[key]);
 29             site[key] = object[key];
 30             res.debug("New value: " + site[key])
 31          }
 32       }
 33       site.creator = user;
 34       site.modifier = user;
 35       
 36       // Commit is necessary or the mode is set incorrectly (which is strange)
 37       // Invalidate is necessary to immediately apply metadata values
 38       res.commit();
 39       site.invalidate();
 40       
 41       var importCollection = function(name) {
 42          switch (name) {
 43             case "files":
 44             var parent = "site";
 45             var Prototype = File;
 46             break;
 47             case "images":
 48             var parent = "parent";
 49             var Prototype = Image;
 50             break;
 51             case "stories":
 52             var parent = "site";
 53             var Prototype = Story;
 54             break;
 55             default:
 56             throw Error("Invalid collection name");
 57          }
 58          
 59          var index = 1;
 60          var dir = new java.io.File(importDir, name);
 61          var list = dir.listFiles();
 62          for each (var file in list) {
 63             item.status = "importing " + name + ": " + index++ + " of " + list.length;
 64             if (file.toString().endsWith(".xml")) {
 65                var object = Xml.read(file);
 66                object[parent] = site;
 67                object.creator = object.modifier = user;
 68                var target = new Prototype;
 69                for (var key in object) {
 70                   target[key] = object[key];
 71                }
 72                site[name].add(target);
 73                file["delete"]();
 74             }
 75          }
 76          return;
 77       }
 78       
 79       importCollection("stories");
 80       importCollection("files");
 81       importCollection("images");
 82       
 83       // Move files directory to final destination
 84       dest = site.getStaticFile("files");
 85       dest.removeDirectory();
 86       (new helma.File(importDir, "files")).renameTo(dest);
 87 
 88       // Move images directory to final destination
 89       var dest = site.getStaticFile("images");
 90       dest.removeDirectory();
 91       (new helma.File(importDir, "images")).renameTo(dest);
 92 
 93       site.getStaticFile("import.temp").removeDirectory();
 94 
 95       delete app.data.imports[file];
 96    }
 97 
 98    return;
 99 }
100 
101 Importer.add = function(file, site, user) {
102    if (!app.data.imports[file]) {
103       var item = {
104          file: file,
105          site: site._id,
106          user: user._id,
107          status: "queued"
108       }
109       app.data.imports.push(item);
110       return app.data.imports[file] = item; 
111    }
112    return false;
113 }
114 
115 Importer.getStatus = function(file) {
116    var item = app.data.imports[file];
117    return item ? item.status : null;
118 }
119