package org.alfresco.filesys.repo.desk; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import org.alfresco.filesys.alfresco.AlfrescoContext; import org.alfresco.filesys.alfresco.DesktopAction; import org.alfresco.filesys.alfresco.DesktopActionException; import org.alfresco.filesys.alfresco.DesktopParams; import org.alfresco.filesys.alfresco.DesktopResponse; import org.alfresco.jlan.server.filesys.DiskSharedDevice; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.scripts.ScriptException; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.ScriptService; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.ResourceFinder; import org.springframework.core.io.Resource; import org.springframework.extensions.config.ConfigElement; /** * Javascript Desktop Action Class * *
Run a server-side script against the target node(s).
*
* @author gkspencer
*/
public class JavaScriptDesktopAction extends DesktopAction {
// Script name
private String m_scriptName;
// Script file details
private Resource m_scriptResource;
private Long m_lastModified;
// Script string
private String m_script;
/**
* Class constructor
*/
public JavaScriptDesktopAction()
{
super( 0, 0);
}
/**
* Return the confirmation string to be displayed by the client
*
* @return String
*/
@Override
public String getConfirmationString()
{
return "Run Javascript action";
}
/**
* Perform standard desktop action initialization
*
* @param global ConfigElement
* @param config ConfigElement
* @param fileSys DiskSharedDevice
* @exception DesktopActionException
*/
@Override
public void standardInitialize(ConfigElement global, ConfigElement config, DiskSharedDevice fileSys)
throws DesktopActionException
{
// Perform standard initialization
super.standardInitialize(global, config, fileSys);
// Get the script file name and check that it exists
ConfigElement elem = config.getChild("script");
if ( elem != null && elem.getValue().length() > 0)
{
// Set the script name
setScriptName(elem.getValue());
}
else
throw new DesktopActionException("Script name not specified");
// check if the desktop action attributes have been specified
elem = config.getChild("attributes");
if ( elem != null)
{
// Check if the attribute string is empty
if ( elem.getValue().length() == 0)
throw new DesktopActionException("Empty desktop action attributes");
// Parse the attribute string
setAttributeList(elem.getValue());
}
// Check if the desktop action pre-processing options have been specified
elem = config.getChild("preprocess");
if ( elem != null)
{
setPreprocess(elem.getValue());
}
}
@Override
public void initializeAction(ServiceRegistry serviceRegistry, AlfrescoContext filesysContext)
throws DesktopActionException
{
// Perform standard initialization
super.initializeAction(serviceRegistry, filesysContext);
// Get the script file name and check that it exists
if ( m_scriptName == null || m_scriptName.length() == 0)
{
throw new DesktopActionException("Script name not specified");
}
// Check if the script exists on the classpath
m_scriptResource = new ResourceFinder().getResource(m_scriptName);
if (!m_scriptResource.exists())
{
throw new DesktopActionException("Failed to find script on classpath, " + getScriptName());
}
// Get the script modification date if it can be resolved to a file
try
{
m_lastModified = m_scriptResource.lastModified();
}
catch (IOException e)
{
// Don't worry if we can't. Assume it's embedded in a resource.
}
// Load the script
try
{
loadScript( m_scriptResource);
}
catch ( IOException ex)
{
throw new DesktopActionException( "Failed to load script, " + ex.getMessage());
}
}
/**
* Run the desktop action
*
* @param params DesktopParams
* @return DesktopResponse
*/
@Override
public DesktopResponse runAction(DesktopParams params)
throws DesktopActionException
{
synchronized (this)
{
try
{
if (m_lastModified != null && m_scriptResource.lastModified() != m_lastModified)
{
// Reload the script if we can
m_lastModified = m_scriptResource.lastModified();
loadScript(m_scriptResource);
}
}
catch (IOException ex)
{
logger.warn("Failed to reload script file, " + m_scriptResource.getDescription(), ex);
}
}
// Access the script service
final ScriptService scriptService = getServiceRegistry().getScriptService();
if ( scriptService != null)
{
// Create the objects to be passed to the script
final Map