<?xml version="1.0" encoding="UTF-8"?><MetamergeConfig Cycle="32" UUID="874d112a-a265-4edf-af70-b701952d93b6" created="Wed Nov 04 13:21:48 CET 2009" createdBy="Eddie Hartman" main="FileScan" modified="Mon Apr 04 11:12:12 CEST 2011" modifiedBy="Administrator" project="Test" version="7.1">
    














<Connector name="FileScan">
        <InheritFrom>system:/Connectors/ibmdi.ScriptConnector</InheritFrom>
        <ConnectorMode>Iterator</ConnectorMode>
        <ConnectorState>Enabled</ConnectorState>
        <Configuration>
            <UserComment/>
            <InheritFrom>[parent]</InheritFrom>
            <parameter name="$form$"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<MetamergeConfig Cycle="6" UUID="8ecb1c87-38b5-4936-b8a5-6616ffd5935f" created="Wed Nov 04 13:22:37 CET 2009" createdBy="Eddie Hartman" main="Form" modified="Wed Nov 04 13:46:45 CET 2009" modifiedBy="Eddie Hartman" version="7.0">
    


<Form name="Form">
        <FormItemNames>
            <ListItem>directory</ListItem>
            <ListItem>subfolders</ListItem>
            <ListItem>orderby</ListItem>
            <ListItem>direction</ListItem>
        </FormItemNames>
        <FormSectionNames>
            <ListItem>General</ListItem>
        </FormSectionNames>
        <FormItem name="Order">
            <Values>
                <ListItem>ascending</ListItem>
                <ListItem>descending</ListItem>
            </Values>
            <parameter name="syntax">droplist</parameter>
        </FormItem>
        <FormItem name="direction">
            <Values>
                <ListItem>ascending</ListItem>
                <ListItem>descending</ListItem>
            </Values>
            <parameter name="label">Sort direction</parameter>
            <parameter name="syntax">droplist</parameter>
        </FormItem>
        <FormItem name="directory">
            <parameter name="Required">false</parameter>
            <parameter name="label">Directory</parameter>
        </FormItem>
        <FormItem name="editScript">
            <parameter name="label">Script</parameter>
            <parameter name="script">selectGlobalProlog</parameter>
            <parameter name="scriptLabel">Edit Script</parameter>
        </FormItem>
        <FormItem name="orderby">
            <Values>
                <ListItem>path</ListItem>
                <ListItem>name</ListItem>
                <ListItem>size</ListItem>
                <ListItem>last modified date</ListItem>
            </Values>
            <parameter name="label">Order by</parameter>
            <parameter name="syntax">droplist</parameter>
        </FormItem>
        <FormItem name="subfolders">
            <parameter name="label">Search subfolders</parameter>
            <parameter name="syntax">boolean</parameter>
        </FormItem>
        <FormSection name="General">
            <FormSectionNames>
                <ListItem>directory</ListItem>
                <ListItem>subfolders</ListItem>
                <ListItem>direction</ListItem>
                <ListItem>orderby</ListItem>
                <ListItem>$GLOBAL.script</ListItem>
            </FormSectionNames>
        </FormSection>
    </Form>
