%@ include file="adminHeaders.jsp" %>
<%
/* $Id$ */
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
%>
<%
// The contract of this edit page is as follows. It is either called directly, in which case it is expected to be creating
// a job or beginning the process of editing an existing job, or it is called via redirection from execute.jsp, in which case
// the job object being edited will be placed in the thread context under the name "JobObject".
// It may also be called directly with a parameter of "origjobid", which implies that a copy operation should be started.
try
{
// Check if authorized
if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_JOBS))
{
variableContext.setParameter("target","listjobs.jsp");
%>
<%
}
// Get the job manager handle
IJobManager manager = JobManagerFactory.make(threadContext);
IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
IRepositoryConnection[] connList = connMgr.getAllConnections();
INotificationConnectionManager notificationMgr = NotificationConnectionManagerFactory.make(threadContext);
INotificationConnection[] notificationList = notificationMgr.getAllConnections();
IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(threadContext);
IOutputConnection[] outputList = outputMgr.getAllConnections();
ITransformationConnectionManager transformationMgr = TransformationConnectionManagerFactory.make(threadContext);
ITransformationConnection[] transformationList = transformationMgr.getAllConnections();
IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
// Figure out tab name and sequence number
String tabName = variableContext.getParameter("tabname");
String tabSequenceNumber = variableContext.getParameter("sequencenumber");
int tabSequenceInt;
if (tabName == null || tabName.length() == 0)
{
tabName = Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name");
tabSequenceInt = -1;
}
else
{
if (tabSequenceNumber == null || tabSequenceNumber.length() == 0)
tabSequenceInt = -1;
else
tabSequenceInt = Integer.parseInt(tabSequenceNumber);
}
// Get a loaded job object, somehow.
String jobID = null;
IJobDescription job = (IJobDescription)threadContext.get("JobObject");
if (job == null)
{
// We did not go through execute.jsp
// We might have received an argument specifying the connection name.
jobID = variableContext.getParameter("jobid");
String origJobID = variableContext.getParameter("origjobid");
if (origJobID == null || origJobID.length() == 0)
origJobID = jobID;
if (origJobID != null)
job = manager.load(new Long(origJobID));
}
else
jobID = job.getID().toString();
// Setup default fields
String connectionName = "";
String description = "";
int type = IJobDescription.TYPE_SPECIFIED;
Specification documentSpecification = new Specification();
// Pipeline data
String[] pipelineConnectionNames = new String[0];
String[] pipelineDescriptions = new String[0];
boolean[] pipelineIsOutputs = new boolean[0];
int[] pipelinePrerequisites = new int[0];
Specification[] pipelineSpecifications = new Specification[0];
String[] notificationConnectionNames = new String[0];
String[] notificationDescriptions = new String[0];
Specification[] notificationSpecifications = new Specification[0];
ArrayList scheduleRecords = new ArrayList();
EnumeratedValues dayOfWeek = null;
EnumeratedValues dayOfMonth = null;
EnumeratedValues monthOfYear = null;
EnumeratedValues year = null;
EnumeratedValues hourOfDay = null;
EnumeratedValues minutesOfHour = null;
// Duration in minutes
Long duration = null;
// RequestMinimum flag
boolean requestMinimum = false;
// Priority
int priority = 5;
// Minimum recrawl interval (Default: 1 day)
Long recrawlInterval = new Long(60L * 24L);
// Maximum recrawl interval (Default: none)
Long maxRecrawlInterval = null;
// Reseed interval (Default: 60 minutes)
Long reseedInterval = new Long(60L);
// Expiration interval (Default: never)
Long expirationInterval = null;
// Start method
int startMethod = IJobDescription.START_DISABLE;
// Hopcount mode
int hopcountMode = IJobDescription.HOPCOUNT_ACCURATE;
// Hop filters
Map hopFilterMap = new HashMap();
// If the job is not null, prepopulate everything with what comes from it.
if (job != null)
{
// Set up values
description = job.getDescription();
connectionName = job.getConnectionName();
pipelineConnectionNames = new String[job.countPipelineStages()];
pipelineDescriptions = new String[job.countPipelineStages()];
pipelineIsOutputs = new boolean[job.countPipelineStages()];
pipelinePrerequisites = new int[job.countPipelineStages()];
pipelineSpecifications = new Specification[job.countPipelineStages()];
for (int j = 0; j < job.countPipelineStages(); j++)
{
pipelineConnectionNames[j] = job.getPipelineStageConnectionName(j);
pipelineDescriptions[j] = job.getPipelineStageDescription(j);
pipelineIsOutputs[j] = job.getPipelineStageIsOutputConnection(j);
pipelinePrerequisites[j] = job.getPipelineStagePrerequisite(j);
pipelineSpecifications[j] = job.getPipelineStageSpecification(j);
}
notificationConnectionNames = new String[job.countNotifications()];
notificationDescriptions = new String[job.countNotifications()];
notificationSpecifications = new Specification[job.countNotifications()];
for (int j = 0; j < job.countNotifications(); j++)
{
notificationConnectionNames[j] = job.getNotificationConnectionName(j);
notificationDescriptions[j] = job.getNotificationDescription(j);
notificationSpecifications[j] = job.getNotificationSpecification(j);
}
type = job.getType();
startMethod = job.getStartMethod();
hopcountMode = job.getHopcountMode();
documentSpecification = job.getSpecification();
// Fill in schedule records from job
for (int j = 0; j < job.getScheduleRecordCount(); j++)
{
scheduleRecords.add(job.getScheduleRecord(j));
}
priority = job.getPriority();
Long value = job.getInterval();
recrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
value = job.getMaxInterval();
maxRecrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
value = job.getReseedInterval();
reseedInterval = (value==null)?null:new Long(value.longValue()/60000L);
value = job.getExpiration();
expirationInterval = (value==null)?null:new Long(value.longValue()/60000L);
hopFilterMap = job.getHopCountFilters();
}
// This form reposts to itself. It basically only allows the connection to be picked once; once done, the repost occurs
// and cannot be undone.
// Therefore, there are three possible entry conditions:
// 1) no jobid w/no connection name, which indicates a brand-new job without a chosen connection
// 2) no jobid w/a connection name, which indicates that the connection at least has been chosen
// 3) a jobid and a connection name, which indicates that we are editing an existing connection.
// There are similar combinations for output connections.
int model = IRepositoryConnector.MODEL_ADD_CHANGE_DELETE;
String[] relationshipTypes = null;
List tabsArray = new ArrayList();
List sequenceArray = new ArrayList();
IRepositoryConnection connection = null;
if (connectionName.length() > 0)
{
connection = connMgr.load(connectionName);
model = RepositoryConnectorFactory.getConnectorModel(threadContext,connection.getClassName());
relationshipTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
}
// Set up the predefined tabs
tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name"));
sequenceArray.add(null);
tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection"));
sequenceArray.add(null);
if (connectionName.length() > 0)
{
tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Scheduling"));
sequenceArray.add(null);
if (relationshipTypes != null && relationshipTypes.length > 0)
{
tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.HopFilters"));
sequenceArray.add(null);
}
}
// Get the names of the various Javascript methods we'll need to call
String checkMethod = "checkSpecification";
String saveCheckMethod = "checkSpecificationForSave";
String[] pipelineCheckMethods = new String[pipelineConnectionNames.length];
String[] pipelineCheckForSaveMethods = new String[pipelineConnectionNames.length];
String[] notificationCheckMethods = new String[notificationConnectionNames.length];
String[] notificationCheckForSaveMethods = new String[notificationConnectionNames.length];
for (int j = 0; j < pipelineConnectionNames.length; j++)
{
pipelineCheckMethods[j] = "unknown";
pipelineCheckForSaveMethods[j] = "unknown";
}
for (int j = 0; j < notificationConnectionNames.length; j++)
{
notificationCheckMethods[j] = "unknown";
notificationCheckForSaveMethods[j] = "unknown";
}
if (connection != null)
{
IRepositoryConnector connector = RepositoryConnectorFactory.getConnectorNoCheck(connection.getClassName());
if (connector != null)
{
checkMethod = connector.getFormCheckJavascriptMethodName(0);
saveCheckMethod = connector.getFormPresaveCheckJavascriptMethodName(0);
}
}
for (int j = 0; j < pipelineConnectionNames.length; j++)
{
if (pipelineIsOutputs[j])
{
IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
if (outputConnection != null)
{
IOutputConnector outputConnector = OutputConnectorFactory.getConnectorNoCheck(outputConnection.getClassName());
if (outputConnector != null)
{
pipelineCheckMethods[j] = outputConnector.getFormCheckJavascriptMethodName(1+j);
pipelineCheckForSaveMethods[j] = outputConnector.getFormPresaveCheckJavascriptMethodName(1+j);
}
}
}
else
{
ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
if (transformationConnection != null)
{
ITransformationConnector transformationConnector = TransformationConnectorFactory.getConnectorNoCheck(transformationConnection.getClassName());
if (transformationConnector != null)
{
pipelineCheckMethods[j] = transformationConnector.getFormCheckJavascriptMethodName(1+j);
pipelineCheckForSaveMethods[j] = transformationConnector.getFormPresaveCheckJavascriptMethodName(1+j);
}
}
}
}
for (int j = 0; j < notificationConnectionNames.length; j++)
{
INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
if (notificationConnection != null)
{
INotificationConnector notificationConnector = NotificationConnectorFactory.getConnectorNoCheck(notificationConnection.getClassName());
if (notificationConnector != null)
{
notificationCheckMethods[j] = notificationConnector.getFormCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
notificationCheckForSaveMethods[j] = notificationConnector.getFormPresaveCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
}
}
}
%>
<%
if (connection != null)
{
IRepositoryConnector repositoryConnector = repositoryConnectorPool.grab(connection);
if (repositoryConnector != null)
{
try
{
repositoryConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),documentSpecification,0,tabsArray);
}
finally
{
repositoryConnectorPool.release(connection,repositoryConnector);
}
}
Integer repositoryConnectionSequenceNumber = new Integer(0);
while (sequenceArray.size() < tabsArray.size())
{
sequenceArray.add(repositoryConnectionSequenceNumber);
}
}
%>
<%
for (int j = 0; j < pipelineConnectionNames.length; j++)
{
if (pipelineIsOutputs[j])
{
IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
if (outputConnection != null)
{
IOutputConnector outputConnector = outputConnectorPool.grab(outputConnection);
if (outputConnector != null)
{
try
{
outputConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
}
finally
{
outputConnectorPool.release(outputConnection,outputConnector);
}
}
}
}
else
{
ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
if (transformationConnection != null)
{
ITransformationConnector transformationConnector = transformationConnectorPool.grab(transformationConnection);
if (transformationConnector != null)
{
try
{
transformationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
}
finally
{
transformationConnectorPool.release(transformationConnection,transformationConnector);
}
}
}
}
Integer connectionSequenceNumber = new Integer(1+j);
while (sequenceArray.size() < tabsArray.size())
{
sequenceArray.add(connectionSequenceNumber);
}
}
%>
<%
for (int j = 0; j < notificationConnectionNames.length; j++)
{
INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
if (notificationConnection != null)
{
INotificationConnector notificationConnector = notificationConnectorPool.grab(notificationConnection);
if (notificationConnector != null)
{
try
{
notificationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),notificationSpecifications[j],1+pipelineConnectionNames.length+j,tabsArray);
}
finally
{
notificationConnectorPool.release(notificationConnection,notificationConnector);
}
}
}
Integer connectionSequenceNumber = new Integer(1+pipelineConnectionNames.length+j);
while (sequenceArray.size() < tabsArray.size())
{
sequenceArray.add(connectionSequenceNumber);
}
}
%>