Script globali

Questo argomento illustra gli script globali di ClearQuest.

È possibile utilizzare gli script globali per definire le funzioni comuni che è possibile richiamare da un hook dello schema. Gli script globali sono simili ad una libreria di routine secondarie; il software Rational ClearQuest non le richiama direttamente.

Gli script globali sono utili quando si dispone di più tipi di record che richiamano lo stesso codice di hook. Consentono di centralizzare la manutenzione del codice hook e di evitare la copia del codice hook in più percorsi. Ad esempio, lo script globale incluso nel package Email di Rational ClearQuest consente a più azioni di inviare la notifica richiamando uno script globale.

L'unico modo per richiamare uno script globale è richiamarlo da un altro script. Infine, una chiamata ad uno script globale deve essere tracciato su una chiamata ad un hook basato su record, ad esempio un hook campo, azione o script record. Poiché le chiamate ad uno script globale possono essere sempre tracciate in un hook basato su record, ogni script globale dispone di un oggetto entità implicito che viene inviato all'hook basato su record che ha originato la chiamata.

È possibile scrivere gli script utilizzando VBScript e Perl, ma un tipo di linguaggio non può richiamare l'altro tipo. Durante la scrittura di uno script globale, scriverlo nello stesso linguaggio dello script che lo richiama.

Utilizzare le funzioni solo in un hook globale poiché, a meno che non si trovi in una funzione, tutto il codice presente in uno script globale viene eseguito.

Per ulteriori informazioni, consultare Scrittura di script e Contesto operativo per utilizzare gli script.

Per gli esempi di script relativi, consultare Esempio di script globale.

Utilizzo di routine secondarie per gli script globali

Per Perl, le variabili $entity e $session sono variabili globali che diventano attive quando viene eseguito un hook. Queste variabili sono definite al runtime e possono essere utilizzate nel codice dello script globale. Tuttavia, non utilizzare queste variabili per richiamare i metodi dell'oggetto Entity o Session all'interno del contesto di uno script globale.

Se il codice script globale utilizza queste variabili per richiamare un metodo (quale, $entity->GetSession), la convalida dello schema ha esito negativo poiché $session e $entity non sono definiti fino al momento della convalida. Ad esempio, questo codice esterno a una routine secondaria globale non è valido in quanto non è possibile richiamare il metodo su un valore non definito (session).
$info = $session->GetProductInfo();
Non è sufficiente posizionare la chiamata $session in una routine secondaria globale. Ad esempio,il seguente codice riporta un esito negativo per le stesse ragioni poiché tenta di risolvere $productInfo in fase di compilazione:
$productInfo = GetProductInfo();
   sub GetProductInfo
   {
       return $session->GetProductInfo();
   }

Anziché utilizzare le variabili globali come la chiamata $productInfo GetProductInfo() per richiamare il valore.

Durante l'esecuzione di hook Perl, $session è sempre impostato sulla sessione corrente. Tuttavia, per ottenere risultati ottimali, non definire le variabili globali sensibili ai dati dell'oggetto Session o Entity; ma scrivere funzioni di accesso globali (ad esempio, GetUserLoginName()) per richiamare i valori.

Clonazione dello script globale

Gli script globali devono essere utilizzati come una raccolta di routine secondarie che possono essere richiamate da altri hook (ad esempio, hook controllo accessi, hook inizializzazione e di convalida). Per consentire tale operazione, il codice dello script globale è incluso come parte del codice Perl utilizzato per ogni esecuzione di hook. Tuttavia, il codice dello script globale può includere istruzioni esterne all'ambito della routine secondaria (nell'ambito file).

A partire dalla versione 7.0.1, è disponibile un nuovo potenziamento di hook Perl che esegue la clonazione di script globali. Quando questo potenziamento è abilitato, viene creato un ambiente hook Perl; tutto il codice dello script globale viene compilato e poi clonato per creare nuovi ambienti hook. Il processo di clonazione impedisce la ricompilazione del codice e consente agli ambienti hook di condividere una struttura di analisi. La clonazione degli script consente di risparmiare tempo e memoria per ogni ambiente hook Perl, che fornisce risultati ottimali (con miglioramenti significativi per Rational ClearQuest Web).

Gli sviluppatori di schemi devono considerare le modalità di utilizzo della clonazione durante la scrittura di script globali. Se la clonazione è abilitata per gli hook globali, le istruzioni dell'ambito file presenti negli script globali vengono eseguite una sola volta. I risultati vengono poi clonati per gli interpreti Perl successivi. Se la clonazione è disabilitata, questo codice viene eseguito ogni volta che viene creato l'ambiente hook (una volta per ogni azione di record e una per ogni chiamata script del record).

Per evitare confusione in merito all'esecuzione del codice di impostazione negli script globali clonati, spostare tale codice che si trova nell'ambito file all'interno di una routine secondaria e utilizzare una variabile globale our clonata in modo specifico per verificare lo stato di impostazione. È possibile accertare che il codice di impostazione venga sempre eseguito almeno una volta in ogni ambiente hook ed evitare più esecuzioni. Questo cab di routine secondaria di impostazione viene richiamato da qualsiasi hook che richiede il completamento dell'impostazione. Ad esempio:
  our $run_once;
   sub DoSetup
   {
       return if defined($run_once);
       $run_once = 1;
       # do setup here
   }
sub Defect_Initialization {
 DoSetup();
 # …
 # …
 #reset of Defect_Initialization code….
 # …
 }

In questo esempio di codice, la variabile $run_once non è definita quando viene creato un ambiente hook. Quando viene clonato, questa variabile non è ancora definita. Quando gli hook vengono eseguiti per la prima volta e viene richiamato DoSetup(), viene eseguito il codice di impostazione.

Nota: La clonazione dello script globale Perl richiede che le librerie Perl richiamate dal codice dell'utente siano thread-safe. Ad esempio,
use Win32::OLE;
non deve essere utilizzato nel codice hook clonato (ma può essere utilizzato nel codice hook non clonato, inclusi gli hook azione, campo e record). Win32::OLE non è thread-safe, ma può essere utilizzato al di fuori di un ambiente multithread ClearQuest Web. Ad esempio, è possibile utilizzare
require Win32::OLE; import Win32::OLE;
nello script globale per impedire che il modulo Win32::OLE venga clonato, ma il modulo non deve essere utilizzato negli schemi utilizzati con Rational ClearQuest Web.
Attenzione: IBM non garantisce che i moduli Perl siano thread-safe poiché essi esulano dal controllo di IBM. Per sapere se un modulo è thread-safe, consultare la documentazione Perl all'indirizzo http://www.perl.org.

Feedback