<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	 "/WEB-INF/classes/struts-2.3.dtd">

<struts>

    <!-- ========================================== Configuration File Includes -->
    <!-- Include Struts 2 default configuration (from Struts 2 JAR) -->
    <include file="struts-default.xml" />

    <!-- =================================================== Property Constants -->
	<!-- changed limit to use a build property. -->
	<constant name="struts.multipart.maxSize" value="${portal.upload.size.limit}" />

    <constant name="struts.devMode" value="false" />
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <constant name="struts.custom.i18n.resources" value="MessageResources,errors,tools" />
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.mapper.action.prefix.enabled" value="true" />
    <!-- constant name="strus.ui.theme" value="css_xhtml"/ -->
    <!--constant name="struts.codebehind.pathPrefix" value="/pages/"/-->

	<!-- Excludes url http://host/app/upload from handling by struts.  Only one allowed. -->
	<!-- For tus file upload -->
	<!--
	<constant name="struts.action.excludePattern" value="/files,/files/[0-9a-zA-Z_]*,/pages/tus,/pages/tus/.*" />
	-->
	<constant name="struts.action.excludePattern" value="/files,/files/[0-9a-zA-Z_]*" />

    <!-- ============================================================= Packages -->
    <!-- Default NGBW web application package -->
    <!--<package name="default" extends="struts-default">-->
    <package namespace="/" name="default" extends="struts-default,json-default">

        <!-- =================================================== Result Types -->
        <result-types>
            <!--<result-type name="json" class="org.apache.struts2.json.JSONResult"/>-->
            <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>

        <!-- ===================================================== Interceptors -->
        <interceptors>

            <!-- Login interceptor -->
            <interceptor
                    name="loginInterceptor"
                    class="org.ngbw.web.interceptors.LoginInterceptor" />
            
            <!-- User authentication interceptor -->
            <interceptor
                    name="authenticationInterceptor"
                    class="org.ngbw.web.interceptors.AuthenticationInterceptor" />
            
            <!-- Unsupported Characters Filter interceptor -->
<!--            <interceptor
                    name="unsupportedCharsInterceptor"
                    class="org.ngbw.web.interceptors.UnsupportedCharactersFilter" />-->
            
            <!-- User Administrator Role validator -->
            <interceptor
                    name="adminRoleValidator"
                    class="org.ngbw.web.interceptors.AdministratorRoleValidator" />

            <!-- Menu navigation interceptor -->
            <interceptor
                    name="navigation"
                    class="org.ngbw.web.interceptors.NavigationInterceptor" />

            <!-- Copied from struts-default.xml and changed validation exclude methods -->
            <interceptor-stack name="builtInInterceptorsStack">
                <interceptor-ref name="exception" />
                <interceptor-ref name="alias" />
                <interceptor-ref name="servletConfig" />
                <interceptor-ref name="prepare" />
                <interceptor-ref name="i18n" />
                <interceptor-ref name="chain" />
                <interceptor-ref name="debugging" />
                <interceptor-ref name="profiling" />
                <interceptor-ref name="scopedModelDriven" />
                <interceptor-ref name="modelDriven" />
                <interceptor-ref name="fileUpload">
                    <param name="maximumSize">${portal.upload.size.limit}</param>
                </interceptor-ref>
                <interceptor-ref name="checkbox" />
                <interceptor-ref name="staticParams" />
                <interceptor-ref name="params">
                    <!--
                    <param name="excludeParams">dojo\..*</param>
                    -->
                    <param name="excludeParams">dojo\..*,^struts\..*,struts.token,struts.token.name</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError" />
                <interceptor-ref name="validation">
                    <param name="excludeMethods">cancel,execute,delete,edit,list</param>
                </interceptor-ref>

				<!--
					Terri: we don't use struts xml validation so I don't think we need this interceptor
					and there are cases where we are passing actionErrors and it prevents authInterceptor
					from being called.
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
				-->
            </interceptor-stack>

            <!-- Basic user authentication interceptor stack -->
            <interceptor-stack name="authenticationStack">
                <interceptor-ref name="builtInInterceptorsStack">
                    <!-- log stack traces for uncaught exceptions -->
                    <param name="exception.logEnabled">true</param>
                    <param name="exception.logLevel">ERROR</param>
                </interceptor-ref>
                <interceptor-ref name="authenticationInterceptor" />
            </interceptor-stack>

            <interceptor-stack name="loginStack">
                <interceptor-ref name="builtInInterceptorsStack" />
                <interceptor-ref name="loginInterceptor" />
            </interceptor-stack>

            <interceptor-stack name="adminRoleValidatorStack">
                <interceptor-ref name="authenticationStack" />
                <interceptor-ref name="adminRoleValidator" />
            </interceptor-stack>
            
<!--            <interceptor-stack name="unsupportedCharsInterceptorStack">
                <interceptor-ref name="unsupportedCharsInterceptor" />
            </interceptor-stack>-->

        </interceptors>

        <default-interceptor-ref name="authenticationStack" />

        <!-- =================================================== Global Results -->
        <global-results>
            <result name="welcome" type="redirectAction">welcome</result>
            <result name="home" type="redirectAction">home</result>
            <result name="login" type="redirectAction">login!input</result>
            <result name="updatePassword">/pages/user/updatePassword.jsp</result>
            <result name="error">/pages/error.jsp</result>
        </global-results>

        <!-- global-allowed-methods>
			input
		</global-allowed-methods -->

        <!-- Has to come after global-results -->
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error" />
        </global-exception-mappings>

        <!-- ========================================================== Actions -->
        <!-- Top-level NGBW menu pages -->
        <action name="welcome">
            <interceptor-ref name="builtInInterceptorsStack" />
            <!--result>/pages/user/login.jsp</result -->
            <result type="redirectAction">home</result>
        </action>

        <action name="download" class="org.ngbw.web.actions.DownloadAction" method="download">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="success" type="stream">
                <!--<param name="contentType">${getContentType()}</param>-->
                <param name="contentType">contentType</param>
                <param name="inputName">inputStream</param>
                <param name="bufferSize">4096</param>
                <!--<param name="contentDisposition">${getContentDisposition()}</param>-->
                <param name="contentDisposition">contentDisposition</param>
            </result>
        </action>

        <action name="home" class="org.ngbw.web.actions.ProfileManager">
            <result>/pages/user/home.jsp</result>
        </action>


        <action name="taskupdate" class="org.ngbw.web.actions.TaskUpdate">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="success">/pages/user/taskupdateok.txt</result>
            <result name="error">/pages/user/taskupdateerror.txt</result>
        </action>



<!--STATISTICS -->
        <action name="statistics" class="org.ngbw.web.actions.RegisterStatistics">
            <interceptor-ref name="builtInInterceptorsStack" /> <!-- This line is that the login page is not shown -->
            <result>/pages/user/statistics.jsp</result>
        </action>

