Skip to content
Snippets Groups Projects
Commit f7071abb authored by gmantele's avatar gmantele
Browse files

[UWS] Fix bug with JobObserver. The notification of all observers was not

synchronized although the collection of observers is synchronized (Vector) ;
using an Iterator ensures the synchronization and avoids concurrency problems.
parent 70dc3a14
No related branches found
No related tags found
No related merge requests found
......@@ -2,20 +2,20 @@ package uws.job;
/*
* This file is part of UWSLibrary.
*
*
* UWSLibrary is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* UWSLibrary is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
*
* You should have received a copy of the GNU Lesser General Public License
* along with UWSLibrary. If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2012-2017 - UDS/Centre de Données astronomiques de Strasbourg (CDS),
* Astronomisches Rechen Institut (ARI)
*/
......@@ -52,11 +52,11 @@ import uws.service.request.UploadFile;
/**
* <h3>Brief description</h3>
*
*
* <p>Default implementation of a job of the UWS pattern.</p>
*
*
* <h3>Some attributes comments</h3>
*
*
* <ul>
* <li>
* The job attributes <i>startTime</i> and <i>endTime</i> are automatically managed by {@link UWSJob}. You don't have to do anything !
......@@ -82,9 +82,9 @@ import uws.service.request.UploadFile;
* indicates the quote is not known ; {@link #QUOTE_NOT_KNOWN} is the default value).
* </li>
* </ul>
*
*
* <h3>More details</h3>
*
*
* <ul>
* <li>
* <b>{@link #generateJobId()}:</b>
......@@ -113,9 +113,9 @@ import uws.service.request.UploadFile;
* Observers are notified at any change of the execution phase.
* </li>
* </ul>
*
*
* @author Gr&eacute;gory Mantelet (CDS;ARI)
* @version 4.2 (06/2017)
* @version 4.2 (09/2017)
*/
public class UWSJob extends SerializableUWSObject {
private static final long serialVersionUID = 1L;
......@@ -275,12 +275,12 @@ public class UWSJob extends SerializableUWSObject {
/* ************ */
/**
* <p>Builds a job with no owner from a map of all parameters (UWS and additional parameters).</p>
*
*
* <p><i><u>Note:</u> if the parameter {@link UWSJob#PARAM_PHASE} (</i>phase<i>) is given with the value {@link UWSJob#PHASE_RUN}
* the job execution starts immediately after the job has been added to a job list or after {@link #applyPhaseParam(JobOwner)} is called.</i></p>
*
*
* @param params UWS standard and non-standard parameters.
*
*
* @see UWSJob#UWSJob(JobOwner, UWSParameters)
*/
public UWSJob(final UWSParameters params){
......@@ -289,13 +289,13 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Builds a job of the given owner and from a map of all parameters (UWS and additional parameters).</p>
*
*
* <p><i><u>Note:</u> if the parameter {@link #PARAM_PHASE} (</i>phase<i>) is given with the value {@link #PHASE_RUN}
* the job execution starts immediately after the job has been added to a job list or after {@link #applyPhaseParam(JobOwner)} is called.</i></p>
*
*
* @param owner Job.owner ({@link #PARAM_OWNER}).
* @param params UWS standard and non-standard parameters.
*
*
* @see UWSParameters#init()
*/
public UWSJob(JobOwner owner, final UWSParameters params){
......@@ -323,17 +323,17 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Builds a job of the given owner and from a map of all parameters (UWS and additional parameters).
* The given HTTP request ID will be used as Job ID if not already used by another job.</p>
*
*
* <p><i><u>Note:</u> if the parameter {@link #PARAM_PHASE} (</i>phase<i>) is given with the value {@link #PHASE_RUN}
* the job execution starts immediately after the job has been added to a job list or after {@link #applyPhaseParam(JobOwner)} is called.</i></p>
*
*
* @param owner Job.owner ({@link #PARAM_OWNER}).
* @param params UWS standard and non-standard parameters.
* @param requestID ID of the HTTP request which has initiated the creation of this job.
* <i>Note: if NULL, empty or already used, a job ID will be generated thanks to {@link #generateJobId()}.</i>
*
*
* @see UWSParameters#init()
*
*
* @since 4.2
*/
public UWSJob(JobOwner owner, final UWSParameters params, final String requestID){
......@@ -368,14 +368,14 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p><b>CONSTRUCTOR TO USE TO RESTORE A JOB whatever is its phase.</b></p>
*
*
* <p>Builds a job of the given owner with all the given parameter.</p>
*
*
* <p><i>
* <u>Note:</u> The job phase is automatically set in function of the last parameters (startTime, endTime, results and error).
* Only the following execution phase are possible: PENDING, ABORTED, ERROR and COMPLETED.
* </i></p>
*
*
* @param jobID The ID of this job (NOT NULL).
* @param owner Its owner.
* @param params UWS standard and non-standard parameters.
......@@ -384,7 +384,7 @@ public class UWSJob extends SerializableUWSObject {
* @param endTime Its end time if it is already finished.
* @param results Its results (if phase=COMPLETED).
* @param error Its error (if phase=ERROR).
*
*
* @throws NullPointerException If the given ID is NULL.
*/
public UWSJob(final String jobID, final JobOwner owner, final UWSParameters params, final long quote, final long startTime, final long endTime, final List<Result> results, final ErrorSummary error) throws NullPointerException{
......@@ -438,13 +438,13 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>This function lets generating a unique ID.</p>
*
*
* <p><i><b>By default:</b> System.currentTimeMillis()+UpperCharacter (UpperCharacter: one upper-case character chosen in order to guarantee the unicity of the ID: A, B, C, ....)</i></p>
*
*
* <p><i><u>note: </u> DO NOT USE in this function any of the following functions: {@link #getLogger()},
* {@link #getFileManager()} and {@link #getFactory()}. All of them will return NULL, because this job does not
* yet know its jobs list (which is needed to know the UWS and so, all of the objects returned by these functions).</i></p>
*
*
* @return A unique job identifier.
*/
protected String generateJobId(){
......@@ -461,13 +461,13 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Gets the value of the specified parameter.</p>
*
*
* <p><i><u>note:</u> No case sensitivity for the UWS parameters ON THE CONTRARY TO the names of the additional parameters (which are case sensitive).</i></p>
*
*
* @param name Name of the parameter to get.
*
*
* @return Its value or <i>null</i> if there is no parameter with the given name or if the value is <i>null</i>.
*
*
* @see UWSParameters#get(String)
*/
public Object getParameter(String name){
......@@ -498,12 +498,12 @@ public class UWSJob extends SerializableUWSObject {
* <li> is equals to {@link UWSJob#PHASE_ABORT ABORT} => remove it from the attribute {@link #inputParams} and abort the job.</li>
* <li> is another value => the attribute is though removed from the attribute {@link #inputParams} but nothing is done.</li>
* </ul>
*
*
* @param user The user who asks to apply the phase parameter (start/abort). (may be NULL)
*
*
* @throws UWSException If it is impossible the state of this job (into EXECUTING or ABORTED)
* or if the given user is not allowed to execute this job.
*
*
* @see UWSParameters#hasInputPhase()
* @see UWSParameters#getInputPhase()
* @see #start()
......@@ -533,9 +533,9 @@ public class UWSJob extends SerializableUWSObject {
/* ***************** */
/**
* Gets the file manager used in this job.
*
*
* @return Its file manager or <i>null</i> if this job is not into a {@link JobList} or if this jobs list is not into a {@link UWS}.
*
*
* @see JobList#getUWS()
* @see uws.service.UWS#getFileManager()
*/
......@@ -548,9 +548,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the logger of its UWS or a default one if the job list or the UWS is unknown.
*
*
* @return A logger.
*
*
* @see JobList#getUWS()
* @see uws.service.UWS#getLogger()
* @see UWSToolBox#getDefaultLogger()
......@@ -564,7 +564,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the factory to use to create the thread to execute when this job starts.
*
*
* @return The factory to use to create a {@link JobThread}.
*/
public final UWSFactory getFactory(){
......@@ -576,7 +576,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the date of the restoration of this job.
*
*
* @return Date of its restoration.
*/
public final Date getRestorationDate(){
......@@ -585,9 +585,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the phase in which this job is now.
*
*
* @return The current phase of this job.
*
*
* @see JobPhase#getPhase()
*/
public final ExecutionPhase getPhase(){
......@@ -596,18 +596,18 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets the current phase of this job.</p>
*
*
* <p><b><u>IMPORTANT:</u></b>
* <ul><li>The order of all phases must be respected:<i> BY DEFAULT</i> <BR /> {@link ExecutionPhase#PENDING PENDING} ---> {@link ExecutionPhase#QUEUED QUEUED} ---> {@link ExecutionPhase#EXECUTING EXECUTING} ---> {@link ExecutionPhase#COMPLETED COMPLETED}.</li>
* <li>The only way to go to the {@link ExecutionPhase#EXECUTING EXECUTING} phase is by sending a POST query with the value {@link UWSJob#PHASE_RUN RUN} for the parameter {@link UWSJob#PARAM_PHASE PHASE}.</li>
* <li>The only way to go to the {@link ExecutionPhase#ABORTED ABORTED} phase is by sending a POST query with the value {@link UWSJob#PHASE_ABORT ABORT} for the parameter {@link UWSJob#PARAM_PHASE PHASE}.</li>
* <li>The start time and the end time are set automatically when the phase is set to {@link ExecutionPhase#EXECUTING EXECUTING} and {@link ExecutionPhase#COMPLETED COMPLETED}, {@link ExecutionPhase#ABORTED ABORTED} or {@link ExecutionPhase#ERROR ERROR}</li>
*</ul></p>
*
*
* @param p The phase to set for this job.
*
*
* @throws UWSException If the given phase does not respect the job's phases order.
*
*
* @see #setPhase(ExecutionPhase, boolean)
*/
public final void setPhase(ExecutionPhase p) throws UWSException{
......@@ -616,19 +616,19 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets the current phase of this job, respecting or not the imposed order.</p>
*
*
* <p><b><u>IMPORTANT:</u></b>
* <ul><li><b><u>If the parameter <i>force</i> is <i>false</i></u></b>, the order of all phases must be respected:<BR /> {@link ExecutionPhase#PENDING PENDING} ---> {@link ExecutionPhase#QUEUED QUEUED} ---> {@link ExecutionPhase#EXECUTING EXECUTING} ---> {@link ExecutionPhase#COMPLETED COMPLETED}.</li>
* <li>The only way to go to the {@link ExecutionPhase#EXECUTING EXECUTING} phase is by sending a POST query with the value {@link UWSJob#PHASE_RUN RUN} for the parameter {@link UWSJob#PARAM_PHASE PARAM_PHASE}.</li>
* <li>The only way to go to the {@link ExecutionPhase#ABORTED ABORTED} phase is by sending a POST query with the value {@link UWSJob#PHASE_ABORT ABORT} for the parameter {@link UWSJob#PARAM_PHASE PARAM_PHASE}.</li>
* <li>The start time and the end time are set automatically when the phase is set to {@link ExecutionPhase#EXECUTING EXECUTING} and {@link ExecutionPhase#COMPLETED COMPLETED}, {@link ExecutionPhase#ABORTED ABORTED} or {@link ExecutionPhase#ERROR ERROR}</li>
*</ul></p>
*
*
* @param p The phase to set for this job.
* @param force <i>true</i> to impose the given execution phase, <i>false</i> to take into account the order of all phases.
*
*
* @throws UWSException If the given phase does not respect the job's phases order.
*
*
* @see JobPhase#setPhase(ExecutionPhase, boolean)
* @see JobPhase#isFinished()
* @see ExecutionManager#remove(UWSJob)
......@@ -653,9 +653,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Gets the phase manager of this job.</p>
*
*
* <p><i><u>Note:</u> The phase manager manages all the transitions between all the execution phases.</i></p>
*
*
* @return Its phase manager.
*/
public final JobPhase getPhaseManager(){
......@@ -664,9 +664,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets the phase manager of this job.</p>
*
*
* <p><i><u>Note:</u> The phase manager manages all the transitions between all the execution phases.</i></p>
*
*
* @param jobPhase Its new phase manager (if <i>null</i> this function does nothing).
*/
public final void setPhaseManager(JobPhase jobPhase){
......@@ -679,7 +679,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the time at which the job execution has started.
*
*
* @return The start time of the execution of this job.
*/
public final Date getStartTime(){
......@@ -688,7 +688,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Sets the time at which the job execution has started.
*
*
* @param newDateTime The start time of the execution of this job.
*/
protected final void setStartTime(Date newDateTime){
......@@ -697,7 +697,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the time at which the job execution has finished.
*
*
* @return The end time of the execution of this job.
*/
public final Date getEndTime(){
......@@ -706,7 +706,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Sets the time at which the job execution has finished.
*
*
* @param newDateTime The end time of the execution of this job.
*/
protected final void setEndTime(Date newDateTime){
......@@ -722,9 +722,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the duration (in seconds) for which this job shall run.
*
*
* @return The execution duration of this job.
*
*
* @see UWSParameters#getExecutionDuration()
*/
public final long getExecutionDuration(){
......@@ -733,11 +733,11 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets the duration (in seconds) for which this job shall run ONLY IF the job can updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).</p>
*
*
* <p><i><u>Note:</u> A duration of 0 (or less) implies unlimited execution duration.</i></p>
*
*
* @param executionDuration The execution duration of this job.
*
*
* @see UWSParameters#set(String, Object)
*/
public final void setExecutionDuration(long executionDuration){
......@@ -752,9 +752,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the instant when the job shall be destroyed.
*
*
* @return The destruction time of this job.
*
*
* @see UWSParameters#getDestructionTime()
*/
public final Date getDestructionTime(){
......@@ -766,9 +766,9 @@ public class UWSJob extends SerializableUWSObject {
* Sets the instant when the job shall be destroyed ONLY IF the job can updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).
* If known the jobs list is notify of this destruction time update.
* </p>
*
*
* @param destructionTime The destruction time of this job. <i>MUST NOT be NULL</i>
*
*
* @see JobList#updateDestruction(UWSJob)
* @see UWSParameters#set(String, Object)
*/
......@@ -786,7 +786,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the error that occurs during the execution of this job.
*
*
* @return A summary of the error.
*/
public final ErrorSummary getErrorSummary(){
......@@ -795,14 +795,14 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets the error that occurs during the execution of this job.</p>
*
*
* <p><b><u>IMPORTANT:</u> This function will have no effect if the job is finished, that is to say if the current phase is
* {@link ExecutionPhase#ABORTED ABORTED}, {@link ExecutionPhase#ERROR ERROR} or {@link ExecutionPhase#COMPLETED COMPLETED}.</i>.</b></p>
*
*
* @param errorSummary A summary of the error. <i>MUST NOT be NULL</i>
*
*
* @throws UWSException If the job execution is finished that is to say if the phase is ABORTED, ERROR or COMPLETED.
*
*
* @see #isFinished()
*/
public final void setErrorSummary(ErrorSummary errorSummary) throws UWSException{
......@@ -818,7 +818,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the ID of this job (this ID <b>MUST</b> be unique).
*
*
* @return The job ID (unique).
*/
public final String getJobId(){
......@@ -828,11 +828,11 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Gets the RunID of this job given by the UWS user (presumed to be the owner of this job).
* This ID isn't the one used to access to this job thanks to the jobs list: it is more likely a label/name than an ID => it is not unique.</p>
*
*
* <p><b><u>Warning:</u> This ID may be used by other jobs BUT their job id (cf {@link UWSJob#getJobId()}) must be different.</b></p>
*
*
* @return The Run ID (a kind of job name/label).
*
*
* @see UWSParameters#getRunId()
*/
public final String getRunId(){
......@@ -841,11 +841,11 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets the RunID of this job ONLY IF the job can updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).</p>
*
*
* @param name Its name/label.
*
*
* @see JobPhase#isJobUpdatable()
*
*
* @see UWSParameters#set(String, Object)
*/
public final void setRunId(String name){
......@@ -860,7 +860,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the owner of this job.
*
*
* @return The owner.
*/
public final JobOwner getOwner(){
......@@ -878,9 +878,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets the quote attribute of this job ONLY IF the job can updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).</p>
*
*
* @param nbSeconds The estimated duration of the job execution (in seconds).
*
*
* @see JobPhase#isJobUpdatable()
*/
public final void setQuote(long nbSeconds){
......@@ -890,9 +890,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the list of parameters' name.
*
*
* @return The additional parameters of this job.
*
*
* @see UWSParameters#getNames()
*/
public final Set<String> getAdditionalParameters(){
......@@ -901,7 +901,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the number of additional parameters.
*
*
* @return Number of additional parameters.
*/
public final int getNbAdditionalParameters(){
......@@ -910,7 +910,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the value of the specified additional parameter.
*
*
* @param paramName The name of the parameter whose the value is wanted.
* @return The value of the specified parameter or <i>null</i> if it doesn't exist.
*/
......@@ -920,15 +920,15 @@ public class UWSJob extends SerializableUWSObject {
/**
* Adds or updates the specified parameter with the given value ONLY IF the job can be updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).
*
*
* @param paramName The name of the parameter to add or to update.
* @param paramValue The (new) value of the specified parameter.
*
*
* @return <ul><li><i>true</i> if the parameter has been successfully added/updated,</li>
* <li><i>false</i> otherwise <i>(particularly if paramName=null or paramName="" or paramValue=null)</i>.</li></ul>
*
*
* @throws UWSException If a parameter value is incorrect.
*
*
* @see JobPhase#isJobUpdatable()
*/
public final boolean addOrUpdateParameter(String paramName, Object paramValue) throws UWSException{
......@@ -937,18 +937,18 @@ public class UWSJob extends SerializableUWSObject {
/**
* Adds or updates the specified parameter with the given value ONLY IF the job can be updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).
*
*
* @param paramName The name of the parameter to add or to update.
* @param paramValue The (new) value of the specified parameter.
* @param user The user who asks for this update.
*
*
* @return <ul><li><i>true</i> if the parameter has been successfully added/updated,</li>
* <li><i>false</i> otherwise <i>(particularly if paramName=null or paramName="" or paramValue=null)</i>.</li></ul>
*
*
* @throws UWSException If a parameter value is incorrect.
*
*
* @since 4.1
*
*
* @see JobPhase#isJobUpdatable()
*/
public final boolean addOrUpdateParameter(String paramName, Object paramValue, final JobOwner user) throws UWSException{
......@@ -982,20 +982,20 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Adds or updates the given parameters ONLY IF the job can be updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).</p>
*
*
* <p>At the end of this function, the method {@link #applyPhaseParam(JobOwner)} is called so that if there is an additional parameter {@link #PARAM_PHASE} with the value:
* <ul>
* <li>{@link UWSJob#PHASE_RUN RUN} then the job is starting and the phase goes to {@link ExecutionPhase#EXECUTING EXECUTING}.</li>
* <li>{@link UWSJob#PHASE_ABORT ABORT} then the job is aborting.</li>
* <li>otherwise the parameter {@link UWSJob#PARAM_PHASE PARAM_PHASE} is removed from {@link UWSJob#inputParams inputParams} and nothing is done.</li>
* </ul></p>
*
*
* @param params A list of parameters to add/update.
* @return <ul><li><i>true</i> if all the given parameters have been successfully added/updated,</li>
* <li><i>false</i> if some parameters have not been managed.</li></ul>
*
*
* @throws UWSException If a parameter value is incorrect.
*
*
* @see #addOrUpdateParameters(UWSParameters, JobOwner)
*/
public boolean addOrUpdateParameters(UWSParameters params) throws UWSException{
......@@ -1004,22 +1004,22 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Adds or updates the given parameters ONLY IF the job can be updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).</p>
*
*
* <p>At the end of this function, the method {@link #applyPhaseParam(JobOwner)} is called so that if there is an additional parameter {@link #PARAM_PHASE} with the value:
* <ul>
* <li>{@link UWSJob#PHASE_RUN RUN} then the job is starting and the phase goes to {@link ExecutionPhase#EXECUTING EXECUTING}.</li>
* <li>{@link UWSJob#PHASE_ABORT ABORT} then the job is aborting.</li>
* <li>otherwise the parameter {@link UWSJob#PARAM_PHASE PARAM_PHASE} is removed from {@link UWSJob#inputParams inputParams} and nothing is done.</li>
* </ul></p>
*
*
* @param params The UWS parameters to update.
* @param user The user who asks for this update.
*
*
* @return <ul><li><i>true</i> if all the given parameters have been successfully added/updated,</li>
* <li><i>false</i> if some parameters have not been managed.</li></ul>
*
*
* @throws UWSException If a parameter value is incorrect or if the given user can not update or execute this job.
*
*
* @see JobPhase#isJobUpdatable()
* @see #applyPhaseParam(JobOwner)
*/
......@@ -1065,11 +1065,11 @@ public class UWSJob extends SerializableUWSObject {
/**
* Removes the specified additional parameter ONLY IF the job can be updated (considering its current execution phase, see {@link JobPhase#isJobUpdatable()}).
*
*
* @param paramName The name of the parameter to remove.
*
*
* @return <i>true</i> if the parameter has been successfully removed, <i>false</i> otherwise.
*
*
* @see JobPhase#isJobUpdatable()
* @see UWSParameters#remove(String)
*/
......@@ -1093,7 +1093,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the results list of this job.
*
*
* @return An iterator on the results list.
*/
public final Iterator<Result> getResults(){
......@@ -1102,9 +1102,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the specified result.
*
*
* @param resultId ID of the result to return.
*
*
* @return The corresponding result.
*/
public final Result getResult(String resultId){
......@@ -1113,7 +1113,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the total number of results.
*
*
* @return The number of results.
*/
public final int getNbResults(){
......@@ -1122,15 +1122,15 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Adds the given result in the results list of this job.</p>
*
*
* <p><b><u>IMPORTANT:</u> This function will throw an error if the job is finished.</b></p>
*
*
* @param res The result to add (<b>not null</b>).
*
*
* @return <i>true</i> if the result has been successfully added, <i>false</i> otherwise (for instance, if a result has the same ID).
*
*
* @throws UWSException If the job execution is finished that is to say if the phase is ABORTED, ERROR or COMPLETED.
*
*
* @see #isFinished()
*/
public boolean addResult(Result res) throws UWSException{
......@@ -1154,10 +1154,10 @@ public class UWSJob extends SerializableUWSObject {
/**
* Get the additional information about this job.
*
*
* @return Additional info. about this job,
* or NULL if there is none.
*
*
* @since 4.2
*/
public final JobInfo getJobInfo(){
......@@ -1166,25 +1166,25 @@ public class UWSJob extends SerializableUWSObject {
/**
* Set the additional information about this job.
*
*
* <p><i>Note:
* By default, this function replaces the current {@link JobInfo}
* of this job by the given one (even if NULL). This behavior
* can be changed by overwriting this function and by returning the
* extended {@link UWSJob} in the used {@link UWSFactory}.
* </i></p>
*
*
* <p><b>Important note:</b>
* When attributing a {@link JobInfo} to a {@link UWSJob}, you
* may have to call {@link JobInfo#setJob(UWSJob)} on the former
* and the new jobInfo (see the default implementation for an example)
* for some implementations of {@link JobInfo}.
* </p>
*
*
* @param newJobInfo The new additional info. about this job.
* <i>NULL is allowed and should be used to remove a
* JobInfo from a job.</i>
*
*
* @since 4.2
*/
public void setJobInfo(final JobInfo newJobInfo){
......@@ -1202,7 +1202,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the execution manager of this job, if any.
*
*
* @return Its execution manager (may be <i>null</i>).
*/
public final ExecutionManager getExecutionManager(){
......@@ -1211,7 +1211,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets its jobs list, if known.
*
*
* @return Its jobs list (may be <i>null</i>).
*/
public final JobList getJobList(){
......@@ -1220,15 +1220,15 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Sets its jobs list.</p>
*
*
* <p><i><u>note 1:</u> a job can change its jobs list ONLY WHILE PENDING !</i></p>
* <p><i><u>note 2:</u> this job is removed from its previous job list, if there is one.</i></p>
* <p><i><u>note 3:</u> this job is NOT automatically added into the new jobs list. Indeed, this function should be called by {@link JobList#addNewJob(UWSJob)}.</i></p>
*
*
* @param jobList Its new jobs list. <i><u>note:</u> if NULL, nothing is done !</i>
*
*
* @throws IllegalStateException If this job is not PENDING.
*
*
* @see JobList#removeJob(String)
* @see JobList#getJob(String)
*/
......@@ -1247,9 +1247,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the UWS URL of this job in function of its jobs list.
*
*
* @return Its corresponding UWSUrl.
*
*
* @see JobList#getUrl()
* @see UWSUrl#jobSummary(String, String)
*/
......@@ -1267,7 +1267,7 @@ public class UWSJob extends SerializableUWSObject {
/* ******************** */
/**
* Gets the time to wait for the end of the thread after an interruption.
*
*
* @return The time to wait for the end of the thread (a negative or null value means no wait for the end of the thread).
*/
public final long getTimeToWaitForEnd(){
......@@ -1276,7 +1276,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Sets the time to wait for the end of the thread after an interruption.
*
*
* @param timeToWait The new time to wait for the end of the thread (a negative or null value means no wait for the end of the thread).
*/
public final void setTimeToWaitForEnd(long timeToWait){
......@@ -1285,7 +1285,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Starts the job by using the execution manager if any.</p>
*
*
* @throws UWSException
*/
public final void start() throws UWSException{
......@@ -1294,14 +1294,14 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Starts the job.</p>
*
*
* <p><i><u>Note:</u> This function does nothing if the job is already running !</i></p>
*
*
* @param useManager <i>true</i> to let the execution manager deciding whether the job starts immediately or whether it must be put in a queue until enough resources are available, <i>false</i> to start the execution immediately.
*
*
* @throws NullPointerException If this job is not associated with a job list or the associated job list is not part of a UWS service or if no thread is created.
* @throws UWSException If there is an error while changing the execution phase or when starting the corresponding thread.
*
*
* @see #isRunning()
* @see UWSFactory#createJobThread(UWSJob)
* @see ExecutionManager#execute(UWSJob)
......@@ -1346,7 +1346,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Stop/Cancel this job when its maximum execution duration has been reached.
*
*
* @author Gr&eacute;gory Mantelet (CDS;ARI)
* @version 4.1 (09/2014)
*/
......@@ -1374,11 +1374,11 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Tells whether the job is still running.</p>
*
*
* <p><i><u>Note:</u> This function tests the execution phase (see {@link JobPhase#isExecuting()}) AND the status of the thread (see {@link #isStopped()}).</i></p>
*
*
* @return <i>true</i> if the job is still running, <i>false</i> otherwise.
*
*
* @see JobPhase#isExecuting()
* @see #isStopped()
*/
......@@ -1388,11 +1388,11 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Tells whether the job is already finished (completed, aborted, error, ...).</p>
*
*
* <p><i><u>Note:</u> This function test the execution phase (see {@link JobPhase#isFinished()}) AND the status of the thread (see {@link #isStopped()})</i></p>
*
*
* @return <i>true</i> if the job is finished, <i>false</i> otherwise.
*
*
* @see JobPhase#isFinished()
* @see #isStopped()
*/
......@@ -1402,12 +1402,12 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Stops immediately the job, sets its phase to {@link ExecutionPhase#ABORTED ABORTED} and sets its end time.</p>
*
*
* <p><b><u>IMPORTANT:</u> If the thread does not stop immediately the phase and the end time are not modified. However it can be done by calling one more time {@link #abort()}.
* Besides you should check that you test regularly the interrupted flag of the thread in {@link JobThread#jobWork()} !</b></p>
*
*
* @throws UWSException If there is an error while changing the execution phase.
*
*
* @see #stop()
* @see #isStopped()
* @see #setPhase(ExecutionPhase)
......@@ -1432,15 +1432,15 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Stops immediately the job, sets its error summary, sets its phase to {@link ExecutionPhase#ERROR} and sets its end time.</p>
*
*
* <p><b><u>IMPORTANT:</u> If the thread does not stop immediately the phase, the error summary and the end time are not modified.
* However it can be done by calling one more time {@link #error(ErrorSummary)}.
* Besides you should check that you test regularly the interrupted flag of the thread in {@link JobThread#jobWork()} !</b></p>
*
*
* @param error The error that has interrupted this job.
*
*
* @throws UWSException If there is an error while setting the error summary or while changing the phase.
*
*
* @see #stop()
* @see #isStopped()
* @see JobPhase#isFinished()
......@@ -1496,7 +1496,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Tells whether the thread is different from <i>null</i>, is not alive or is finished (see {@link JobThread#isFinished()}).</p>
*
*
* <p><i><b>Important note:</b>
* Having the interrupted flag set to <code>true</code> is not enough to consider the job as stopped.
* So, if the job has been interrupted but is still running, it should mean that the {@link JobThread#jobWork()} does not
......@@ -1504,7 +1504,7 @@ public class UWSJob extends SerializableUWSObject {
* considered as stopped/aborted - so the phase stays {@link ExecutionPhase#EXECUTING EXECUTING} - until the thread is "unblocked"
* and the interruption is detected.
* </i></p>
*
*
* @return <i>true</i> if the thread is not still running, <i>false</i> otherwise.
*/
protected final boolean isStopped(){
......@@ -1514,7 +1514,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>Stops the job if running, removes the job from the execution manager, stops the timer for the execution duration
* and may clear all files or any other resources associated to this job.</p>
*
*
* <p><i>By default the job is aborted, the {@link UWSJob#thread} attribute is set to null, the timers are stopped and uploaded files, results and the error summary are deleted and the jobInfo is destroyed.</i></p>
*/
public void clearResources(){
......@@ -1581,9 +1581,9 @@ public class UWSJob extends SerializableUWSObject {
/* ******************* */
/**
* Lets adding an observer of this job. The observer will be notified each time the execution phase changes.
*
*
* @param observer A new observer of this job.
*
*
* @return <i>true</i> if the given object has been successfully added as observer of this job, <i>false</i> otherwise.
*/
public final boolean addObserver(JobObserver observer){
......@@ -1596,7 +1596,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the total number of observers this job has.
*
*
* @return Number of its observers.
*/
public final int getNbObservers(){
......@@ -1605,7 +1605,7 @@ public class UWSJob extends SerializableUWSObject {
/**
* Gets the observers of this job.
*
*
* @return An iterator on the list of its observers.
*/
public final Iterator<JobObserver> getObservers(){
......@@ -1614,9 +1614,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* Lets removing the given object from the list of observers of this job.
*
*
* @param observer The object which must not be considered as observer of this job.
*
*
* @return <i>true</i> if the given object is not any more an observer of this job, <i>false</i> otherwise.
*/
public final boolean removeObserver(JobObserver observer){
......@@ -1632,26 +1632,14 @@ public class UWSJob extends SerializableUWSObject {
/**
* Notifies all the observer of this job that its phase has changed.
*
*
* @param oldPhase The former phase of this job.
* @throws UWSException If at least one observer can not have been updated.
*/
public final void notifyObservers(ExecutionPhase oldPhase){
int i = 0;
JobObserver observer = null;
String errors = null;
while(i < observers.size()){
// Gets the observer:
if (i == 0 && observer == null)
observer = observers.get(i);
else if (observer.equals(observers.get(i))){
i++;
if (i < observers.size())
observer = observers.get(i);
else
return;
}
for(JobObserver observer : observers){
// Update this observer:
try{
observer.update(this, oldPhase, getPhase());
......@@ -1672,11 +1660,11 @@ public class UWSJob extends SerializableUWSObject {
/* **************** */
/**
* <p>Gets the error (if any) which has occurred during the job execution.</p>
*
*
* <p><i><u>Note:</u> In the case an error summary can not have been published, the job has no error summary.
* However the last {@link UWSException} caught during the execution of a {@link JobThread} is saved and is available thanks to {@link JobThread#getError()}.
* In that case, the {@link UWSJob#getWorkError() getWorkError()} method can be used to get back the occurred error.</i></p>
*
*
* @return The error which interrupts the thread or <i>null</i> if there was no error or if the job is still running.
*/
public final UWSException getWorkError(){
......@@ -1696,14 +1684,14 @@ public class UWSJob extends SerializableUWSObject {
/**
* Serializes the specified attribute of this job by using the given serializer.
*
*
* @param attributes All the given attributes (may be <i>null</i> or empty).
* @param serializer The serializer to use.
*
*
* @return The serialized job attribute (or the whole job if <i>attributes</i> is an empty array or is <i>null</i>).
*
*
* @throws Exception If there is an unexpected error during the serialization.
*
*
* @see UWSSerializer#getJob(UWSJob, String[], boolean)
*/
public String serialize(String[] attributes, UWSSerializer serializer) throws Exception{
......@@ -1712,13 +1700,13 @@ public class UWSJob extends SerializableUWSObject {
/**
* Serializes the specified attribute of this job in the given output stream by using the given serializer.
*
*
* @param output The output stream in which the job attribute must be serialized.
* @param attributes The name of the attribute to serialize (if <i>null</i>, the whole job will be serialized).
* @param serializer The serializer to use.
*
*
* @throws Exception If there is an unexpected error during the serialization.
*
*
* @see #serialize(String[], UWSSerializer)
*/
public void serialize(ServletOutputStream output, String[] attributes, UWSSerializer serializer) throws UWSException, IOException, Exception{
......@@ -1753,9 +1741,9 @@ public class UWSJob extends SerializableUWSObject {
/**
* <p>2 instances of AbstractJob are equals ONLY IF their ID are equals.</p>
*
*
* <p><i><u>Note:</u> If the given object is not an AbstractJob, FALSE is returned.</i></p>
*
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment