Check Module for Bad Layout DXL

layout12It is common for modules to contain layout DXL columns that cause DXL errors when the view is loaded. This may be due to #included files being removed or because of syntax errors in the layout DXL itself. Most frustrating is when the default view for the module contains a column that causes DXL errors. This prevents scripts from running unattended. This function scans a module for layout DXL and reports any errors that are found.

// Check module for bad layout DXL

/*
   It is common for modules to contain layout DXL columns that cause
   DXL errors when the view is loaded. This may be due to #included
   files being removed or because of syntax errors in the layout DXL itself.

   Most frustrating is when the default view for the module contains
   a column that causes DXL errors. This prevents scripts from running
   unattended.

   This function scans a module for layout DXL and reports any errors
   that are found.

   Tony Goodman.
*/

/************************************
	checkModuleForBadLayoutDxl

	Checks the given module for bad layout DXL.
*************************************/
void checkModuleForBadLayoutDxl(string modName)
{
	Module m              = null
	string viewName       = ""
	string defViewUser    = ""
	string defViewModule  = ""
	string sRes           = ""
	Column c              = null
	string dxlCode        = ""
	bool   bRes           = false
	int    errors         = 0

	print("Module: " modName "\n")

	// suspend error reporting and open module in background
	noError

	m = read(modName, false)

	// we ignore any errors generated because these will be picked up
	// later when we loop through all the views.
	sRes = lastError

	// check that the module was opened successfully
	if (null m)
	{
		print("ERROR opening module: " sRes "\n")
		return
	}

	// get the user's default view
	defViewUser = getDefaultViewForUser(m)

	// if there is a default view then clear it to ensure module is opened in "Standard view"
	if (!null defViewUser)
	{
		sRes = clearDefaultViewForUser(m)

		if (sRes != "")
		{
			print("ERROR clearing default view for user: " sRes "\n")
			close(m)
			return
		}
	}

	// get the module's default view
	defViewModule = getDefaultViewForModule(m)

	// if there is a default view then clear it to ensure module is opened in "Standard view"
	if (!null defViewModule)
	{
		sRes = clearDefaultViewForModule(m)

		if (sRes != "")
		{
			print("ERROR clearing default view for module: " sRes "\n")
			close(m)
			return
		}
	}

	// open module visible so we can load the views
	m = read(modName, true)

	// loop through the views in the module
	for viewName in views(m) do
	{
		print("View \"" viewName "\"...\t")

		// error count for this view
		errors = 0

		// suspend error reporting
		noError

		// load the view
		bRes = load(m, view viewName)

		if (!bRes)
		{
			// view was not loaded - continue to next view
			print("ERROR loading view - Columns not checked!\n")
			lastError
			continue
		}

		// loop through the columns in the view
		for c in m do
	    {
		    // get the layout DXL - this will return null if this is not a layout dxl column
	        dxlCode = dxl(c)

	        if (dxlCode "" != "")
	        {
		        // check the layout dxl for errors
		        sRes = checkDXL(dxlCode)

		        if (sRes "" != "")
		        {
			        // report bugs
					print("ERROR in Layout DXL Column: \"" title(c) "\"\n")
					errors++
		        }
	        }
	    }

	    // resume error reporting - no need to check for errors because we
	    // already checked the layout dxl
	    sRes = lastError

	    // if there were no errors in this view - report OK to user
	    if (errors == 0)
	    {
		    print("OK\n")
	    }
	}

	// reset the user's default view (if there was one)
	if (!null defViewUser)
	{
		setDefaultViewForUser(m, defViewUser)
	}

	// reset the module's default view (if there was one)
	if (!null defViewModule)
	{
		setDefaultViewForModule(m, defViewModule)
	}

	// close the module
	close(m)

	print("\n")
}