Share via


Importing Schema

Topic Last Modified: 2006-06-15

This task demonstrates Exchange store programming capabilities.

The following code is for Windows Script Host file that has the following syntax:

cscript importxmlschema.wsf <file-system-folder> <store-folder-url>

The file system folder contains the definitions to import, and the store folder URL is the URL to the destination Exchange store folder. The following is an example of the syntax:

cscript importxmlschema.wsf "c:\exchsrvr\schema" "file://./backofficestorage/%USERDNSDOMAIN%/pub2/test1/schema"

VBScript/JScript

Example


<reference object="ADODB.Record"/>
<script language="vbscript">

Function getVBArray( t )

 l = t.valueOf()
 varr = split(l,",")
 getVBArray = varr

End Function

</script>

<script language="JScript">

 if( WScript.Arguments.Length < 2) {
  WScript.Echo("Usage: cscript importxmlschema.wsf <file-system-folder> <store-folder-url>");
  WScript.Quit();
 }

 var g_FolderRec;
 var filesystem_Folder = WScript.Arguments.Item(0);
 var schema_folderURL = WScript.Arguments.Item(1);

 WScript.Echo("Opening store folder at " + schema_folderURL);

 var g_FolderRec = new ActiveXObject("ADODB.Record");
 g_FolderRec.Open(schema_folderURL);

 WScript.Echo("getting files from " + filesystem_Folder);

 var fso = new ActiveXObject("Scripting.FilesystemObject");
 var fldr = fso.GetFolder(filesystem_Folder);

 var enum_fldr = new Enumerator(fldr.Files);
 for( ; ! enum_fldr.atEnd(); enum_fldr.moveNext()) {
   file = enum_fldr.item();
   WScript.Echo(file.Name);
   parseAndImport( file.Path );
 }

function parseAndImport( filePath ) {

 var Dom = new ActiveXObject("Microsoft.XMLDOM");
 Dom.validateOnParse = false;

 var bParseOkay = Dom.load(filePath);
 if(!bParseOkay) {
   WScript.Echo("Error parsing file");
   WScript.Echo(Dom.parseError.description);
   WScript.Echo(Dom.parseError.srcText);
   WScript.Quit();
 }

 importSchema( Dom , g_FolderRec, file.Name , Dom.xml);

}

function importSchema( Dom , fldrRec, itemName, sxml ) {
 Wscript.Echo("Importing schema from " + itemName + " into " + fldrRec.Fields("DAV:href"));
 var bIsContentClassDef = false;
 var ItemRec = new ActiveXObject("ADODB.Record");
 var itemURL = fldrRec.Fields("DAV:href").Value;
 if(itemURL.charAt(itemURL.length - 1) != "/")
   itemURL += "/";

 itemURL += itemName;
 ItemRec.Open(itemURL, fldrRec.ActiveConnection, adModeReadWrite, adCreateNonCollection);
 var Flds = ItemRec.Fields;

 var SchemaElem = Dom.documentElement;
 var nsMap = getPrefixMap(SchemaElem);
 var ElemType   = SchemaElem.selectSingleNode("ElementType");
 if(ElemType == null) {
  WScript.Echo("ElemType is null");
  WScript.Quit();
 }

 var propname = "";
 var propval  = "";

 var atts = ElemType.attributes;
 var t = true;
 while(t) {
  var n = atts.nextNode();
  if(n == null) {
    t = false;
    break;
  }
  if(n.namespaceURI == "")
    propname = buildStoreQName(n.baseName, nsMap.item("default"));
  else
    propname = buildStoreQName(n.baseName,n.namespaceURI);
  val = n.nodeValue;
  if(val.indexOf(":") != -1) {
    var parts = n.nodeValue.split(":");
    propval  = buildStoreQName(parts[1] , nsMap.item(parts[0]));
  }
  else {
    propval = n.nodeValue;
  }

  if(propname == "DAV:contentclass" && propval == "urn:content-classes:contentclassdef")
    bIsContentClassDef = true

  WScript.Echo(" Setting property: " + propname + ":" + propval);
  Flds.Item(propname) = propval;
 }

 /*
   The extends, element, and expected-content-class properties are multivalued
   for the contentclassdef item
 */

 if(bIsContentClassDef) {
  var Props = new ActiveXObject("Scripting.Dictionary");

  var Kids = ElemType.childNodes;
  var EKids = new Enumerator(Kids);
  var Kid;
  for( ; ! EKids.atEnd(); EKids.moveNext()) {
   Kid = EKids.item();
   propname =  buildStoreQName(Kid.baseName,Kid.namespaceURI);
   temp = Kid.getAttribute("type");
   if(temp.indexOf(":") != -1) {
     var parts = temp.split(":");
     propval  = buildStoreQName(parts[1] , nsMap.item(parts[0]));
   }
   else {
     propval = temp;
   }

   if(!Props.exists(propname)) {
     var pArray = new Array();
     pArray[0] = propval;
     Props.Add(propname, pArray);
   }
   else {
     var temp = Props.Item(propname);
     temp[temp.length] = propval;
   }
  }

  var PropEnum = new Enumerator(Props);
  var PropItem;
  for( ; !PropEnum.atEnd(); PropEnum.moveNext()) {
   PropItem = PropEnum.item();
   WScript.Echo(" Setting property: " + PropItem + ":");
   var t = Props.Item(PropItem);
   for ( v in t ) {
    WScript.Echo("    " + t[v]);
   }
   Flds.Item(PropItem) = getVBArray(Props.Item(PropItem));
  }
 }

 var Stm = Flds.Item(adDefaultStream).Value;
 Stm.WriteText(sxml);
 Stm.Flush();

 Flds.Update();
}

function getPrefixMap(root) {
 var pos1, pos2;
 var prefixMap = new ActiveXObject("Scripting.Dictionary");
 var atts = root.attributes;
 var en;
 en = new Enumerator(atts);

 var item;
 var name;
 for( ;!en.atEnd();en.moveNext()) {
   pos1 = -1;
   pos2 = -1;
   item = en.item();
   name = item.name;
   pos1 = name.indexOf("xmlns");
   if(pos1 > -1) {
     pos2 = name.indexOf("xmlns:", 0);
     if(pos2 == -1) {
      prefixMap.add("default",item.value);
     }
     else {
       name = name.substr(pos1 + 6);
       prefixMap.add(name,item.value);
     }
   }
 }

 return(prefixMap);
}

function buildStoreQName( ncname, nsURI) {
 var c = nsURI.charAt(nsURI.length - 1);
 var sep = "";
 if(":/".indexOf(c) < 0) {
  sep = "#";
 }
 return(nsURI + sep + ncname);
}
</script>