staf工作笔记-对STAX进行扩展(配置并运行官方的Delay实例)

官方文档如下:

http://staf.sourceforge.net/current/staxdg.html#Header_reg

关于官方文档,这里有几个坑要注意:

编译STAX扩展的教程在最后面,而交你写的Delay却在前面。

创建一个Jar文件在编译的后面。

到目前为止,学了2个多月,3个月不到的java把这个官方例子跑起来了,花了2天时间,不容易啊。

首先进行编译,按照要求把CLASSPATH配好。配置要求如下:

这里的

set STAXDevDir=C:\STAXDev
set STAFDir=C:\STAF
set STAXCLASSES=%STAXDevDir%\STAF-INF\classes
set JSTAFJAR=%STAFDir%\lib\JSTAF.jar
set STAXJARDIR=%STAXDevDir%\STAF-INF\jars
REM set STAXJARDIR=%STAFDir%\data\STAF\lang\java\service\STAX\jars
set STAXJARFILES=%STAXJARDIR%\xercesImpl.jar;%STAXJARDIR%\xmlParserAPIs.jar;%STAXJARDIR%\jython.jar
set STAXMONJAR=%STAFDir%\services\STAXMon.jar
set CLASSPATH=%JSTAFJAR%;%STAXCLASSES%;%STAXJARFILES%;%STAXMONJAR%;

我也不知道该怎么配,但不要紧,为什么呢?因为后面生成jar文件的时候,只需要有Class文件就可以了。

所以把eclipse配置好。运行下,然后打包成jar包。

eclipse配置如下:

这里有一些重复的jar包,因为是我在研究eclipse添加jar包和CLASSPATH之间的关系时重复操作了,大家可以忽略。

点一下run后,导出jar包,但会有如下的情况:

有警告!!!!但没关系,我们看下这个jar包,

有Class文件,这下就好了。直接解压,然后按照

这个进行配置,但可以发现ExtDelay$1.class这个类中类竟然木有,这是一个天坑。

现在看下ExtDelay.java这个文件:

/*****************************************************************************/
/* Software Testing Automation Framework (STAF)                              */
/* (C) Copyright IBM Corp. 2002                                              */
/*                                                                           */
/* This software is licensed under the Eclipse Public License (EPL) V1.0.    */
/*****************************************************************************/

package com.ibm.staf.service.stax.extension.samples.extdelay;

import javax.swing.*;
import javax.swing.event.*;
import com.ibm.staf.*;
import java.util.*;
import java.awt.*;
import java.lang.reflect.*;
import com.ibm.staf.service.stax.*;
    
public class ExtDelay implements STAXMonitorExtension
{
    STAFHandle fHandle;
    String fLocalMachine;
    String fStaxMachine;
    String fStaxServiceName;
    String fJobNumber;
    STAXMonitorFrame fMonitorFrame;
    String fTitle;
    HashMap fProgressBarMap;
    boolean fContinueElapsedTime = true;
    Hashtable fMonitorDelayStartTimes = new Hashtable();
    Hashtable fMonitorDelayTimeLabels = new Hashtable();
    MonitorElapsedTime fElapsedTime;
    
    private ImageIcon delayIcon;
    
    public JComponent init(STAXMonitorFrame monitorFrame, boolean newJob,
                           String staxMachineName, 
                           String staxServiceName, String jobNumber)
                           throws STAFException
    {
        fMonitorFrame = monitorFrame;
        fStaxMachine = staxMachineName;
        fStaxServiceName = staxServiceName;
        fJobNumber = jobNumber;

        fTitle = "Delay text";
        
        Class c = this.getClass();
        ClassLoader classLoader = c.getClassLoader();
        
        delayIcon = ((STAXMonitorExtensionClassLoader)classLoader).
            getImage("delay.gif");
        
        fProgressBarMap = new HashMap();
        
        fElapsedTime = new MonitorElapsedTime();
        fElapsedTime.start();
       
        return new JPanel();
    }        

    public String getNotificationEventTypes()
    {
        return "ext-delay";
    }
    
    public void term() {}
    
    public String getTitle() 
    { 
        return fTitle; 
    }
    
    public int getExtensionType()
    {
        return STAXMonitorFrame.EXTENSION_ACTIVE_JOB_ELEMENTS;
    }
    
    public JComponent getComponent()
    {
        return new JPanel();
    }
    
