| /******************************************************************************* |
| * Copyright (c) 2008 IBM Corporation. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.ptp.rm.mpi.mpich2.core.rtsystem; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| |
| import org.eclipse.ptp.rm.core.utils.DebugUtil; |
| |
| /** |
| * |
| * @author Greg Watson |
| * |
| */ |
| public class MPICH2ListJobsParser { |
| public enum JobListState {JOBLIST_INIT, JOBLIST_START, JOBLIST_END, JOBLIST_COMPLETE, JOBLIST_ERROR} |
| |
| private JobListState state; |
| private MPICH2JobMap map = new MPICH2JobMap(); |
| private String errorMsg; |
| |
| /** |
| * @param parser |
| * @param line |
| * @param job |
| */ |
| private void processJobInfo(String line, MPICH2JobMap.Job job) { |
| String[] parts = line.split("="); //$NON-NLS-1$ |
| String key; |
| String value; |
| |
| if (parts.length == 1) { |
| key = parts[0].trim(); |
| value = ""; //$NON-NLS-1$ |
| } else if (parts.length == 2) { |
| key = parts[0].trim(); |
| value = parts[1].trim(); |
| } else { |
| state = JobListState.JOBLIST_ERROR; |
| errorMsg = line; |
| return; |
| } |
| |
| if ("jobid".equals(key)) { //$NON-NLS-1$ |
| job.setJobID(value); |
| } else if ("jobalias".equals(key)) { //$NON-NLS-1$ |
| job.setJobAlias(value); |
| } else if ("username".equals(key)) { //$NON-NLS-1$ |
| job.setUsername(value); |
| } else if ("host".equals(key)) { //$NON-NLS-1$ |
| job.setHost(value); |
| } else if ("pid".equals(key)) { //$NON-NLS-1$ |
| job.setPid(Integer.parseInt(value)); |
| } else if ("sid".equals(key)) { //$NON-NLS-1$ |
| job.setSid(Integer.parseInt(value)); |
| } else if ("rank".equals(key)) { //$NON-NLS-1$ |
| job.setRank(Integer.parseInt(value)); |
| } else if ("pgm".equals(key)) { //$NON-NLS-1$ |
| job.setPgm(value); |
| } else { |
| state = JobListState.JOBLIST_ERROR; |
| errorMsg = line; |
| return; |
| } |
| |
| if (job.isComplete()) { |
| state = JobListState.JOBLIST_END; |
| } |
| } |
| |
| /** |
| * @param reader |
| * @return |
| * @throws IOException |
| */ |
| public MPICH2JobMap parse(BufferedReader reader) throws IOException { |
| String line = null; |
| MPICH2JobMap.Job job = null; |
| |
| state = JobListState.JOBLIST_INIT; |
| |
| while (state != JobListState.JOBLIST_COMPLETE) { |
| switch (state) { |
| case JOBLIST_INIT: |
| if ((line = reader.readLine()) == null) { |
| state = JobListState.JOBLIST_COMPLETE; |
| break; |
| } |
| |
| line = line.trim(); |
| |
| if (line.length() == 0) { |
| // Ignore empty line |
| break; |
| } |
| |
| state = JobListState.JOBLIST_START; |
| |
| job = map.new Job(); |
| processJobInfo(line, job); |
| break; |
| |
| case JOBLIST_START: |
| if ((line = reader.readLine()) == null) { |
| state = JobListState.JOBLIST_END; |
| break; |
| } |
| |
| line = line.trim(); |
| |
| if (line.length() == 0) { |
| state = JobListState.JOBLIST_END; |
| break; |
| } |
| |
| processJobInfo(line, job); |
| break; |
| |
| case JOBLIST_END: |
| if (job != null) { |
| if (job.isComplete()) { |
| map.addJob(job); |
| } else { |
| DebugUtil.trace(DebugUtil.RTS_DISCOVER_TRACING, "job is incomplete, skipping" + job.toString()); //$NON-NLS-1$ |
| } |
| } |
| |
| if (line == null) { |
| state = JobListState.JOBLIST_COMPLETE; |
| } else { |
| state = JobListState.JOBLIST_INIT; |
| } |
| DebugUtil.trace(DebugUtil.RTS_DISCOVER_TRACING, "found job " + job.toString()); //$NON-NLS-1$ |
| break; |
| |
| case JOBLIST_COMPLETE: |
| break; |
| |
| case JOBLIST_ERROR: |
| while ((line = reader.readLine()) != null) { |
| errorMsg += "\n" + line; //$NON-NLS-1$ |
| } |
| return null; |
| } |
| } |
| |
| return map; |
| } |
| |
| /** |
| * @return |
| */ |
| public String getErrorMessage() { |
| return errorMsg; |
| } |
| } |
| |