text: (function (server, registry) {
  
      var log = new Log();
  
      var GenericArtifactManager = Packages.org.wso2.carbon.governance.api.generic.GenericArtifactManager;
      var GenericArtifactFilter = Packages.org.wso2.carbon.governance.api.generic.GenericArtifactFilter;
      var ByteArrayInputStream = Packages.java.io.ByteArrayInputStream;
      var QName = Packages.javax.xml.namespace.QName;
      var IOUtils = Packages.org.apache.commons.io.IOUtils;
  
      var buildArtifact = function (manager, artifact) {
          return {
              id: String(artifact.id),
              type: String(manager.type),
              path: "/_system/governance" + String(artifact.getPath()),
              lifecycle: artifact.getLifecycleName(),
              lifecycleState: artifact.getLifecycleState(),
              mediaType: String(artifact.getMediaType()),
              attributes: (function () {
                  var i, name,
                      names = artifact.getAttributeKeys(),
                      length = names.length,
                      attributes = {};
                  for (i = 0; i < length; i++) {
                      name = names[i];
                      attributes[name] = String(artifact.getAttribute(name));
                  }
                  return attributes;
              }()),
              content: function () {
                  return new Stream(new ByteArrayInputStream(artifact.getContent()));
              }
          };
      };
  
      var createArtifact = function (manager, options) {
          var name, attribute, i, length, lc,
              artifact = manager.newGovernanceArtifact(new QName(options.name)),
              attributes = options.attributes;
          for (name in attributes) {
              if (attributes.hasOwnProperty(name)) {
                  attribute = attributes[name];
                  if (attribute instanceof Array) {
                      /*length = attribute.length;
                       for (i = 0; i < length; i++) {
                       artifact.addAttribute(name, attribute[i]);
                       }*/
                      artifact.setAttributes(name, attribute);
                  } else {
                      artifact.setAttribute(name, attribute);
                  }
              }
          }
          if (options.id) {
              artifact.id = options.id;
          }
          if (options.content) {
              if (options.content instanceof Stream) {
                  artifact.setContent(IOUtils.toByteArray(options.content.getStream()));
              } else {
                  artifact.setContent(new java.lang.String(options.content).getBytes());
              }
          }
          lc = options.lifecycles;
          if (lc) {
              length = lc.length;
              for (i = 0; i < length; i++) {
                  artifact.attachLifeCycle(lc[i]);
              }
          }
          return artifact;
      };
  
      var ArtifactManager = function (registry, type) {
          this.registry = registry;
          this.manager = new GenericArtifactManager(registry.registry.getChrootedRegistry("/_system/governance"), type);
          this.type = type;
      };
      registry.ArtifactManager = ArtifactManager;
  
      ArtifactManager.prototype.find = function (fn, paging) {
          var i, length, artifacts,
              artifactz = [];
          artifacts = this.manager.findGenericArtifacts(new GenericArtifactFilter({
              matches: function (artifact) {
                  return fn(buildArtifact(this, artifact));
              }
          }));
          length = artifacts.length;
          for (i = 0; i < length; i++) {
              artifactz.push(buildArtifact(this, artifacts[i]));
          }
          return artifactz;
      };
  
      ArtifactManager.prototype.get = function (id) {
          return buildArtifact(this, this.manager.getGenericArtifact(id));
      };
  
      ArtifactManager.prototype.count = function () {
          return this.manager.getAllGenericArtifactIds().length;
      };
  
      ArtifactManager.prototype.list = function (paging) {
          var i,
              artifactz = [],
              artifacts = this.manager.getAllGenericArtifacts(),
              length = artifacts.length;
          for (i = 0; i < length; i++) {
              artifactz.push(buildArtifact(this, artifacts[i]));
          }
          return artifactz;
      };
  
      /*
       {
       name: 'AndroidApp1',
       attributes: {
       overview_status: "CREATED",
       overview_name: 'AndroidApp1',
       overview_version: '1.0.0',
       overview_url: 'http://overview.com',
       overview_provider: 'admin',
       images_thumbnail: 'http://localhost:9763/portal/gadgets/co2-emission/thumbnail.jpg',
       images_banner: 'http://localhost:9763/portal/gadgets/electric-power/banner.jpg'
       },
       lifecycles : ['lc1', 'lc2'],
       content : '<?xml ....>'
       }
       */
      ArtifactManager.prototype.add = function (options) {
          this.manager.addGenericArtifact(createArtifact(this.manager, options));
      };
  
      ArtifactManager.prototype.update = function (options) {
          this.manager.updateGenericArtifact(createArtifact(this.manager, options));
      };
  
      ArtifactManager.prototype.remove = function (id) {
          this.manager.removeGenericArtifact(id);
      };
  
  }(server, registry));