blob: 13f65d8f4be5d35b675eec66ac6f931f7169987d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.rtsystem;
import java.io.IOException;
import java.math.BigInteger;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ptp.core.PTPCorePlugin;
import org.eclipse.ptp.core.attributes.AttributeDefinitionManager;
import org.eclipse.ptp.core.attributes.AttributeManager;
import org.eclipse.ptp.core.attributes.IAttribute;
import org.eclipse.ptp.core.attributes.IAttributeDefinition;
import org.eclipse.ptp.core.attributes.IllegalValueException;
import org.eclipse.ptp.core.attributes.IntegerAttribute;
import org.eclipse.ptp.core.attributes.StringAttribute;
import org.eclipse.ptp.core.elements.IPJob;
import org.eclipse.ptp.core.elements.attributes.ElementAttributeManager;
import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
import org.eclipse.ptp.core.elements.attributes.ErrorAttributes;
import org.eclipse.ptp.core.elements.attributes.JobAttributes;
import org.eclipse.ptp.core.elements.attributes.MessageAttributes.Level;
import org.eclipse.ptp.core.util.RangeSet;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeAttributeDefinitionEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeConnectedStateEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeErrorStateEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeJobChangeEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeMachineChangeEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeMessageEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeNewJobEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeNewMachineEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeNewNodeEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeNewProcessEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeNewQueueEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeNodeChangeEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeProcessChangeEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeQueueChangeEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeRemoveAllEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeRemoveJobEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeRemoveMachineEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeRemoveNodeEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeRemoveProcessEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeRemoveQueueEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeRunningStateEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeShutdownStateEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeStartupErrorEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeSubmitJobErrorEvent;
import org.eclipse.ptp.internal.rtsystem.events.RuntimeTerminateJobErrorEvent;
import org.eclipse.ptp.rtsystem.proxy.IProxyRuntimeClient;
import org.eclipse.ptp.rtsystem.proxy.IProxyRuntimeEventListener;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeAttributeDefEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeConnectedStateEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeErrorStateEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeJobChangeEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeMachineChangeEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeMessageEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewJobEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewMachineEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewNodeEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewProcessEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewQueueEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNodeChangeEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeProcessChangeEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeQueueChangeEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveAllEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveJobEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveMachineEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveNodeEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveProcessEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveQueueEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRunningStateEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeShutdownStateEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeStartupErrorEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeSubmitJobErrorEvent;
import org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeTerminateJobErrorEvent;
/*
* ProxyAttributeDefEvents are formatted as follows:
*
* EVENT_HEADER NUM_DEFS ATTR_DEF ... ATTR_DEF
*
* where:
*
* EVENT_HEADER is the event message header
* NUM_DEFS is the number of attribute definitions to follow
* ATTR_DEF is an attribute definition of the form:
*
* NUM_ARGS ID TYPE NAME DESCRIPTION DISPLAY DEFAULT [ADDITIONAL_PARAMS]
*
* where:
*
* NUM_ARGS is the number of arguments in the attribute definition
* ID is a unique definition ID
* TYPE is the type of the attribute. Legal types are:
* 'BOOLEAN', 'DATE', 'DOUBLE', 'ENUMERATED', 'INTEGER', 'STRING', 'ARRAY'
* NAME is the short name of the attribute
* DESCRIPTION is the long name of the attribute
* DISPLAY is true if the attribute should be displayed in a UI
* DEFAULT is the default value of the attribute
* ADDITIONAL_PARAMS are optional parameters depending on the attribute type:
* BOOLEAN - none
* DATE - DATE_STYLE TIME_STYLE LOCALE [MIN MAX]
* DOUBLE - [MIN MAX]
* ENUMERATED - VAL ... VAL
* INTEGER - [MIN MAX]
* STRING - none
* ARRAY - none
* MIN is the minimum allowable value for the attribute
* MAX is the maximum allowable value for the attribute
* DATE_STYLE is the date format: SHORT, MEDIUM, LONG, or FULL
* TIME_STYLE is the time format: SHORT, MEDIUM, LONG, or FULL
* LOCALE is the country (see java.lang.Local)
* NUM_VALS is the number of enumerated values
* VAL is the enumerated value
*
* ProxyNew*Events are formatted as follows:
*
* EVENT_HEADER PARENT_ID NUM_RANGES ID_RANGE NUM_ATTRS KEY=VALUE ... KEY=VALUE ...
*
* where:
*
* EVENT_HEADER is the event message header
* PARENT_ID is the model element ID of the parent element
* NUM_RANGES is the number of ID_RANGEs to follow
* ID_RANGE is a range of model element ID's in RangeSet notation
* NUM_ATTRS is the number of attributes to follow
* KEY=VALUE are key/value pairs, where KEY is the attribute ID and VALUE is the attribute value
*
* Proxy*ChangeEvents are formatted as follows:
*
* EVENT_HEADER NUM_RANGES ID_RANGE NUM_ATTRS KEY=VALUE ... KEY=VALUE
*
* where:
*
* EVENT_HEADER is the event message header
* NUM_RANGES is the number of ID_RANGEs to follow
* ID_RANGE is a range of model element ID's in RangeSet notation
* NUM_ATTRS is the number of attributes to follow
* KEY=VALUE are key/value pairs, where KEY is the attribute ID and VALUE is the new attribute value
*
* ProxyRemove*Events (apart from ProxyRemoveAllEvent) are formatted as follows:
*
* EVENT_HEADER ID_RANGE
*
* where:
*
* EVENT_HEADER is the event message header
* ID_RANGE is a range of model element ID's in RangeSet notation.
*
* The ProxyRemoveAllEvent is formatted as follows:
*
* EVENT_HEADER
*
* where:
*
* EVENT_HEADER is the event message header
*/
public abstract class AbstractProxyRuntimeSystem extends AbstractRuntimeSystem implements IProxyRuntimeEventListener {
private final static int ATTR_MIN_LEN = 5;
protected IProxyRuntimeClient proxy = null;
private AttributeDefinitionManager attrDefManager;
private int jobSubIdCount = 0;
private Map<String, AttributeManager> jobSubs = Collections.synchronizedMap(new HashMap<String, AttributeManager>());
public AbstractProxyRuntimeSystem(IProxyRuntimeClient proxy, AttributeDefinitionManager manager) {
this.proxy = proxy;
this.attrDefManager = manager;
proxy.addProxyRuntimeEventListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeAttributeDefEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeAttributeDefEvent)
*/
public void handleEvent(IProxyRuntimeAttributeDefEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length >= ATTR_MIN_LEN + 2) {
try {
int numDefs = Integer.parseInt(attrs[0]);
ArrayList<IAttributeDefinition<?,?,?>> attrDefs =
new ArrayList<IAttributeDefinition<?,?,?>>(numDefs);
int pos = 1;
for (int i = 0; i < numDefs; i++) {
int numArgs = Integer.parseInt(attrs[pos]);
if (numArgs >= ATTR_MIN_LEN && pos + numArgs < attrs.length) {
IAttributeDefinition<?,?,?> attrDef =
parseAttributeDefinition(attrs, pos + 1, pos + numArgs);
if (attrDef != null) {
attrDefs.add(attrDef);
}
pos += numArgs + 1;
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "Bad proxy event: bad arg count"));
return;
}
}
fireRuntimeAttributeDefinitionEvent(new RuntimeAttributeDefinitionEvent(attrDefs.toArray(new IAttributeDefinition[attrDefs.size()])));
} catch (NumberFormatException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "Bad proxy event: could not convert arg to integer"));
}
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "Bad proxy event: not enough arguments"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.IProxyRuntimeEventListener#handleProxyRuntimeErrorStateEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeErrorStateEvent)
*/
public void handleEvent(IProxyRuntimeErrorStateEvent e) {
fireRuntimeErrorStateEvent(new RuntimeErrorStateEvent());
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeErrorEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeErrorEvent)
*/
public void handleEvent(IProxyRuntimeMessageEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length > 0) {
AttributeManager mgr = getAttributeManager(attrs, 0, attrs.length - 1);
fireRuntimeMessageEvent(new RuntimeMessageEvent(mgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeJobChangeEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeJobChangeEvent)
*/
public void handleEvent(IProxyRuntimeJobChangeEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 0);
if (eMgr != null) {
fireRuntimeJobChangeEvent(new RuntimeJobChangeEvent(eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeMachineChangeEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeMachineChangeEvent)
*/
public void handleEvent(IProxyRuntimeMachineChangeEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 0);
if (eMgr != null) {
fireRuntimeMachineChangeEvent(new RuntimeMachineChangeEvent(eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeNewJobEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewJobEvent)
*/
public void handleEvent(IProxyRuntimeNewJobEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 2) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 1);
if (eMgr != null) {
/*
* Find any job submission attributes and add to the jobs
*/
for (Map.Entry<RangeSet, AttributeManager> entry : eMgr.getEntrySet()) {
StringAttribute subIdAttr = entry.getValue().getAttribute(JobAttributes.getSubIdAttributeDefinition());
if (subIdAttr != null) {
String subId = subIdAttr.getValueAsString();
AttributeManager mgr = jobSubs.get(subId);
if (mgr != null) {
entry.getValue().addAttributes(mgr.getAttributes());
}
jobSubs.remove(subId);
}
}
fireRuntimeNewJobEvent(new RuntimeNewJobEvent(attrs[0], eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeNewMachineEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewMachineEvent)
*/
public void handleEvent(IProxyRuntimeNewMachineEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 2) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 1);
if (eMgr != null) {
fireRuntimeNewMachineEvent(new RuntimeNewMachineEvent(attrs[0], eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeNewNodeEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewNodeEvent)
*/
public void handleEvent(IProxyRuntimeNewNodeEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 2) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 1);
if (eMgr != null) {
fireRuntimeNewNodeEvent(new RuntimeNewNodeEvent(attrs[0], eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeNewProcessEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewProcessEvent)
*/
public void handleEvent(IProxyRuntimeNewProcessEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 2) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 1);
if (eMgr != null) {
fireRuntimeNewProcessEvent(new RuntimeNewProcessEvent(attrs[0], eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeNewQueueEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNewQueueEvent)
*/
public void handleEvent(IProxyRuntimeNewQueueEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 2) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 1);
if (eMgr != null) {
fireRuntimeNewQueueEvent(new RuntimeNewQueueEvent(attrs[0], eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeNodeChangeEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeNodeChangeEvent)
*/
public void handleEvent(IProxyRuntimeNodeChangeEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 0);
if (eMgr != null) {
fireRuntimeNodeChangeEvent(new RuntimeNodeChangeEvent(eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeProcessChangeEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeProcessChangeEvent)
*/
public void handleEvent(IProxyRuntimeProcessChangeEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 0);
if (eMgr != null) {
fireRuntimeProcessChangeEvent(new RuntimeProcessChangeEvent(eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeQueueChangeEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeQueueChangeEvent)
*/
public void handleEvent(IProxyRuntimeQueueChangeEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
ElementAttributeManager eMgr = getElementAttributeManager(attrs, 0);
if (eMgr != null) {
fireRuntimeQueueChangeEvent(new RuntimeQueueChangeEvent(eMgr));
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeConnectedStateEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeConnectedStateEvent)
*/
public void handleEvent(IProxyRuntimeConnectedStateEvent e) {
fireRuntimeConnectedStateEvent(new RuntimeConnectedStateEvent());
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.IProxyRuntimeEventListener#handleProxyRuntimeRemoveAllEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveAllEvent)
*/
public void handleEvent(IProxyRuntimeRemoveAllEvent e) {
fireRuntimeRemoveAllEvent(new RuntimeRemoveAllEvent());
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeRemoveJobEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveJobEvent)
*/
public void handleEvent(IProxyRuntimeRemoveJobEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
fireRuntimeRemoveJobEvent(new RuntimeRemoveJobEvent(new RangeSet(attrs[0])));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeRemoveMachineEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveMachineEvent)
*/
public void handleEvent(IProxyRuntimeRemoveMachineEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
fireRuntimeRemoveMachineEvent(new RuntimeRemoveMachineEvent(new RangeSet(attrs[0])));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeRemoveNodeEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveNodeEvent)
*/
public void handleEvent(IProxyRuntimeRemoveNodeEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
fireRuntimeRemoveNodeEvent(new RuntimeRemoveNodeEvent(new RangeSet(attrs[0])));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeRemoveProcessEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveProcessEvent)
*/
public void handleEvent(IProxyRuntimeRemoveProcessEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
fireRuntimeRemoveProcessEvent(new RuntimeRemoveProcessEvent(new RangeSet(attrs[0])));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeRemoveQueueEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRemoveQueueEvent)
*/
public void handleEvent(IProxyRuntimeRemoveQueueEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length < 1) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "AbstractProxyRuntimeSystem: not enough arguments"));
return;
}
fireRuntimeRemoveQueueEvent(new RuntimeRemoveQueueEvent(new RangeSet(attrs[0])));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeRunningStateEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeRunningStateEvent)
*/
public void handleEvent(IProxyRuntimeRunningStateEvent e) {
fireRuntimeRunningStateEvent(new RuntimeRunningStateEvent());
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeShutdownStateEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeShutdownStateEvent)
*/
public void handleEvent(IProxyRuntimeShutdownStateEvent e) {
fireRuntimeShutdownStateEvent(new RuntimeShutdownStateEvent());
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeStartupErrorEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeStartupErrorEvent)
*/
public void handleEvent(
IProxyRuntimeStartupErrorEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length > 0) {
AttributeManager mgr = getAttributeManager(attrs, 0, attrs.length - 1);
IntegerAttribute codeAttr = mgr.getAttribute(ErrorAttributes.getCodeAttributeDefinition());
StringAttribute msgAttr = mgr.getAttribute(ErrorAttributes.getMsgAttributeDefinition());
if (codeAttr == null || msgAttr == null) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "StartupErrorEvent: missing attibutes"));
} else {
fireRuntimeStartupErrorEvent(new RuntimeStartupErrorEvent(codeAttr.getValue(), msgAttr.getValue()));
}
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "StartupErrorEvent: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeSubmitJobErrorEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeSubmitJobErrorEvent)
*/
public void handleEvent(
IProxyRuntimeSubmitJobErrorEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length > 0) {
AttributeManager mgr = getAttributeManager(attrs, 0, attrs.length - 1);
IntegerAttribute codeAttr = (IntegerAttribute) mgr.getAttribute(ErrorAttributes.getCodeAttributeDefinition());
StringAttribute msgAttr = (StringAttribute) mgr.getAttribute(ErrorAttributes.getMsgAttributeDefinition());
StringAttribute jobSubIdAttr = (StringAttribute) mgr.getAttribute(JobAttributes.getSubIdAttributeDefinition());
if (codeAttr == null || msgAttr == null || jobSubIdAttr == null) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "SubmitJobErrorEvent: missing attibutes"));
} else {
fireRuntimeSubmitJobErrorEvent(new RuntimeSubmitJobErrorEvent(codeAttr.getValue(), msgAttr.getValue(), jobSubIdAttr.getValue()));
}
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "SubmitJobErrorEvent: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEventListener#handleProxyRuntimeTerminateJobErrorEvent(org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeTerminateJobErrorEvent)
*/
public void handleEvent(
IProxyRuntimeTerminateJobErrorEvent e) {
String[] attrs = e.getAttributes();
if (attrs.length > 0) {
AttributeManager mgr = getAttributeManager(attrs, 0, attrs.length - 1);
IntegerAttribute codeAttr = (IntegerAttribute) mgr.getAttribute(ErrorAttributes.getCodeAttributeDefinition());
StringAttribute msgAttr = (StringAttribute) mgr.getAttribute(ErrorAttributes.getMsgAttributeDefinition());
StringAttribute jobIdAttr = (StringAttribute) mgr.getAttribute(ElementAttributes.getIdAttributeDefinition());
if (codeAttr == null || msgAttr == null || jobIdAttr == null) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "TerminateJobErrorEvent: missing attibutes"));
} else {
fireRuntimeTerminateJobErrorEvent(new RuntimeTerminateJobErrorEvent(codeAttr.getValue(), msgAttr.getValue(), jobIdAttr.getValue()));
}
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR, "TerminateJobErrorEvent: could not parse message"));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.IRuntimeSystem#shutdown()
*/
public void shutdown() {
proxy.shutdown();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.IRuntimeSystem#startup()
*/
public boolean startup() throws CoreException {
return proxy.startup();
}
public String submitJob(AttributeManager attrMgr) throws CoreException {
try {
/*
* Add the job submission ID to the attributes. This is done here to force the
* use of the ID.
*/
String id = getJobSubmissionID();
StringAttribute jobSubAttr = JobAttributes.getSubIdAttributeDefinition().create(id);
attrMgr.addAttribute(jobSubAttr);
proxy.submitJob(attrMgr.toStringArray());
jobSubs.put(id, attrMgr);
return id;
} catch(IOException e) {
throw new CoreException(new Status(IStatus.ERROR, PTPCorePlugin.getUniqueIdentifier(), IStatus.ERROR,
"Control system is shut down, proxy exception. The proxy may have crashed or been killed.", null));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.IControlSystem#terminateJob(org.eclipse.ptp.core.elements.IPJob)
*/
public void terminateJob(IPJob job) throws CoreException {
if(job == null) {
System.err.println("ERROR: Tried to abort a null job.");
return;
}
try {
proxy.terminateJob(job.getID());
} catch(IOException e) {
throw new CoreException(new Status(IStatus.ERROR, PTPCorePlugin.getUniqueIdentifier(), IStatus.ERROR,
"Control system is shut down, proxy exception. The proxy may have crashed or been killed.", null));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.IMonitoringSystem#startEvents()
*/
public void startEvents() throws CoreException {
try {
proxy.startEvents();
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, PTPCorePlugin.getUniqueIdentifier(), IStatus.ERROR,
e.getMessage(), e));
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.rtsystem.IMonitoringSystem#stopEvents()
*/
public void stopEvents() throws CoreException {
try {
proxy.stopEvents();
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, PTPCorePlugin.getUniqueIdentifier(), IStatus.ERROR,
e.getMessage(), e));
}
}
/**
* @param kvs
* @param start
* @param end
* @return
*/
private AttributeManager getAttributeManager(String[] kvs, int start, int end) {
AttributeManager mgr = new AttributeManager();
for (int i = start; i <= end; i++) {
String[] kv = kvs[i].split("=");
if (kv.length == 2) {
try {
IAttributeDefinition<?,?,?> attrDef = attrDefManager.getAttributeDefinition(kv[0]);
if(attrDef != null) {
IAttribute<?,?,?> attr = attrDef.create(kv[1]);
mgr.addAttribute(attr);
} else {
System.out.println("AbstractProxyRuntimSystem: unknown attribute definition");
}
} catch (IllegalValueException e1) {
System.out.println("AbstractProxyRuntimSystem: invalid attribute for definition");
}
}
}
return mgr;
}
/**
* @param attrs
* @param pos
* @return
*/
private ElementAttributeManager getElementAttributeManager(String[] attrs, int pos) {
ElementAttributeManager eMgr = new ElementAttributeManager();
try {
int numRanges = Integer.parseInt(attrs[pos++]);
for (int i = 0; i < numRanges; i++) {
if (pos >= attrs.length) {
return null;
}
RangeSet ids = new RangeSet(attrs[pos++]);
int numAttrs = Integer.parseInt(attrs[pos++]);
int start = pos;
int end = pos + numAttrs - 1;
if (end >= attrs.length) {
return null;
}
eMgr.setAttributeManager(ids, getAttributeManager(attrs, start, end));
pos = end + 1;
}
} catch (NumberFormatException e1) {
return null;
}
return eMgr;
}
/**
* Parse and extract an attribute definition.
*
* On entry, we know that end < attrs.length and end - start >= ATTR_MIN_LEN
*
*/
private IAttributeDefinition<?,?,?> parseAttributeDefinition(String[] attrs, int start, int end) {
int pos = start;
IAttributeDefinition<?,?,?> attrDef = null;
String attrId = attrs[pos++];
String attrType = attrs[pos++];
String attrName = attrs[pos++];
String attrDesc = attrs[pos++];
boolean attrDisplay;
try {
attrDisplay = Boolean.parseBoolean(attrs[pos++]);
} catch (NumberFormatException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not convert attr to boolean"));
return null;
}
String attrDefault = attrs[pos++];
if (attrType.equals("BOOLEAN")) {
try {
Boolean defVal = Boolean.parseBoolean(attrDefault);
attrDef = attrDefManager.createBooleanAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, defVal);
} catch (NumberFormatException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not convert attrs to boolean"));
}
} else if (attrType.equals("DATE")) {
if (end - pos > 2) {
try {
int dateStyle = toDateStyle(attrs[pos++]);
int timeStyle = toDateStyle(attrs[pos++]);
Locale locale = toLocale(attrs[pos++]);
DateFormat fmt = DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale);
Date defVal = fmt.parse(attrDefault);
if (end - pos > 1) {
Date min = fmt.parse(attrs[pos++]);
Date max = fmt.parse(attrs[pos++]);
attrDef = attrDefManager.createDateAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, defVal, fmt, min, max);
} else {
attrDef = attrDefManager.createDateAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, defVal, fmt);
}
} catch (ParseException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not parse date"));
} catch (IllegalValueException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not create attribute definition, "
+ ex.getMessage()));
}
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: missing date format"));
}
} else if (attrType.equals("DOUBLE")) {
try {
Double defVal = Double.parseDouble(attrDefault);
if (end - pos > 0) {
Double min = Double.parseDouble(attrs[pos++]);
Double max = Double.parseDouble(attrs[pos++]);
attrDef = attrDefManager.createDoubleAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, defVal, min, max);
} else {
attrDef = attrDefManager.createDoubleAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, defVal);
}
} catch (NumberFormatException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not convert args to double"));
} catch (IllegalValueException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not create attribute definition, "
+ ex.getMessage()));
}
} else if (attrType.equals("ENUMERATED")) {
ArrayList<String> values = new ArrayList<String>();
while (pos <= end) {
values.add(attrs[pos++]);
}
try {
attrDef = attrDefManager.createStringSetAttributeDefinition(attrId, attrName,
attrDesc, attrDisplay, attrDefault, values.toArray(new String[values.size()]));
} catch (IllegalValueException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not create attribute definition, "
+ ex.getMessage()));
}
} else if (attrType.equals("INTEGER")) {
try {
Integer defVal = Integer.parseInt(attrDefault);
if (end - pos > 0) {
Integer min = Integer.parseInt(attrs[pos++]);
Integer max = Integer.parseInt(attrs[pos++]);
attrDef = attrDefManager.createIntegerAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, defVal, min, max);
} else {
attrDef = attrDefManager.createIntegerAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, defVal);
}
} catch (NumberFormatException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not convert args to integer"));
} catch (IllegalValueException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not create attribute definition, "
+ ex.getMessage()));
}
} else if (attrType.equals("BIGINTEGER")) {
try {
BigInteger defVal = new BigInteger(attrDefault);
if (end - pos > 0) {
BigInteger min = new BigInteger(attrs[pos++]);
BigInteger max = new BigInteger(attrs[pos++]);
attrDef = attrDefManager.createBigIntegerAttributeDefinition(attrId,
attrName, attrDesc, attrDisplay, defVal, min, max);
} else {
attrDef = attrDefManager.createBigIntegerAttributeDefinition(attrId, attrName,
attrDesc, attrDisplay, defVal);
}
} catch (NumberFormatException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not convert args to BigInteger"));
} catch (IllegalValueException ex) {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: could not create attribute definition, "
+ ex.getMessage()));
}
} else if (attrType.equals("STRING")) {
attrDef = attrDefManager.createStringAttributeDefinition(attrId, attrName, attrDesc, attrDisplay, attrDefault);
} else {
fireRuntimeMessageEvent(new RuntimeMessageEvent(Level.ERROR,
"Bad proxy event: unknown attribute type"));
}
return attrDef;
}
/**
* @param val
* @return
*/
private int toDateStyle(String val) {
if (val.equals("SHORT")) {
return DateFormat.SHORT;
} else if (val.equals("MEDIUM")) {
return DateFormat.MEDIUM;
} else if (val.equals("LONG")) {
return DateFormat.LONG;
} else if (val.equals("FULL")) {
return DateFormat.FULL;
} else {
return DateFormat.DEFAULT;
}
}
/**
* @param val
* @return
*/
private Locale toLocale(String val) {
if (val.equals("CANADA")) {
return Locale.CANADA;
} else if (val.equals("CHINA")) {
return Locale.CHINA;
} else if (val.equals("FRANCE")) {
return Locale.FRANCE;
} else if (val.equals("GERMANY")) {
return Locale.GERMANY;
} else if (val.equals("ITALY")) {
return Locale.ITALY;
} else if (val.equals("JAPAN")) {
return Locale.JAPAN;
} else if (val.equals("TAIWAN")) {
return Locale.TAIWAN;
} else if (val.equals("UK")) {
return Locale.UK;
} else if (val.equals("US")) {
return Locale.US;
} else {
return Locale.US;
}
}
private String getJobSubmissionID() {
long time = System.currentTimeMillis();
return "JOB_" + Long.toString(time) + Integer.toString(jobSubIdCount++);
}
}