<!-- ADMINISTRATION -->
        <action name="administration" class="org.ngbw.web.actions.AdminTaskManager" method="listTasks">
            <interceptor-ref name="adminRoleValidatorStack" />
            <!--<result type="tiles">tAdministration.list</result>-->
            <!--<result name="list" type="tiles">tAdministration.list</result>-->
            <result name="list">/pages/admin/adminTaskList.jsp</result>
        </action>
        <action name="adminUserJobSearch" class="org.ngbw.web.actions.AdminTaskManager" method="getJobs">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="userJobs">/pages/admin/userJobSearch.jsp</result>
        </action>
         <action name="userJobStatistics" class="org.ngbw.web.actions.AdminTaskManager" method="getStatistics">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/admin/userJobStat.jsp</result>
        </action>
         <action name="refreshStatistics" class="org.ngbw.web.actions.AdminTaskManager" method="refresh">
             <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/admin/userJobStat.jsp</result>
        </action>
         <action name="userJobs" class="org.ngbw.web.actions.AdminTaskManager" method="input">
             <interceptor-ref name="adminRoleValidatorStack" />
            <result name="input">/pages/admin/userJobSearch.jsp</result>
        </action>
        <action name="userAccountActivationSearch" class="org.ngbw.web.actions.AdminTaskManager" method="searchAccountActivation">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="input">/pages/admin/userAccountActivation.jsp</result>
        </action>
        
        <!-- User SU Allocations; Disabled temporarily. -->
        <action name="userSuInfo" class="org.ngbw.web.actions.UserSuAllocationManager">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="success">/pages/admin/userSuInfo.jsp</result>
        </action>
        <action name="userSuInfoSearch" class="org.ngbw.web.actions.UserSuAllocationManager" method="searchUserSuInfo">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="error">/pages/admin/userSuInfo.jsp</result>
            <result name="input">/pages/admin/userSuInfo.jsp</result>
            <result name="success">/pages/admin/userSuInfo.jsp</result>
        </action>
        <action name="userSuTransFilter" class="org.ngbw.web.actions.UserSuAllocationManager" method="filterUserSuTransactions">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="error">/pages/admin/userSuInfo.jsp</result>
            <result name="input">/pages/admin/userSuInfo.jsp</result>
            <result name="success">/pages/admin/userSuInfo.jsp</result>
        </action>
        <action name="adjustSu" class="org.ngbw.web.actions.UserSuAllocationManager" method="adjustUserSu">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="error">/pages/admin/userSuInfo.jsp</result>
            <result name="input">/pages/admin/userSuInfo.jsp</result>
            <result name="success">/pages/admin/userSuInfo.jsp</result>
        </action> 
        
        <action name="adminTask" class="org.ngbw.web.actions.AdminTaskManager">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/admin/userJobSearch.jsp</result>
            <result name="display">/pages/admin/userJobDisplayTask.jsp</result>
            <result name="displayInput">/pages/admin/userJobDisplayInput.jsp</result>
            <result name="displayParameters">/pages/admin/userJobDisplayParameters.jsp</result>
            <result name="displayOutputList">/pages/admin/userJobDisplayOutputList.jsp</result>
            <result name="displayWorkingDirectory">/pages/admin/userJobDisplayWorkingDirectory.jsp</result>
            <result name="crj">/pages/admin/userJobDisplayCometRunning.jsp</result>
            <result name="accountActivation">/pages/admin/userAccountActivation.jsp</result>
            <result name="multipleAccounts">/pages/admin/multipleAccounts.jsp</result>
            <result name="userSuInfo">/pages/admin/userSuInfo.jsp</result>
            <result name="invalid.token" type="redirectAction">home</result>
            <allowed-methods>
                list,display,displayInput,displayParameters,displayWorkingDirectory,delete,refresh,setPage,
                cancel,downloadSelected,deleteSelected,cancelSelected,refreshUserJobs,getAccountActivation,getMultipleAccounts,getReportDate,
                activateAccountOnBehalfOfUser,userSuInfo,searchMultipleAccountReport,hasUnblockedAccounts,getUnblockedAccounts,unblockUser
            </allowed-methods>
        </action>
        <action name="adminTaskMA" class="org.ngbw.web.actions.AdminTaskManager"  method="searchMultipleAccountReport">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="multipleAccounts">/pages/admin/multipleAccounts.jsp</result>
        </action> 
        <action name="adminTaskBlock" class="org.ngbw.web.actions.AdminTaskManager"  method="blockMultipleAccounts">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="multipleAccounts">/pages/admin/multipleAccounts.jsp</result>
        </action>               
        <action name="adminSetTaskOutput" class="org.ngbw.web.actions.SetTaskOutput" method="reload">
            <result name="list">/pages/admin/userJobSearch.jsp</result>
            <result name="display">/pages/admin/userJobDisplayTask.jsp</result>
            <result name="displayOutputList">/pages/admin/userJobDisplayOutputList.jsp</result>
            <result name="displayOutput">/pages/admin/userJobDisplayOutput.jsp</result>
            <result name="displayOutputFile" type="stream">
                <param name="parse">true</param>
                <param name="contentType">${contentType}</param>
                <param name="contentLength">${dataLength}</param>
                <param name="contentDisposition">attachment; filename="${filename}"</param>
            </result>
            <result name="transferTaskOutput" type="redirectAction">transferTaskOutput</result>
            <result name="archiveData" type="redirectAction">archiveData</result>
            <result name="displayTransformedOutput">/pages/user/task/displayTransformedOutput.jsp</result>
            <result name="displayTransformedRecord">/pages/user/task/displayTransformedRecord.jsp</result>
            <result name="input">/pages/user/task/outputForm.jsp</result>
            <allowed-methods>
                input,display,displayOutputFile,displayTransformedOutput,selectOutput,displayOutput,save,
                downloadSelected,saveSelected,execute,cancel,transferSelectedOutput
            </allowed-methods>
        </action>
        <action name="jobDetailsCometInQueue" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsCometInQueue">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayCometInQueue.jsp</result>
        </action>
        <action name="jobDetailsCometRunning" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsCometRunning">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayCometRunning.jsp</result>
        </action>
        <action name="jobDetailsExpanseInQueue" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsExpanseInQueue">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayExpanseInQueue.jsp</result>
        </action>
        <action name="jobDetailsExpanseRunning" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsExpanseRunning">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayExpanseRunning.jsp</result>
        </action>      
        <action name="jobDetailsAwsInQueue" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsAwsInQueue">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayAwsInQueue.jsp</result>
        </action>
        <action name="jobDetailsAwsRunning" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsAwsRunning">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayAwsRunning.jsp</result>
        </action>
        <action name="jobDetailsTsccInQueue" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsTsccInQueue">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayTsccInQueue.jsp</result>
        </action>
        <action name="jobDetailsTsccRunning" class="org.ngbw.web.actions.AdminTaskManager" method="getJobDetailsTsccRunning">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="crj">/pages/admin/userJobDisplayTsccRunning.jsp</result>
        </action>

<!-- PROFILE -->
        <action name="profile" class="org.ngbw.web.actions.ProfileManager">
            <result>/pages/user/profile.jsp</result>
        </action>
