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; } }