// API Pool Default Variables variables.defaultApiPoolRequestWaitTime = 200; // ms variables.defaultApiPoolGlobalTimeout = 15; // seconds // initialize the API POOL memory variables initApiPoolVars(); var adfAPIpoolVars = StructNew(); var adfAPIpoolConfig = StructNew(); //-----// // Build the ADF API POOL Configuration data structure // associative array of configured pages adfAPIpoolConfig.Pages = buildPoolConduitPagesFromAPIConfig(); adfAPIpoolConfig.Elements = buildElementConfigFromAPIConfig(); // CEConfigName : "poolDevCE" // - formID : 5630 // - ceName : "Pool Dev Custom Element" // - timeout: 30 // Request Wait Time in milliseconds adfAPIpoolConfig.requestWaitTime = getRequestWaitTimeFromAPIConfig(); // Global Timeout in seconds adfAPIpoolConfig.globalTimeout = getGlobalTimeoutFromAPIConfig(); // Page Pool Logging Flag adfAPIpoolConfig.logging = getLoggingFlagFromAPIConfig(); //-----// // Build the ADF API POOL data structure. // associative array of available pages adfAPIpoolVars.AvailablePoolPages = variables.data.duplicateStruct(adfAPIpoolConfig.Pages); // Duplicate Config Page for the Pool Available pages // associative array of Pages that are being processed adfAPIpoolVars.ProcessingPoolPages = StructNew(); // An array of pending Requests adfAPIpoolVars.RequestQueueArray = ArrayNew(1); //-----// // Setup the Config Application variables (static) WritePagePoolConfig(configData=adfAPIpoolConfig); // Setup the Pool Vars Application variables (dynamic) WritePagePool(poolData=adfAPIpoolVars); var retData = getGlobalTimeoutFromAPIConfig(); var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"GLOBALTIMEOUT") AND IsNumeric(apiPoolConfig.GLOBALTIMEOUT) AND apiPoolConfig.GLOBALTIMEOUT GT 0 ) retData = apiPoolConfig.GLOBALTIMEOUT; return retData; var retData = getRequestWaitTimeFromAPIConfig(); var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"REQUESTWAITTIME") AND IsNumeric(apiPoolConfig.requestWaitTime) AND apiPoolConfig.requestWaitTime GT 0 ) retData = apiPoolConfig.REQUESTWAITTIME; return retData; var retData = false; var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"LOGGING") AND IsBoolean(apiPoolConfig.LOGGING) ) retData = apiPoolConfig.LOGGING; return retData; var retTimeout = getGlobalTimeoutFromAPIConfig(); var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"ELEMENTS") AND StructKeyExists(apiPoolConfig.ELEMENTS,arguments.CEconfigName) AND StructKeyExists(apiPoolConfig.ELEMENTS[arguments.CEconfigName],"TIMEOUT") ) retTimeout = apiPoolConfig.ELEMENTS[arguments.CEconfigName].TIMEOUT; return retTimeout; var retVal = 0; var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"ELEMENTS") AND StructKeyExists(apiPoolConfig.ELEMENTS,arguments.CEconfigName) AND StructKeyExists(apiPoolConfig.ELEMENTS[arguments.CEconfigName],"FormID") AND IsNumeric(apiPoolConfig.ELEMENTS[arguments.CEconfigName].FormID) ) retVal = apiPoolConfig.ELEMENTS[arguments.CEconfigName].FormID; return retVal; var retVal = ""; var apiPoolConfig = ReadPagePoolConfig(); // Get the Custom Element Name ... if not available use the CEconfigName (in this case most likely the same value) if ( StructKeyExists(apiPoolConfig,"ELEMENTS") AND StructKeyExists(apiPoolConfig.ELEMENTS,arguments.CEconfigName) AND StructKeyExists(apiPoolConfig.ELEMENTS[arguments.CEconfigName],"CustomElementName") ) retVal = apiPoolConfig.ELEMENTS[arguments.CEconfigName].CustomElementName; else retVal = arguments.CEconfigName; return retVal; var retVal = 0; var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"PAGES") AND StructKeyExists(apiPoolConfig.PAGES,arguments.pageid) AND StructKeyExists(apiPoolConfig.PAGES[arguments.pageid],"SubsiteID") AND IsNumeric(apiPoolConfig.PAGES[arguments.pageid].SubsiteID) ) retVal = apiPoolConfig.PAGES[arguments.pageid].SubsiteID; return retVal; var retVal = ""; var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"PAGES") AND StructKeyExists(apiPoolConfig.PAGES,arguments.pageid) AND StructKeyExists(apiPoolConfig.PAGES[arguments.pageid],"csUserID") ) retVal = apiPoolConfig.PAGES[arguments.pageid].csUserID; return retVal; var retData = StructNew(); var apiPoolConfig = ReadPagePoolConfig(); if ( StructKeyExists(apiPoolConfig,"PAGES") ) retData = apiPoolConfig.PAGES; return retData; var results = StructNew(); var pos = 0; results.PageID = 0; results.Status = false; // check if request is in array, but not first in line pos = getRequestsPlaceInQueue(requestID=arguments.RequestID); if( pos neq 1 ) return results; // only process if first in line results.PageID = getOpenConduitPageIDFromPool(requestID=arguments.RequestID); // returns 0 if none if ( results.PageID NEQ 0 ) { // if we have a pageID get the API Config Info for this page (subsiteID,csuserid) results.SubsiteID = getConduitPageSubsiteID(pageID=results.PageID); results.csuserid = getConduitPageCSUserID(pageID=results.PageID); results.FORMID = getElementConfigFormID(CEconfigName=arguments.CEconfigName); results.TIMEOUT = getElementConfigTimeout(CEconfigName=arguments.CEconfigName); results.CUSTOMELEMENTNAME = getElementConfigCEName(CEconfigName=arguments.CEconfigName); // if we have a PageID remove the Pending Request from the Queue if ( pos EQ 1 ) results.Status = removeRequestFromQueue(queuePos=pos); } var i = 0; var pos = 0; var addToQueue = false; var requestQueue = ReadRequestQueueArray(); // LOCKing handle here by the parent calling method getConduitPageFromPool() for( i=1; i lte ArrayLen(requestQueue); i=i+1 ) { if ( requestQueue[i] eq arguments.requestID ) { pos = i; break; } } if ( pos eq 0 ) // didn't find the request in the queue { // LOCKing handle here by the parent calling method getConduitPageFromPool() // Add to queue addToQueue = addRequestToQueue(requestID=arguments.requestID); pos = getRequestQueueCount(); } return pos; var addRequest = false; var requestQueue = ReadRequestQueueArray(); var requestQueueList = ArrayToList(requestQueue); // add the request to the queue array if ( !ListFindNoCase(requestQueueList, arguments.requestID) ) addRequest = ArrayAppend( requestQueue, arguments.requestID ); // write array data to the Queue WriteRequestQueueArray(queueData=requestQueue); return addRequest; var retCnt = 0; var requestQueue = ReadRequestQueueArray(); retCnt = ArrayLen(requestQueue); return retCnt; var delStatus = false; var requestQueue = ReadRequestQueueArray(); // LOCKing handled here by the parent calling method getConduitPageFromPool() if ( ArrayLen(requestQueue) GTE arguments.queuePos ) delStatus = ArrayDeleteAt(requestQueue,arguments.queuePos); // Update the Request Queue array WriteRequestQueueArray(queueData=requestQueue); return delStatus; var retPageID = 0; var availablePagesInPool = ReadPoolAvailablePages(); var processingPages = ReadPoolProcessingPages(); var key = 0; var processingPageData = StructNew(); for ( key IN availablePagesInPool ) { // Check to make sure the page is not currently processing if ( !StructKeyExists(processingPages,key) ) { // Check if Page is LOCKED in the LOCKS table // - if no CommonSpot lock set for this pageid then use it, if there is a LOCK on this Page move on to the next pageID if ( !IsPageLocked(csPageID=key) ) { // If we are here... the Page is OPEN!! retPageID = key; // LOCKing handled here by the parent calling method getConduitPageFromPool() // Add to Processing Page Assoc array processingPageData = StructNew(); processingPageData.requestID = arguments.requestID; processingPageData.timestamp = pagePoolDateTimeFormat(Now()); //processingPage.timestamp = createObject('java','java.text.SimpleDateFormat').init('yyyy-MM-dd HH:mm:ss.SSS Z').format(now()); processingPages[retPageID] = processingPageData; // Update the Processing Pool Pages WritePoolProcessingPages(pagesData=processingPages); // LOCKing handled here by the parent calling method getConduitPageFromPool() // Remove from Available Pages Assoc array StructDelete(availablePagesInPool,retPageID); WritePoolAvailablePages(pagesData=availablePagesInPool); // Force the loop to quit once we have provided an open pageID break; } } } return retPageID; var retCnt = 0; var poolPages = ReadPoolAvailablePages(); retCnt = StructCount(poolPages); return retCnt; var retCnt = 0; var poolPages = ReadPoolProcessingPages(); retCnt = StructCount(poolPages); return retCnt; var retStatus = false; var requestPageID = 0; var openPageID = 0; requestPageID = getPageIDFromProcessingRequests(requestID=arguments.requestID); openPageID = setPoolPageAsOpen(pageID=requestPageID); // Clear the lock on the page when putting in back in the Pool clearLock(csPageID=requestPageID); if ( requestPageID NEQ 0 AND openPageID NEQ 0 ) retStatus = true; return retStatus; var retPageID = 0; var openPoolPage = StructNew(); var configPoolPages = getConfigConduitPages(); var processingPoolPages = ReadPoolProcessingPages(); var availablePoolPages = ReadPoolAvailablePages(); //var csData = server.ADF.objectFactory.getBean("csdata_1_2"); // LOCKing handled here by the parent calling method getConduitPageFromPool() if ( StructKeyExists(processingPoolPages,arguments.pageID) ) { // Remove the Processing PageID from the ProcessingPoolPages StructDelete(processingPoolPages,arguments.pageID); // Update the Processing pages Struture WritePoolProcessingPages(pagesData=processingPoolPages); // Add PageID back to available pages if ( variables.csData.isCSPageActive(pageid=arguments.pageID) ) { if ( !StructKeyExists(availablePoolPages,arguments.pageID) ) availablePoolPages[arguments.pageID] = StructNew(); availablePoolPages[arguments.pageID].SubsiteID = getConduitPageSubsiteID(pageID=arguments.PageID); availablePoolPages[arguments.pageID].csuserid = getConduitPageCSUserID(pageID=arguments.PageID); // Add back to the AvailablePoolPages WritePoolAvailablePages(pagesData=availablePoolPages); retPageID = arguments.pageID; } else { //TODO: Add logging } } return retPageID; var retPageID = 0; var key = ""; var processingPages = ReadPoolProcessingPages(); for ( key IN processingPages ) { if ( StructKeyExists(processingPages[key],"requestID") AND processingPages[key].requestID EQ arguments.requestID ) { retPageID = key; break; } } return retPageID; var retValue = 0; var qryControlInstance = QueryNew("temp"); var controlID = 0; var CreationDate = ""; SELECT * FROM controlinstance WHERE ControlType = AND PageID = INSERT INTO controlinstance ( PageID,ControlID,ControlName,ControlType,ParentControlID,ParentControlType,CreationDate,OwnerID ) VALUES ( , , , , , , , ); var pageComponent = server.CommonSpot.api.getObject('page'); var lockStatus = pageComponent.getLockStatus(pageID=arguments.csPageID); return lockStatus; var lockStatus = getPageLockStatus(csPageID=arguments.csPageID); var isLocked = false; if ( StructKeyExists(lockStatus,"userID") AND IsNumeric(lockStatus.userID) AND lockStatus.userID GT 0 ) isLocked = true; return isLocked; var poolDateTime = ''; if ( isDate(arguments.datetime) ) poolDateTime = createObject('java','java.text.SimpleDateFormat').init('yyyy-MM-dd HH:mm:ss.SSS').format(arguments.datetime); // yyyy-MM-dd HH:mm:ss.SSS Z return poolDateTime; var retData = StructNew(); var apiConfig = getAPIConfig(); var key = ""; var poolPages = StructNew(); var poolPageID = 0; var poolPageConfig = StructNew(); var configNodeStatus = true; //var csData = server.ADF.objectFactory.getBean("csdata_1_2"); // Do we have a Conduit Page Pool in the Config element if ( StructKeyExists(apiConfig,"gceConduitPagePool") AND StructKeyExists(apiConfig.gceConduitPagePool,"conduitPages") ) { poolPages = apiConfig.gceConduitPagePool.conduitPages; if ( IsStruct(poolPages) ) { // Rip through the gceConduitPagePool nodes and find element that have conduit pool pages configured for ( key IN poolPages ) { poolPageConfig = StructNew(); configNodeStatus = true; // Make sure we have a valid pageID if ( StructKeyExists(poolPages[key],"pageid") AND IsNumeric(poolPages[key].pageid) AND poolPages[key].pageid GT 0 ) { // Make sure the config pageid value is an active page if ( variables.csData.isCSPageActive(pageid=poolPages[key].pageid) ) { // Set the Conduit PageID poolPageID = poolPages[key].pageid; // Set the Conduit SubsiteID poolPageConfig.subsiteID = variables.csData.getSubsiteIDByPageID(pageid=poolPageID); if ( poolPageConfig.subsiteID LTE 0 ) configNodeStatus = false; } else configNodeStatus = false; if ( configNodeStatus ) poolPageConfig.pageURL = variables.csData.getCSPageURL(pageID=poolPageID); } // If PageURL is configured, make sure it converts to a valid pageID else if ( StructKeyExists(poolPages[key],"pageURL") AND LEN(TRIM(poolPages[key].pageURL)) ) { // Add the Page URL to the page pool config struct poolPageConfig.pageURL = poolPages[key].pageURL; poolPageID = variables.csData.getCSPageIDByURL(csPageURL=poolPageConfig.pageURL); // Make sure the pageid value valid and an active page if ( IsNumeric(poolPageID) AND poolPageID GT 0 AND variables.csData.isCSPageActive(pageid=poolPageID) ) { // Set the Conduit SubsiteID poolPageConfig.subsiteID = variables.csData.getSubsiteIDByPageID(pageid=poolPageID); if ( poolPageConfig.subsiteID LTE 0 ) configNodeStatus = false; } else configNodeStatus = false; } else configNodeStatus = false; // Make sure the page has a configured CSUserID if ( configNodeStatus AND StructKeyExists(poolPages[key],"csuserid") AND LEN(TRIM(poolPages[key].csuserid)) ) poolPageConfig.csuserid = poolPages[key].csuserid; else configNodeStatus = false; // Don't add the PW to the config struct but we still want to check if the PW was added to the pool page config // - TODO: we may want to add a quick login/logout check to make sure the userid and password are valid before adding the to the POOL if ( configNodeStatus ) { if ( !StructKeyExists(poolPages[key],"cspassword") OR LEN(TRIM(poolPages[key].cspassword)) EQ 0 ) configNodeStatus = false; } // If we successfully build a pool page config node, then add it to the array if ( configNodeStatus AND !StructKeyExists(retData, poolPageID) ) retData[poolPageID] = poolPageConfig; else { // TODO: Add logging } } } else { // The GCE Conduit Page Pool nodes is configured incorrectly (not returning as a structure) // TODO: Add logging } } else { // No GCE Conduit Page Pool nodes configured // TODO: Add logging } return retData; var retData = StructNew(); var poolElements = StructNew(); var apiConfig = getAPIConfig(); var key = ""; var poolPageID = 0; var i = 1; //var ceData = server.ADF.objectFactory.getBean("cedata_2_0"); var timeoutDefault = getGlobalTimeoutFromAPIConfig(); if ( IsStruct(apiConfig) ) { if ( StructKeyExists(apiConfig,"elements") AND IsStruct(apiConfig.elements) ) { // Rip through the element nodes and find elements that have conduit pool pages configured for ( key IN apiConfig.elements ) { if ( StructKeyExists(apiConfig.elements[key],"elementType") AND apiConfig.elements[key].elementType EQ "custom" AND StructKeyExists(apiConfig.elements[key],"gceConduitConfig") AND IsStruct(apiConfig.elements[key].gceConduitConfig) ) { poolElements = apiConfig.elements[key].gceConduitConfig; if ( !StructKeyExists(retData, key) ) retData[key] = StructNew(); retData[key].timeout = timeoutDefault; if ( StructKeyExists(poolElements,"timeout") AND IsNumeric(poolElements.timeout) AND poolElements.timeout GT 0 ) retData[key].timeout = poolElements.timeout; if ( StructKeyExists(poolElements,"formID") AND IsNumeric(poolElements.formID) AND poolElements.formID GT 0 ) { retData[key].formID = poolElements.formID; retData[key].customElementName = variables.ceData.getCENameByFormID(FormID=poolElements.formID); } else if ( StructKeyExists(poolElements,"customElementName") AND LEN(TRIM(poolElements.customElementName)) ) { retData[key].customElementName = poolElements.customElementName; retData[key].formID = variables.ceData.getFormIDByCEName(CEName=poolElements.customElementName); } } else { // TODO: Add logging } } } else { // TODO: Add logging // apiConfig.elements is not building correctly (should be a structure of CCAPI element and settings) } } else { // TODO: Add logging // apiConfig is not building correctly (should be a structure of CCAPI config settings) } return retData; var retData = variables.defaultApiPoolGlobalTimeout; var apiConfig = getAPIConfig(); if ( StructKeyExists(apiConfig,"gceConduitPagePool") AND StructKeyExists(apiConfig.gceConduitPagePool,"globalTimeout") AND IsNumeric(apiConfig.gceConduitPagePool.globalTimeout) AND apiConfig.gceConduitPagePool.globalTimeout GT 0 ) retData = apiConfig.gceConduitPagePool.globalTimeout; return retData; var retData = 0; // default: false var apiConfig = getAPIConfig(); if ( StructKeyExists(apiConfig,"gceConduitPagePool") AND StructKeyExists(apiConfig.gceConduitPagePool,"logging") AND IsBoolean(apiConfig.gceConduitPagePool.logging) ) retData = apiConfig.gceConduitPagePool.logging; return retData; var retData = variables.defaultApiPoolRequestWaitTime; var apiConfig = getAPIConfig(); if ( StructKeyExists(apiConfig,"gceConduitPagePool") AND StructKeyExists(apiConfig.gceConduitPagePool,"requestWaitTime") AND IsNumeric(apiConfig.gceConduitPagePool.requestWaitTime) AND apiConfig.gceConduitPagePool.requestWaitTime GT 0 ) retData = apiConfig.gceConduitPagePool.requestWaitTime; return retData; var apiConfig = getAPIConfig(); var poolPages = StructNew(); var retPassword = ""; if ( StructKeyExists(apiConfig,"gceConduitPagePool") AND StructKeyExists(apiConfig.gceConduitPagePool,"conduitPages") ) { poolPages = apiConfig.gceConduitPagePool.conduitPages; for ( key IN poolPages ) { if ( StructKeyExists(poolPages[key],"pageid") AND poolPages[key].pageid EQ arguments.pageID AND StructKeyExists(poolPages[key],"cspassword") ) { // TODO: encrypt/decrypt this password retPassword = poolPages[key].cspassword; break; } } } return retPassword; if ( !StructKeyExists(Application.ADF,"apiPoolConfig") ) Application.ADF.apiPoolConfig = StructNew(); Application.ADF.apiPoolConfig = arguments.configData; if ( !StructKeyExists(Application.ADF,"apipool") ) Application.ADF.apipool = StructNew(); Application.ADF.apipool = arguments.poolData; if ( !StructKeyExists(Application.ADF.apipool,"AvailablePoolPages") OR !IsStruct(Application.ADF.apipool.AvailablePoolPages) ) Application.ADF.apipool.AvailablePoolPages = StructNew(); return Application.ADF.apipool.AvailablePoolPages; if ( !StructKeyExists(Application.ADF.apipool,"AvailablePoolPages") OR !IsStruct(Application.ADF.apipool.AvailablePoolPages) ) Application.ADF.apipool.AvailablePoolPages = StructNew(); Application.ADF.apipool.AvailablePoolPages = arguments.pagesData; if ( !StructKeyExists(Application.ADF.apipool,"ProcessingPoolPages") OR !IsStruct(Application.ADF.apipool.ProcessingPoolPages) ) Application.ADF.apipool.ProcessingPoolPages = StructNew(); return Application.ADF.apipool.ProcessingPoolPages; if ( !StructKeyExists(Application.ADF.apipool,"ProcessingPoolPages") OR !IsStruct(Application.ADF.apipool.ProcessingPoolPages) ) Application.ADF.apipool.ProcessingPoolPages = StructNew(); Application.ADF.apipool.ProcessingPoolPages = arguments.pagesData; if ( !StructKeyExists(Application.ADF.apipool,"RequestQueueArray") OR !IsArray(Application.ADF.apipool.RequestQueueArray) ) Application.ADF.apipool.RequestQueueArray = ArrayNew(1); return Application.ADF.apipool.RequestQueueArray; if ( !StructKeyExists(Application.ADF.apipool,"RequestQueueArray") OR !IsArray(Application.ADF.apipool.RequestQueueArray) ) Application.ADF.apipool.RequestQueueArray = ArrayNew(1); Application.ADF.apipool.RequestQueueArray = arguments.queueData;