<!-- TOOLKIT -->
        <action name="tools" class="org.ngbw.web.actions.NgbwSupport" method="changeToolTab">
          <interceptor-ref name="builtInInterceptorsStack" />
          <result name="list">/pages/user/tools.jsp</result>
          <result name="display">/pages/user/displayTool.jsp</result>
        </action>

        <action name="contact" class="org.ngbw.web.actions.NgbwSupport">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result>/pages/static/contact.jsp</result>
        </action>

        <action name="help" class="org.ngbw.web.actions.NgbwSupport">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result>/pages/static/help.jsp</result>
        </action>

        <!-- Unavailable pages -->
        <action name="unavailable" class="org.ngbw.web.actions.NgbwSupport">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result>/pages/user/unavailable.jsp</result>
        </action>
<!--REGISTER.USER-->
        <!-- NBGW session management pages -->
        <action name="register" class="org.ngbw.web.actions.RegisterUser">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="input">/pages/user/register.jsp</result>
            <result name="cancel" type="redirectAction">home</result>
            <result name="success" type="redirectAction">home</result>
			<allowed-methods>register,cancel</allowed-methods>
        </action>
        <action name="institutionList" class="org.ngbw.web.actions.RegisterUser" method="autocompleteList">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result type="json" >
                <param name="root">autocompleteList</param>
            </result>
        </action>        

        <!-- This function is no longer supported. -->
        <!--
        <action name="guestLogin" class="org.ngbw.web.actions.FolderManager" method="guestLogin">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="input">/pages/user/login.jsp</result>
        </action>
        -->
        
        <!-- Login via CyVerse/iPlant link takes us to this action, CAS
             protection will take us to CyVerse/iPlant login page (if we don't
             already have a CAS session) before this action is invoked.
        -->
        <action name="iplantLogin" class="org.ngbw.web.actions.FolderManager" method="cyverseLogin">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="success" type="redirectAction">home</result>
            <result name="input">/pages/user/login.jsp</result>
            <!-- CyVerse login not supported starting 2020-12-01. -->
            <!--<result name="iplant_register">/pages/user/iplantRegister.jsp</result>-->
        </action>

        <action name="login" class="org.ngbw.web.actions.FolderManager" method="login">
            <interceptor-ref name="loginStack" />
            <result name="success" type="redirectAction">home</result>
            <result name="input">/pages/user/login.jsp</result>
            <result name="updatePassword">/pages/user/updatePassword.jsp</result>
            <!-- CyVerse login not supported starting 2020-12-01. -->
            <!--<result name="iplant_register">/pages/user/iplantRegister.jsp</result>-->
			<allowed-methods>input,login</allowed-methods>
        </action>

        <!-- We get here when someone logs in via shibbleth and doesn't already have a cipres account -->
        <action name="iplantRegister" class="org.ngbw.web.actions.FolderManager" method="iplantRegister">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="input">/pages/user/login.jsp</result>
            <result name="success" type="redirectAction">home</result>
            <!--<result name="localLogout" type="redirect">/Shibboleth.sso/LocalLogout</result>-->
        </action>


        <action name="logout" class="org.ngbw.web.actions.SessionManager" method="logout">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="globusTransfer">/pages/user/globus.jsp?fromlogout=yes</result>
            <result type="redirectAction">welcome</result>
            <result name="iplant_logout" type="redirectAction">welcome</result>
        </action>

        <action name="forgotPassword" class="org.ngbw.web.actions.SessionManager" method="sendPasswordReset">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="success">/pages/user/forgotPassword.jsp</result>
            <result name="input">/pages/user/forgotPassword.jsp</result>
			<allowed-methods>input</allowed-methods>
        </action>

        <action name="activateAccount" class="org.ngbw.web.actions.SessionManager" method="activateAccount">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="success">/pages/user/activateSuccess.jsp</result>
            <result name="input">/pages/user/activateFailure.jsp</result>
			<allowed-methods>input</allowed-methods>
        </action>

        <action name="resetPassword" class="org.ngbw.web.actions.ProfileManager" method="confirmPasswordReset">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="success">/pages/user/profile.jsp</result>
            <result name="input">/pages/user/forgotPassword.jsp</result>
        </action>

        <!-- NGBW profile management pages -->
        <action name="updatePassword" class="org.ngbw.web.actions.ProfileManager" method="updatePassword">
            <!--<interceptor-ref name="unsupportedCharsInterceptorStack" />-->
            <result name="success">/pages/user/profile.jsp</result>
            <result name="input">/pages/user/updatePassword.jsp</result>
			<allowed-methods>input</allowed-methods>
        </action>
        <action name="transferSU" class="org.ngbw.web.actions.SUManager" method="transfterSU">
            <result name="success">/pages/user/transferSU.jsp</result>
            <result name="input">/pages/user/transferSU.jsp</result>
			<allowed-methods>input</allowed-methods>
        </action> 
        <action name="awardMyself" class="org.ngbw.web.actions.SUManager" method="awardMyself">
            <result name="success">/pages/user/profile.jsp</result>
            <result name="input">/pages/user/profile.jsp</result>
			<allowed-methods>awardMyself,reachMaxAwardMyself</allowed-methods>
        </action> 
        <action name="transactionActivities" class="org.ngbw.web.actions.UserSuAllocationManager" method="searchMyselfSuInfo">
            <result name="error">/pages/admin/userSuInfo.jsp</result>
            <result name="input">/pages/admin/userSuInfo.jsp</result>
            <result name="success">/pages/admin/userSuInfo.jsp</result>
        </action>               
        <action name="updateProfile" class="org.ngbw.web.actions.ProfileManager" method="updatePersonalInformation">
            <result name="success">/pages/user/profile.jsp</result>
            <result name="input">/pages/user/updateProfile.jsp</result>
			<allowed-methods>input</allowed-methods>
        </action>
        <action name="dontSendToCloud" class="org.ngbw.web.actions.ProfileManager" method="dontSendToCloud">
            <result name="success">/pages/user/profile.jsp</result>
            <result name="input">/pages/user/profile.jsp</result>
			<allowed-methods>input</allowed-methods>
        </action>

        <!-- NGBW folder management pages -->
        <action name="folder" class="org.ngbw.web.actions.FolderManager" method="input">
            <result name="list">/pages/user/home.jsp</result>
            <result name="display">/pages/user/home.jsp</result>
            <result name="input">/pages/user/folder/folderForm.jsp</result>
			<allowed-methods>create,edit,delete,list,display</allowed-methods>
        </action>
        <action name="saveFolder" class="org.ngbw.web.actions.FolderManager" method="save">
            <result name="list" type="redirectAction">home</result>
            <result name="display" type="redirectAction">home</result>
            <result name="input">/pages/user/folder/folderForm.jsp</result>
			<allowed-methods>cancel</allowed-methods>
        </action>

        <!-- Redirect user to SeedMe2-CIPRES Data Share site. --> 
        <action name="dataShare" class="org.ngbw.web.actions.FolderManager" method="redirectToSeedMe2">
            <interceptor-ref name="builtInInterceptorsStack" />
            <result name="list" type="redirectAction">home</result>
            <result name="display" type="redirectAction">home</result>
            <result name="input" type="redirect">${cipresDataShareUrl}</result>
            <result name="redirect" type="redirect">${cipresDataShareUrl}</result>
        </action>

        <!-- NGBW data management pages-->
        <action name="editDocument" class="org.ngbw.web.actions.DataEditor">
            <result name="input">/pages/user/data/editData.jsp</result>
            <result name="list" type="redirectAction">
                <param name="actionName">data</param>
                <param name="actionErrors">${actionErrors}</param>
                <param name="actionMessages">${actionMessages}</param>
            </result>
			<allowed-methods>input,saveAsNew,saveAndOverwrite,cancel</allowed-methods>
		</action>
        <action name="data" class="org.ngbw.web.actions.DataManager">
			<!-- One of these two results is returned after control has been redirected to "data"
			with actionErrors or actionMessages -->
            <result name="success">/pages/user/data/dataList.jsp</result>
            <result name="input">/pages/user/data/dataList.jsp</result>
            <result name="list">/pages/user/data/dataList.jsp</result>
            <result name="display">/pages/user/data/displayData.jsp</result>
            <result name="home">/pages/user/home.jsp</result>
            <result name="task" type="redirectAction">createTask</result>
            <!--<result name="transferDataItems" type="redirectAction">transferDataItems</result>-->
            <result name="download" type="stream">
                <param name="parse">true</param>
                <param name="contentType">${contentType}</param>
                <param name="contentLength">${dataLength}</param>
                <param name="contentDisposition">attachment; filename="${filename}"</param>
            </result>
            <result name="archiveData" type="redirectAction">archiveData</result>
            <result name="globusTransfer" type="redirectAction">authcallback</result>
			<allowed-methods>setPage,display,cancel,list,download,delete,transferSelectedData,transferSelectedDataToGlobusRoot,refresh,transferAllDataToGlobusRoot</allowed-methods>
        </action>
        
        <!-- get JSON to refresh parseStatus -->
        <action name="loadingTab" class="org.ngbw.web.actions.DataManager" method="reload">
			<result type="json">
				<param name="includeProperties">
					loadingDataTab\[\d+\]\.userDataId,
					loadingDataTab\[\d+\]\.updatedParseStatus
				</param>
			</result>
		</action>
		<action name="curDataTab" class="org.ngbw.web.actions.DataManager" method="reload">
			<result type="json">
				<param name="includeProperties">
					currentDataTab\[\d+\]\.userDataId,
					currentDataTab\[\d+\]\.parseStatus
				</param>
			</result>
		</action>
      
        <action name="archiveData" class="org.ngbw.web.actions.ArchiveManager" method="download">
            <result name="download" type="stream">
                <param name="parse">true</param>
                <param name="contentType">${contentType}</param>
                <param name="contentDisposition">attachment; filename="${filename}"</param>
            </result>
        </action>
        <action name="paginateData" class="org.ngbw.web.actions.DataManager" method="paginate">
            <result name="list">/pages/user/data/dataList.jsp</result>
        </action>
        <action name="pasteData" class="org.ngbw.web.actions.CreateData">
            <result name="list" type="redirectAction">data!list</result>
            <result name="display" type="redirectAction">data!display</result>
            <result name="input">/pages/user/data/pasteForm.jsp</result>
			<allowed-methods>upload,executePaste,cancel</allowed-methods>
        </action>
		<action name="uploadData" class="org.ngbw.web.actions.CreateData">
            <result name="list" type="redirectAction">data!list</result>
            <result name="display" type="redirectAction">data!display</result>
            <result name="input">/pages/user/data/uploadForm.jsp</result>
            <allowed-methods>upload</allowed-methods>
        </action>
        <action name="searchData" class="org.ngbw.web.actions.SearchData" method="reload">
            <result name="input">/pages/user/data/searchForm.jsp</result>
            <result name="display">/pages/user/data/displaySearchResult.jsp</result>
			<allowed-methods>execute,save,list,setPage,displayResultItem,changeTab,saveSelected</allowed-methods>
        </action>
        <action name="paginateSearch" class="org.ngbw.web.actions.SearchData" method="paginate">
            <result name="input">/pages/user/data/searchForm.jsp</result>
        </action>

        <action name="tus" class="org.ngbw.web.actions.NgbwSupport">
            <result>/pages/tus/index.jsp</result>
        </action>


        <!-- Task management -->
        <action name="task" class="org.ngbw.web.actions.ManageTasks">
            <result name="list">/pages/user/task/taskList.jsp</result>
            <result name="display">/pages/user/task/displayTask.jsp</result>
            <result name="displayInput">/pages/user/task/displayInput.jsp</result>
            <result name="displayParameters">/pages/user/task/displayParameters.jsp</result>
            <result name="displayOutputList">/pages/user/task/displayOutputList.jsp</result>
            <result name="displayWorkingDirectory">/pages/user/task/displayWorkingDirectory.jsp</result>
            <result name="invalid.token" type="redirectAction">home</result>
			<allowed-methods>
				list,display,displayInput,displayParameters,displayWorkingDirectory,delete,refresh,setPage,
				cancel,downloadSelected,deleteSelected,cancelSelected
			</allowed-methods>
        </action>
        <action name="refreshStatus" class="org.ngbw.web.actions.ManageTasks" method="refreshStatus">
			<result type="json">
				<param name="includeProperties">
					currentTaskStageDivide,
                                        taskMessagesDivide
				</param>
                                <param name="noCache">true</param>
			</result>
        </action>
        <action name="paginateTasks" class="org.ngbw.web.actions.ManageTasks" method="paginate">
            <result name="list">/pages/user/task/taskList.jsp</result>
            <result name="invalid.token" type="redirectAction">home</result>
        </action>

        <!-- Task creation -->
        <action name="createTask" class="org.ngbw.web.actions.CreateTask">
            <interceptor-ref name="tokenSession">
                <param name="includeMethods">execute,cancel</param>
            </interceptor-ref>
            <interceptor-ref name="authenticationStack" />
            <result name="list_error">pages/user/task/taskList.jsp</result>
            <result name="list" type="redirectAction">task!list</result>
            <result name="display" type="redirectAction">task!display</result>
            <result name="input">/pages/user/task/taskForm.jsp</result>
            <result name="parameters" type="redirectAction">${toolAction}!input</result>
            <result name="tools">/pages/user/displayTool.jsp</result>
            <result name="createFolder" type="redirectAction">home</result>
            <result name="invalidTaskID" type="redirectAction">home?carriedOverError=invalidTaskID</result>
            <result name="invalid.token" type="redirectAction">home</result>
			<allowed-methods>create,selectTool,changeTab,edit,clone,restart,run,execute,cancel,noAutoResubmission</allowed-methods>
        </action>
        <!-- Task output saving -->
        <action name="setTaskOutput" class="org.ngbw.web.actions.SetTaskOutput" method="reload">
            <result name="list">/pages/user/task/taskList.jsp</result>
            <result name="display">/pages/user/task/displayTask.jsp</result>
            <result name="displayOutputList">/pages/user/task/displayOutputList.jsp</result>
            <result name="displayOutput">/pages/user/task/displayOutput.jsp</result>
            <result name="displayOutputFile" type="stream">
                <param name="parse">true</param>
                <param name="contentType">${contentType}</param>
                <param name="contentLength">${dataLength}</param>
                <param name="contentDisposition">attachment; filename="${filename}"</param>
            </result>
            <result name="transferTaskOutput" type="redirectAction">transferTaskOutput</result>
            <result name="archiveData" type="redirectAction">archiveData</result>
            <result name="displayTransformedOutput">/pages/user/task/displayTransformedOutput.jsp</result>
            <result name="displayTransformedRecord">/pages/user/task/displayTransformedRecord.jsp</result>
            <result name="input">/pages/user/task/outputForm.jsp</result>
            <result name="success" type="redirectAction">authcallback</result>
            <allowed-methods>
				input,display,displayOutputFile,displayTransformedOutput,selectOutput,displayOutput,save,downloadSelected,saveSelected,
				execute,cancel,transferSelectedOutput,transferSelectedOutputToGlobusRoot
			</allowed-methods>
        </action>

        <action name="transferTaskOutput" class="org.ngbw.web.actions.CipresDataShareManager" method="transferTaskOutputFiles">
            <result name="displayOutputList">/pages/user/task/displayOutputList.jsp</result>
        </action>

        <!-- Transformed task output results re-paginate -->
        <action name="paginateOutput" class="org.ngbw.web.actions.SetTaskOutput" method="paginate">
            <result name="input">/pages/user/task/displayTransformedOutput.jsp</result>
            <result name="displayTransformedRecord">/pages/user/task/displayTransformedRecord.jsp</result>
			<allowed-methods>setPage,displayTransformedRecord</allowed-methods>
        </action>

        <!-- =============================================== AJAX-Based Actions -->
        <!-- Data upload drop-down list dynamic repopulation -->
        <action name="dataUploadLists" class="org.ngbw.web.actions.ajax.DataUploadLists">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">selectState</param>
            </result>
        </action>

        <!-- Data search drop-down list dynamic repopulation -->
        <action name="datasetLists" class="org.ngbw.web.actions.ajax.DatasetLists">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">selectState</param>
            </result>
        </action>

        <!-- Data search drop-down list dynamic repopulation -->
        <action name="datasetLists" class="org.ngbw.web.actions.ajax.DatasetLists">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">selectState</param>
            </result>
        </action>

        <!-- Dynamic folder expansion in left-panel folder list -->
        <action name="toggleFolder" class="org.ngbw.web.actions.ajax.ToggleFolder">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">folder</param>
            </result>
        </action>