</MetamergeConfig>
]]></parameter>
            <parameter name="debug">false</parameter>
            <parameter name="direction">descending</parameter>
            <parameter name="directory">C:\Temp</parameter>
            <parameter name="includeFiles"/>
            <parameter name="orderby">last modified date</parameter>
            <parameter name="script"><![CDATA[// FileScan Connector - see the options described below (directory, recursion & sort order)
var vrs = "v.2.3";
// 2011.3.24 - changed GetParam() function so that p will never be null
// 2011.4.4 - fixed file count display

// The directory where the file scan begins
//
var baseDir = "C:\\Temp";  // Point this where to look, or use system.getTDIProperty() to externalize this to a file
var recurse = "false"; // "true" = recurse sub-folders
var sortBy = "path"; // can be "path", "name", "size" or "date" (date = last modified)
var direction = "ascending"; // "ascending" or "descending"


logmsg("** FileScan " + vrs + " recursing: " + recurse);
logmsg("**   searching " + baseDir);
logmsg("**   sort by " + sortBy + " (" + direction + ")");


var filePath = [];
var fileName = [];
var fileSize = [];
var lastModList = [];
var fileIndex = 0;
var scanTime = new java.util.Date();
var sortMap = new java.util.TreeMap();
var sortedKeys = null;
var sortIndex = 0;


//===  Function definitions ===

// This version writes to standard out as well, so you can
// see it from the terminal window where you started TDI.
//
function logmsg(msg, logLevel) {
	if (!logLevel)
		logLevel = "INFO";

	main.logmsg(logLevel, msg);
//	java.lang.System.out.println(msg);
}

// Gets TDI property from System-Properties, which is available
// by default, but will not get persisted.
//
function getParam(pname, defvalue) {
	if (typeof(defvalue) == "unknown" || defvalue == null)
		defvalue = "";
		
	var p = connector.getParam(pname);
		
	if (p == null)
		p = defvalue;
	return p.trim().toLowerCase();
}


// Right-justifies a string
//
function rj(str,len) {
	if (!len)
		return str;

	str = "                                                                                         " + str;
	return str.substring(str.length-len);
}


// Scan this directory
//
function getScanList(fName, depth) {
	var fObj = new java.io.File(fName);
	var key = "";
	
	if (typeof(depth) == "undefined")
		depth = 0;

// 	java.lang.System.out.println("---> Scanning " + fName);

	if (fObj == null)
		throw "Scan directory/file (" + fName + ") not found"
	else
	if (fObj.isFile()) {
		fileIndex++;
		filePath[fileIndex] = fObj.getCanonicalPath()
		fileName[fileIndex] = fObj.getName();
		fileSize[fileIndex] = fObj.length();
		lastModList[fileIndex] = fObj.lastModified();
		switch (sortBy.substring(0,1)) {
			case 'n' /*name*/: key = fileName[fileIndex];
					break;
			case 'p' /*path*/: key = filePath[fileIndex];
					break;
			case 's' /*size*/ : key = rj(fileSize[fileIndex],20) + filePath[fileIndex];
					break;
			default /*date*/: key = rj(lastModList[fileIndex],40) + filePath[fileIndex];
		}
		sortMap.put(key, fileIndex);
	logmsg("@@ fileIndex: " + fileIndex + "   key: '" + key + "'");	
	} else
	if (fObj.isDirectory() && (recurse || depth == 0)) {
		var contents = fObj.listFiles();

		if (contents != null)
			for (var i = 0; i < contents.length; i++)
				getScanList(contents[i], depth+1);
	}
}

function selectEntries()
{
 	logmsg("** FileScan scanning " + baseDir + "  ...");

	getScanList(baseDir, 0);

	sortedKeys = sortMap.keySet().toArray();
	logmsg("**    " + (fileIndex) + " file(s) found");
	
	sortIndex = 0;
}

function getNextEntry ()
{
	var next = "";

	if (sortIndex >= sortedKeys.length) {
		result.setStatus (0);
		result.setMessage ("End of input");
		return;
	}

	if (direction.startsWith("a")) // ascending
		fileIndex = sortMap.get(sortedKeys[sortIndex++])
	else
		fileIndex = sortMap.get(sortedKeys[sortedKeys.length - (++sortIndex)])

	entry.setAttribute("filePath", filePath[fileIndex]);
	entry.setAttribute("fileName", fileName[fileIndex]);
	entry.setAttribute("fileLastModified", new java.util.Date(lastModList[fileIndex]));
	entry.setAttribute("fileIndex", new java.lang.Integer(sortIndex));
	entry.setAttribute("fileSize", new java.lang.Long(fileSize[fileIndex]));
	entry.setAttribute("scanTime", scanTime);
	entry.setAttribute("fileCount", new java.lang.Integer(sortedKeys.length - 1));

	fileIndex++;
}


// Test script below for use inside a test AL
/*
selectEntries();
entry = system.newEntry;
work.merge(getNextEntry())
*/]]></parameter>
            <parameter name="subfolders">true</parameter>
            <parameter name="userComment"/>
        </Configuration>
        <Parser>
            <InheritFrom>[parent]</InheritFrom>
            <Schema name="Input">
                <InheritFrom>[parent]</InheritFrom>
            </Schema>
            <Schema name="Output">
                <InheritFrom>[parent]</InheritFrom>
            </Schema>
        </Parser>
        <AttributeMap name="Input">
            <InheritFrom>[parent]</InheritFrom>
        </AttributeMap>
        <AttributeMap name="Output">
            <InheritFrom>[parent]</InheritFrom>
        </AttributeMap>
        <DeltaSettings>
            <WhenToCommit>After every database operation</WhenToCommit>
            <RowLocking>SERIALIZABLE</RowLocking>
            <ChangeDetectionMode>DETECT_ALL</ChangeDetectionMode>
        </DeltaSettings>
        <Schema name="Input">
            <InheritFrom>[parent]</InheritFrom>
            <SchemaItem>
                <Name>fileCount</Name>
                <Syntax>java.lang.Integer</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileIndex</Name>
                <Syntax>java.lang.Integer</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileLastModified</Name>
                <Syntax>java.util.Date</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileName</Name>
                <Syntax>java.lang.String</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>filePath</Name>
                <Syntax>java.lang.String</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileSize</Name>
                <Syntax>java.lang.Long</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>scanTime</Name>
                <Syntax>java.util.Date</Syntax>
            </SchemaItem>
        </Schema>
        <Schema name="Output">
            <InheritFrom>[parent]</InheritFrom>
            <SchemaItem>
                <Name>fileCount</Name>
                <Syntax>java.lang.Integer</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileIndex</Name>
                <Syntax>java.lang.Integer</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileLastModified</Name>
                <Syntax>java.util.Date</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileName</Name>
                <Syntax>java.lang.String</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>filePath</Name>
                <Syntax>java.lang.String</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>fileSize</Name>
                <Syntax>java.lang.Long</Syntax>
            </SchemaItem>
            <SchemaItem>
                <Name>scanTime</Name>
                <Syntax>java.util.Date</Syntax>
            </SchemaItem>
        </Schema>
        <LinkCriteria>
            <InheritFrom>[parent]</InheritFrom>
        </LinkCriteria>
        <Hooks>
            <InheritFrom>[parent]</InheritFrom>
        </Hooks>
        <CheckpointConfig/>
        <SandboxConfig/>
        <Reconnect>
            <InheritFrom>[parent]</InheritFrom>
            <ReconnectRules/>
        </Reconnect>
        <Operations/>
        <PoolDefinition>
            <InheritFrom>[parent]</InheritFrom>
            <Enabled>false</Enabled>
            <MinPoolSize>0</MinPoolSize>
            <MaxPoolSize>0</MaxPoolSize>
            <PurgeInterval>0</PurgeInterval>
            <InitializeAttempts>1</InitializeAttempts>
            <InitializeSleepInterval>0</InitializeSleepInterval>
        </PoolDefinition>
        <PoolInstance/>
        <InitializeOption>0</InitializeOption>
    </Connector>
</MetamergeConfig>