package com.c2kernel.lifecycle.instance.predefined;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import com.c2kernel.lifecycle.instance.Activity;
import com.c2kernel.persistency.outcome.Outcome;
import com.c2kernel.utils.Logger;
/***********************************************************************************************************************************************************************************************************************************************************************************************************
* @author $Author: sgaspard $ $Date: 2004/09/21 10:32:17 $
* @version $Revision: 1.14 $
**********************************************************************************************************************************************************************************************************************************************************************************************************/
public abstract class PredefinedStep extends Activity
{
/*******************************************************************************************************************************************************************************************************************************************************************************************************
* predefined Steps are always Active, and have only one transition subclasses could override this method (if necessary)
******************************************************************************************************************************************************************************************************************************************************************************************************/
private boolean isPredefined = false;
@Override
public boolean getActive()
{
if (isPredefined)
return true;
else
return super.getActive();
}
public static final int DONE = 0;
public static final int AVAILABLE = 0;
@Override
protected String getDefaultSMName() {
return "PredefinedStep";
}
@Override
public String getErrors()
{
if (isPredefined)
return getName();
else
return super.getErrors();
}
@Override
public boolean verify()
{
if (isPredefined)
return true;
else
return super.verify();
}
/**
* Returns the isPredefined.
*
* @return boolean
*/
public boolean getIsPredefined()
{
return isPredefined;
}
/**
* Sets the isPredefined.
*
* @param isPredefined
* The isPredefined to set
*/
public void setIsPredefined(boolean isPredefined)
{
this.isPredefined = isPredefined;
}
@Override
public String getType()
{
return getName();
}
// generic bundling of parameters
static public String bundleData(String[] data)
{
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.newDocument();
Element root = dom.createElement("PredefinedStepOutcome");
dom.appendChild(root);
for (String element : data) {
Element param = dom.createElement("param");
Text t = dom.createTextNode(element);
param.appendChild(t);
root.appendChild(param);
}
return Outcome.serialize(dom, false);
}
catch (Exception e)
{
Logger.error(e);
StringBuffer xmlData = new StringBuffer().append("");
for (String element : data)
xmlData.append("");
xmlData.append("");
return xmlData.toString();
}
}
// generic bundling of single parameter
static public String bundleData(String data)
{
return "";
}
static public String[] getDataList(String xmlData)
{
try
{
Document scriptDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xmlData)));
NodeList nodeList = scriptDoc.getElementsByTagName("param");
String[] result = new String[nodeList.getLength()];
for (int i = 0; i < nodeList.getLength(); i++)
{
Node n = nodeList.item(i).getFirstChild();
if (n instanceof CDATASection)
result[i] = ((CDATASection) n).getData();
else if (n instanceof Text)
result[i] = ((Text) n).getData();
}
return result;
}
catch (Exception ex)
{
Logger.error("Exception::PredefinedStep::getDataList()");
Logger.error(ex);
}
return null;
}
}