<!-- TESTERS -->
        <action name="testFuncs" class="org.ngbw.web.actions.FunctionsTester" method="listFunc">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="provCipresShare" class="org.ngbw.web.actions.FunctionsTester" method="provisionCipresShare">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="listContent" class="org.ngbw.web.actions.FunctionsTester" method="listCipresShareContent">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="delDir" class="org.ngbw.web.actions.FunctionsTester" method="deleteCipresShareItem">
            <interceptor-ref name="adminRoleValidatorStack" />
            <!--<result name="userJobs" type="tiles">tAdministration.jobs</result>-->
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="parseDataItem" class="org.ngbw.web.actions.FunctionsTester" method="parseDataItem">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="downloadDataItem" class="org.ngbw.web.actions.FunctionsTester" method="downloadDataItem">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="dataItemDetails" class="org.ngbw.web.actions.FunctionsTester" method="dataItemDetails">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="parserTaskDetails" class="org.ngbw.web.actions.FunctionsTester" method="parserTaskDetails">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="xsedeReportDetails" class="org.ngbw.web.actions.FunctionsTester" method="xsedeReportDetails">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="lstXsedeRscrs" class="org.ngbw.web.actions.FunctionsTester" method="listXsedeResources">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="lstSubmittedAttri" class="org.ngbw.web.actions.FunctionsTester" method="listXsedeSubmittedAttributes">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <action name="submitXsedeAttri" class="org.ngbw.web.actions.FunctionsTester" method="submitXsedeAttribute">
            <interceptor-ref name="adminRoleValidatorStack" />
            <result name="list">/pages/test/funcList.jsp</result>
        </action>
        
        <!--<action name="dataItemUpdate" class="org.ngbw.web.actions.ajax.UpdateUserDataItemStatus" method="ajaxUpdate">-->
            <!--<interceptor-ref name="adminRoleValidatorStack" />-->
            <!--<result name="ajaxUpdate">/pages/admin/userJobList.jsp</result>-->
            <!--<result name="ajaxUpdate">/pages/user/data/dataList.jsp</result>-->
            <!--<result type="stream">-->
                <!--<param name="contentType">text</param>-->
                <!--<param name="inputName">selectState</param>-->
            <!--</result>-->
        <!--</action>-->

        <!--<action name="statesList" class="org.ngbw.web.actions.ajax.UpdateUserDataItemStatus">-->
            <!--<interceptor-ref name="adminRoleValidatorStack" />-->
            <!--<result name="success">/pages/admin/userJobList.jsp</result>-->
        <!--</action>-->

  <!-- Start: Globus Auth & Transfer actions -->
  <!--
  <action name="profile" class="edu.sdsc.globusauth.action.ProfileAction">
      <result name="success">/pages/oauth/profile.jsp</result>
      <result name="failure">/pages/error.jsp</result>
      <result name="transfer" type="redirectAction">transfer</result>
  </action>
  --> 
  <action name="transfer" class="edu.sdsc.globusauth.action.TransferAction" method="transfer">
      <result name="success">/pages/oauth/transfer.jsp</result>
      <result name="transferstatus" type="redirectAction">status?taskId=${taskId}</result>
      <result name="dataendpoints" type="redirectAction">endpointlist?empty=true</result>
      <result name="failure">/pages/error.jsp</result>
  </action>
  

  <action name="deleteOutboundFiles" class="edu.sdsc.globusauth.action.TransferAction" method="deleteOutboundFiles">
      <interceptor-ref name="defaultStack"/>
      <result name="success" type="redirectAction">transfer</result>
      <result name="input" type="redirectAction">transfer?geterrormsg=${errorMsg}</result>
      <result name="failure">/pages/error.jsp</result>
  </action>  
  
   <action name="status" class="edu.sdsc.globusauth.action.TransferStatusAction" method="transfer_status">
       <result name="success">/pages/oauth/transfer_status.jsp</result>
       <result name="failure">/pages/error.jsp</result>
       <result name="authcallback" type="redirectAction">authcallback?returnpage=status</result>       
   </action>
  
   <action name="endpointlist" class="edu.sdsc.globusauth.action.EndpointListAction" method="endpoint_list">
       <result name="success">/pages/oauth/endpoint_list.jsp</result>
       <result name="failure">/pages/error.jsp</result>
   </action>
    
   <action name="signup" class="org.ngbw.web.actions.NgbwSupport">
       <interceptor-ref name="defaultStack"/>
       <result type="redirectAction">authcallback?signup=true</result>
   </action>
  
   <action name="globus" class="edu.sdsc.globusauth.action.LoginAction" method="input">
       <result name="input">/pages/user/globus.jsp</result>
   </action>
   <action name="globuslogin" class="edu.sdsc.globusauth.action.LoginAction" method="authcallback">
       <interceptor-ref name="loginStack"/>
       <result name="input">/pages/user/globuslogin.jsp</result>
       <result name="authcallback" type="redirectAction">authcallback</result>
       <allowed-methods>authcallback,input</allowed-methods>
   </action>
  
   <action name="authcallback" class="edu.sdsc.globusauth.action.AuthCallbackAction" method="globuslogin">
       <interceptor-ref name="defaultStack"/>
       <result name="failure">/pages/error.jsp</result>
       <result name="profileredirect" type="redirectAction">profile</result>
       <result name="authredirect" type="redirect">${authurl}</result>
       <result name="transfer" type="redirectAction">transfer</result>
       <result name="success" type="redirectAction">home</result>
       <result name="dataendpoints" type="redirectAction">endpointlist?empty=true</result>
       <result name="status" type="redirectAction">status</result>
       <allowed-methods>input,globuslogin</allowed-methods>
   </action>
  <!--
   <action name="logout" class="edu.sdsc.globusauth.action.LogoutAction" method="globuslogout">
       <interceptor-ref name="defaultStack"/>
       <result type="redirect">${logouturl}</result>
   </action>
   -->
   <!-- End: Globus Auth & Transfer actions -->
          <!-- =============================================== AJAX-Based Actions -->
        <!-- Data upload drop-down list dynamic repopulation -->
        <action name="dataUploadLists" class="org.ngbw.web.actions.ajax.DataUploadLists">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">selectState</param>
            </result>
        </action>

        <!-- Data search drop-down list dynamic repopulation -->
        <action name="datasetLists" class="org.ngbw.web.actions.ajax.DatasetLists">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">selectState</param>
            </result>
        </action>

        <!-- Data search drop-down list dynamic repopulation -->
        <action name="datasetLists" class="org.ngbw.web.actions.ajax.DatasetLists">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">selectState</param>
            </result>
        </action>

        <!-- Dynamic folder expansion in left-panel folder list -->
        <action name="toggleFolder" class="org.ngbw.web.actions.ajax.ToggleFolder">
            <result type="stream">
                <param name="contentType">text/xml</param>
                <param name="inputName">folder</param>
            </result>
        </action>
    </package>

    <package name="json" namespace="/" extends="json-default">
        <action name="endpointlistJSON" class="edu.sdsc.globusauth.action.EndpointListJSONAction" method="endpoint_list">
            <result type="json" >
                <param name="root">endpointlist</param>
            </result>
        </action>
        
        <action name="filetree" class="edu.sdsc.globusauth.action.DynamicTreeAction" method="file_tree">
            <result type="json" >
                <param name="root">nodes</param>
            </result>
        </action>      
    </package>
    
    <!--
        Include NGBW Struts tool configuration file, must be
        done after "default" package in order to properly extend it
    -->
    <include file="struts-tools.xml" />

</struts>
