为什么这个演员不会返回正确的方法? (Ephesoft)

时间:2012-09-18 16:36:06

标签: java casting io document jdom

好的,所以我一直在看Ephesoft开发人员指南中的示例代码...

//import java.io.File;
//
//import javax.xml.transform.Result;
//import javax.xml.transform.Source;
//import javax.xml.transform.Transformer;
//import javax.xml.transform.TransformerConfigurationException;
//import javax.xml.transform.TransformerException;
//import javax.xml.transform.TransformerFactory;
//import javax.xml.transform.TransformerFactoryConfigurationError;
//import javax.xml.transform.dom.DOMSource;
//import javax.xml.transform.stream.StreamResult;
//
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//import org.w3c.dom.Node;
//import org.w3c.dom.NodeList;

import com.ephesoft.dcma.script.IScripts;
//--------------------------------------

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

//import com.ephesoft.dcma.script.IJDomScript;


/**
 * The <code>ScriptDocumentAssembler</code> class represents the script execute structure. Writer of scripts plug-in should implement this IScript
 * interface to execute it from the scripting plug-in. Via implementing this interface writer can change its java file at run time.
 * Before the actual call of the java Scripting plug-in will compile the java and run the new class file.
 * 
 * @author Ephesoft
 * @version 1.0
 */

public class ScriptDocumentAssembler 
{

    private static final String BATCH_LOCAL_PATH = "BatchLocalPath";

    private static final String BATCH_INSTANCE_ID = "BatchInstanceIdentifier";

    private static final String EXT_BATCH_XML_FILE = "_batch.xml";

    private static final String DOCUMENTS = "Documents";

    private static final String DOCUMENT = "Document";

    private static final String PAGES = "Pages";

    private static final String PAGE = "Page";

    private static String ZIP_FILE_EXT = ".zip";

    /**
     * The <code>execute</code> method will execute the script written by the writer at run time with new compilation of java file. It
     * will execute the java file dynamically after new compilation.
     * 
     * @param document {@link Document}
     */
    public void execute(Document document, String fieldName, String docIdentifier) {
        System.out.println("*************  Inside ScriptDocumentAssembler scripts.");
        System.out.println("*************  Start execution of the ScriptDocumentAssembler scripts.");
        System.out.println("Custom ScriptDocumentAssembler, removing Document seperator sheets...");
        removeFirstPageOfDoc(document);
        boolean isWrite = true;
        //boolean isWrite = false;
        // write the document object to the XML file.
        if (isWrite) {
            writeToXML(document);
            System.out.println("*************  Successfully write the xml file for the ScriptDocumentAssembler scripts.");
        } else {
            System.out.println("************** No changes performed by ScriptDocumentAssembler scripts.");
        }
        System.out.println("*************  End execution of the ScriptDocumentAssembler scripts.");
    }

    private void removeFirstPageOfDoc(Document documentFile) {
        Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);
        List<?> documentList = documentsList.getChildren(DOCUMENT);
        for (int documentIndex = 0; documentIndex < documentList.size(); documentIndex++) {
            Element document = (Element) documentList.get(documentIndex);
            System.out.println("Processing Document - " + document.getChildren("Identifier").get(0).getText());
            Element pages = (Element) document.getChildren(PAGES).get(0);
            List<?> pageList = pages.getChildren(PAGE);         
            Element page = (Element)pageList.get(0);            

            System.out.println(document.getChildren("Identifier").get(0).getText() + " Page Count = " + pageList.size());
            System.out.println("Removing page node " + page.getChildren("Identifier").get(0).getText() + " from " +
                    document.getChildren("Identifier").get(0).getText());
            pages.remove(page);             
            System.out.println(document.getChildren("Identifier").get(0).getText() + " Page Count = " + pageList.size());           
        }
    }

    private void writeToXML(Document document) {
        String batchLocalPath = null;
        List<?> batchLocalPathList = document.getRootElement().getChildren(BATCH_LOCAL_PATH);
        if (null != batchLocalPathList) {
            batchLocalPath = ((Element) batchLocalPathList.get(0)).getText();
        }
        if (null == batchLocalPath) {
                System.err.println("Unable to find the local folder path in batch xml file.");
            return;
        }
        String batchInstanceID = null;
        List<?> batchInstanceIDList = document.getRootElement().getChildren(BATCH_INSTANCE_ID);
        if (null != batchInstanceIDList) {
            batchInstanceID = ((Element) batchInstanceIDList.get(0)).getText();
        }
        if (null == batchInstanceID) {
            System.err.println("Unable to find the batch instance ID in batch xml file.");
            return;
        }
        String batchXMLPath = batchLocalPath.trim() + File.separator + batchInstanceID + File.separator + batchInstanceID
        + EXT_BATCH_XML_FILE;
        String batchXMLZipPath = batchXMLPath + ZIP_FILE_EXT;
        System.out.println("batchXMLZipPath************" + batchXMLZipPath);
        OutputStream outputStream = null;
        File zipFile = new File(batchXMLZipPath);
        FileWriter writer = null;
        XMLOutputter out = new XMLOutputter();
        try {
            if (zipFile.exists()) {
                System.out.println("Found the batch xml zip file.");
                outputStream = getOutputStreamFromZip(batchXMLPath, batchInstanceID + EXT_BATCH_XML_FILE);
                out.output(document, outputStream);
            } else {
                writer = new java.io.FileWriter(batchXMLPath);
                out.output(document, writer);
                writer.flush();
                writer.close();
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                }
            }
        }
    }

    public static OutputStream getOutputStreamFromZip(final String zipName, final String fileName) throws FileNotFoundException, IOException {
        ZipOutputStream stream = null;
        stream = new ZipOutputStream(new FileOutputStream(new File(zipName + ZIP_FILE_EXT)));
        ZipEntry zipEntry = new ZipEntry(fileName);
        stream.putNextEntry(zipEntry);
        return stream;
    }

}

注意我没有更改原始代码中的任何内容,但我将jdom和ephesoft jar添加到我的构建路径中。但是,在removeFirstPageOfDoc方法中,我仍然得到一堆与转换相关的错误。例如,行Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);应该允许documentFile访问Element的方法,对吧?但是,它似乎仍然只能访问类型文档的方法。我只是想知道这里可能出现的问题以及如何解决它?

1 个答案:

答案 0 :(得分:3)

  

例如,行Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);应该允许documentFile访问Element的方法,对吗?

不,因为投射的优先级低于点运算符。要将documentFile转换为Element类型,您可以写下:

Element documentsList = ((Element) documentFile).getChildren(DOCUMENTS).get(0);

围绕(Element) documentFile的括号。

已编辑添加 (包含以下评论中的信息)

然而,根据the Javadoc for org.jdom.Documentthat for org.jdom.Element,它们都是实际的类 - 两者都不是接口 - 并且它们都不是另一个的子类型。这意味着你实际上不能从一个投射到另一个。 (在Java中,强制转换不允许您将一种类型的实例转换为另一种类型;为了((Type) reference)能够工作,reference必须引用一个真正属于类型{的对象{1}}。由于对象永远不能是TypeElement的实例,因此编译器甚至不允许这种类型的转换。)

相反,编写此示例代码的人可能应该写下这个:

Document

使用Element documentsList = documentFile.getRootElement().getChildren(DOCUMENTS).get(0); 方法(返回文档的根元素)而不是强制转换为getRootElement()(这会试图说服编译器文件只是 一个元素)。