    public void handleEvent(Map map)
    {
        String status = (String)map.get("status");
        
        String block = (String)map.get("block");
        
        String id = (String)map.get("name");
        
        if (status.equals("start"))
        {
            String delay = (String)map.get("delay");

            Vector delayDataVector = new Vector();
                
            addRow(delayDataVector, "Delay Value", delay);
            
            JProgressBar progressBar = new JProgressBar();

            progressBar.setMaximum((new Integer(delay)).intValue());
            progressBar.setStringPainted(true);
            Dimension dim = progressBar.getPreferredSize();
            dim.height = 20;
            progressBar.setPreferredSize(dim);
            
            synchronized(fProgressBarMap)
            {
                fProgressBarMap.put(id, progressBar);
            }
            
            JLabel elapsedTimeLabel = new JLabel();
            elapsedTimeLabel.setFont(new Font("Dialog", Font.PLAIN, 12));
            
            JPanel extPanel = new JPanel();
            extPanel.setLayout(new BorderLayout());
            extPanel.setBackground(Color.white);
            extPanel.add(BorderLayout.CENTER, progressBar);
            extPanel.add(BorderLayout.EAST, elapsedTimeLabel);

            fMonitorFrame.addActiveJobElementsNode("delay", id, 
                block, id, delayIcon, extPanel, delayDataVector);
          
            synchronized(fMonitorDelayStartTimes)
            {
                fMonitorDelayStartTimes.put(id, Calendar.getInstance());
            }
                
            synchronized(fMonitorDelayTimeLabels)
            {
                fMonitorDelayTimeLabels.put(id, elapsedTimeLabel);
            }
        }
        else if (status.equals("stop"))
        {
            synchronized(fProgressBarMap)
            {
                fProgressBarMap.remove(id);
            }
            
            synchronized(fMonitorDelayStartTimes)
            {
                fMonitorDelayStartTimes.remove(id);
            }
            
            synchronized(fMonitorDelayTimeLabels)
            {
                fMonitorDelayTimeLabels.remove(id);
            }
                   
            fMonitorFrame.removeActiveJobElementsNode(id, block);
        }
        else if (status.equals("iterate"))
        {
            String delay = (String)map.get("delay");
            
            String currentIter = (String)map.get("currentiter");
            
            Integer delayInt = new Integer(delay);
            
            final Integer currentIterInt = new Integer(currentIter);
            
            float delayFloat = (float)(delayInt.intValue());
            float currentIterFloat = (float)(currentIterInt.intValue());
            
            int percent = (int)((currentIterFloat / delayFloat * 100));
            
            final JProgressBar progressBar = 
                (JProgressBar)fProgressBarMap.get(id);
            
            progressBar.setValue(currentIterInt.intValue());
            
            fMonitorFrame.setActiveJobElementsNodeText(id, id + 
                "  " + (new Integer(percent).toString()) + "% complete");
        }
    }

    public void addRow(Vector vector, String name, String value)
    {
        Vector newRow = new Vector(2);
        newRow.add(name);
        newRow.add(value);
        vector.add(newRow);
    }
    
    class MonitorElapsedTime extends Thread
    {
        public void run()
        {
            final int waitTime = fMonitorFrame.getElapsedTimeInterval();
            
            if (waitTime == 0)
                return;
            
            while (fContinueElapsedTime)
            {
                final Enumeration delayElapsedTimeKeys = 
                    fMonitorDelayStartTimes.keys();                
                    
                Runnable delayRunnable = new Runnable()
                {
                    public void run()
                    {
                        while (fContinueElapsedTime && 
                               delayElapsedTimeKeys.hasMoreElements())
                        {
                            String delayKey = 
                                (String)delayElapsedTimeKeys.nextElement();
                                
                            Calendar delayStarted = (Calendar)
                                fMonitorDelayStartTimes.get(delayKey);
                
                            synchronized(fMonitorDelayTimeLabels)
                            {
                                JLabel elapsedTimeLabel = (JLabel)
                                    fMonitorDelayTimeLabels.get(delayKey);
                            
                                elapsedTimeLabel.setText("  (" + STAXMonitorUtil.
                                    getElapsedTime(delayStarted) + ")");
                            }
                        }
                    }
                };
                    
                try
                {
                    SwingUtilities.invokeAndWait(delayRunnable);
                }
                catch (InterruptedException ex)
                {
                     ex.printStackTrace();
                }
                catch (InvocationTargetException ex)
                {
                     ex.printStackTrace();
                }
                
                try
                {                    
                    Thread.sleep(waitTime);
                }
                catch (InterruptedException ex)
                {
                }
            }
        }
    }
}

发现的确有个MonitorElapsedTime类。

文档上是ExtDelay$1.class,但生成的jar却是ExtDelay$MonitorElapsedTime$1.class。

这是个天坑,直接修改文件

这里要注意:要把这个文件下载下来,这里面有gif和mf,不用自己去操作了

然后打包放到他要求的目录,再进打包,然后浏览

然后打包放到他要求的目录,再进打包,然后浏览

如下图所示:

现在把文件直接拷贝到服务目录:

然后在这里随便选一个对stf.cfg进行修改:(这个文件是staxug.pdf,是从官方文档上下载的)

本人的配置如下:

随后启动:staf。发现没有java的异常输出。如下图所示:

更具这个(也是staxug.pdf里面的)

配置调用的xml文件,上面是文档上面的,下面是完整的写好的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">

<stax>
	<defaultcall function="main"/>

	<function name="main">
		<stafcmd name="'Delay'">
			<location>'local'</location>
			<service>'delay'</service>
			<request>'delay 5000'</request>
		</stafcmd>
	</function>
</stax>

接下来运行,运行截图如下:

延迟5s然后没了

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80267196