diff options
Diffstat (limited to 'xmlsecurity/tools/uno/TestTool.java')
-rw-r--r-- | xmlsecurity/tools/uno/TestTool.java | 1392 |
1 files changed, 1392 insertions, 0 deletions
diff --git a/xmlsecurity/tools/uno/TestTool.java b/xmlsecurity/tools/uno/TestTool.java new file mode 100644 index 000000000000..6c87b34bbb43 --- /dev/null +++ b/xmlsecurity/tools/uno/TestTool.java @@ -0,0 +1,1392 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.xml.security.uno; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import java.io.File; +import java.io.IOException; +import java.io.FileOutputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.ByteArrayInputStream; +import java.io.UnsupportedEncodingException; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/* Basic GUI components */ +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.JFileChooser; +import javax.swing.ToolTipManager; +import javax.swing.JTable; +import javax.swing.JLabel; +import javax.swing.BorderFactory; + +/* GUI components for right-hand side */ +import javax.swing.JSplitPane; +import javax.swing.JOptionPane; +import javax.swing.JTabbedPane; + + +/* GUI support classes */ +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Container; +import java.awt.Toolkit; +import java.awt.event.WindowEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/* For creating borders */ +import javax.swing.border.EmptyBorder; +import javax.swing.border.BevelBorder; +import javax.swing.border.CompoundBorder; + +/* For creating a TreeModel */ +import javax.swing.tree.TreePath; +import java.util.Vector; + +/* UNO classes */ +import com.sun.star.uno.UnoRuntime; +import com.sun.star.bridge.XUnoUrlResolver; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.beans.XPropertySet; +import com.sun.star.uno.XComponentContext; +import com.sun.star.xml.sax.XDocumentHandler; + +import com.sun.star.xml.crypto.*; +import com.sun.star.xml.crypto.sax.*; + +public class TestTool extends JFrame implements ActionListener +{ + /* + * xml security framewrok component names + */ + public static String SIGNATURECREATOR_COMPONENT = "com.sun.star.xml.crypto.sax.SignatureCreator"; + public static String SIGNATUREVERIFIER_COMPONENT = "com.sun.star.xml.crypto.sax.SignatureVerifier"; + public static String ENCRYPTOR_COMPONENT = "com.sun.star.xml.crypto.sax.Encryptor"; + public static String DECRYPTOR_COMPONENT = "com.sun.star.xml.crypto.sax.Decryptor"; + public static String SAXEVENTKEEPER_COMPONENT = "com.sun.star.xml.crypto.sax.SAXEventKeeper"; + + /* + * Java-based component names + */ + public static String SEINITIALIZER_COMPONENT_JAVA = "com.sun.star.xml.security.bridge.jxsec.SEInitializer_JxsecImpl"; + public static String XMLSIGNATURE_COMPONENT_JAVA = "com.sun.star.xml.security.bridge.jxsec.XMLSignature_JxsecImpl"; + public static String XMLENCRYPTION_COMPONENT_JAVA = "com.sun.star.xml.security.bridge.jxsec.XMLEncryption_JxsecImpl"; + public static String XMLDOCUMENTWRAPPER_COMPONENT_JAVA = "com.sun.star.xml.security.bridge.jxsec.XMLDocumentWrapper_JxsecImpl"; + + /* + * C-based component names + */ + public static String SEINITIALIZER_COMPONENT_C = "com.sun.star.xml.crypto.SEInitializer"; + public static String XMLSIGNATURE_COMPONENT_C = "com.sun.star.xml.crypto.XMLSignature"; + public static String XMLENCRYPTION_COMPONENT_C = "com.sun.star.xml.crypto.XMLEncryption"; + public static String XMLDOCUMENTWRAPPER_COMPONENT_C = "com.sun.star.xml.wrapper.XMLDocumentWrapper"; + + /* url resolver name */ + public static String UNOURLRESOLVER = "com.sun.star.bridge.UnoUrlResolver"; + + /* + * connection URL + */ + private String m_unoURL = "uno:socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"; + + /* key file */ + private String m_javaTokenFile = null; + private String m_nssTokenPath = null; + + /* User Interfaces */ + private JButton m_goButton; + private JButton m_stepButton; + private JButton m_startButton; + private JButton m_openButton; + private JCheckBox m_isExportingButton; + private JCheckBox m_isJavaComponentButton; + private JButton m_saveButton; + private JButton m_batchButton; + private JTree m_leftTree; + private JTextArea m_leftTextArea; + private JTree m_middleTree; + private JTree m_rightTree; + private JTabbedPane m_leftTabPane; + private JTextArea m_bufferNodeTextArea; + private JLabel m_saxChainLabel; + private JTextField m_saxEventText; + private JTable m_unsolvedReferenceTable; + + /* + * whether a batch file is running, + * if so, no message box is popped up + */ + private boolean m_bIsBatchRunning = false; + + /* + * whether the UI needs to be updated. + * when user click the "go" button, the UI needs + * not to be updated step by step for performance + * reason + */ + private boolean m_bIsUIUpdateSuppressed = false; + + /* + * three DOM tree adapter + */ + private DomToTreeModelAdapter m_leftTreeModelAdapter; + private DomToTreeModelAdapter m_middleTreeModelAdapter; + private DomToTreeModelAdapter m_rightTreeModelAdapter; + + /* + * the current directory, which reserves the default + * location when user open/save a file. + */ + private File m_currentDirectory = null; + + /* + * the log file + */ + private FileOutputStream m_logFileOutputStream = null; + + /* + * the thread which is parsing the current XML + * file + */ + private ParsingThread m_parsingThread; + + /* + * whether is exporting or importing + */ + private boolean m_bIsExporting; + + /* + * whether java based component or c based component + * is used now + */ + private boolean m_bIsJavaBased; + + /* + * XML security component interface + */ + private XComponentContext m_xRemoteContext = null; + private XMultiComponentFactory m_xRemoteServiceManager = null; + private XXMLSecurityContext m_xXMLSecurityContext = null; + private XXMLSignature m_xXMLSignature = null; + private XXMLEncryption m_xXMLEncryption = null; + private XSEInitializer m_xSEInitializer = null; + + /* + * SAX event collector for the middle tree and the right tree + */ + private SAXEventCollector m_rightTreeEventCollector = null; + private SAXEventCollector m_middleTreeEventCollector = null; + + /* + * security framework controller + */ + private XMLSecurityFrameworkController m_xmlSecurityFrameworkController = null; + + /* org.w3c.dom.Document */ + private Document m_document; + + /* represents whether "Go" or "Step" */ + private boolean stepMode = true; + +/************************************************************************************** + * private methods + **************************************************************************************/ + + + /****************************************************************************** + * UI related methods + ******************************************************************************/ + + /* + * initalizes the UI. + */ + private void initUI() + { + m_leftTreeModelAdapter = new DomToTreeModelAdapter(m_document); + m_middleTreeModelAdapter = new DomToTreeModelAdapter(m_document); + m_rightTreeModelAdapter = new DomToTreeModelAdapter(m_document); + + m_parsingThread = null; + + m_leftTree.setModel(m_leftTreeModelAdapter); + m_middleTree.setModel(m_middleTreeModelAdapter); + m_rightTree.setModel(m_rightTreeModelAdapter); + } + + /* + * constructs the user interface. + */ + private Container buildUI(int width, int height) + { + JPanel mainPanel = new JPanel(); + + int frameHeight = height-40; + int leftWindowWidth = (width-40)/3; + int middleWindowWidth = leftWindowWidth; + int rightWindowWidth = leftWindowWidth; + int leftPaneWidth = leftWindowWidth+middleWindowWidth; + int frameWidth = leftPaneWidth + rightWindowWidth; + + /* Make a nice border */ + EmptyBorder emptyBorder = new EmptyBorder(5,5,5,5); + BevelBorder bevelBorder = new BevelBorder(BevelBorder.LOWERED); + CompoundBorder compoundBorder = new CompoundBorder(emptyBorder,bevelBorder); + mainPanel.setBorder(new CompoundBorder(compoundBorder,emptyBorder)); + + /* Set up the tree */ + m_leftTreeModelAdapter = new DomToTreeModelAdapter(m_document); + m_middleTreeModelAdapter = new DomToTreeModelAdapter(m_document); + m_rightTreeModelAdapter = new DomToTreeModelAdapter(m_document); + + m_leftTree = new JTree(m_leftTreeModelAdapter); + m_leftTextArea = new JTextArea(); + m_middleTree = new JTree(m_middleTreeModelAdapter); + m_rightTree = new JTree(m_rightTreeModelAdapter); + + ToolTipManager.sharedInstance().registerComponent(m_leftTree); + ToolTipManager.sharedInstance().registerComponent(m_middleTree); + ToolTipManager.sharedInstance().registerComponent(m_rightTree); + + /* Builds left tab pane */ + JScrollPane leftTreePane = new JScrollPane(m_leftTree); + JScrollPane leftTextPane = new JScrollPane(m_leftTextArea); + m_leftTabPane= new JTabbedPane(); + m_leftTabPane.add("Tree View",leftTreePane); + m_leftTabPane.add("Text View",leftTextPane); + + /* Builds middle tree pane */ + JScrollPane middleTreePane = new JScrollPane(m_middleTree); + + /* Builds right tree pane */ + JScrollPane rightTreePane = new JScrollPane(m_rightTree); + rightTreePane.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createTitledBorder("Result"), + BorderFactory.createEmptyBorder(8,8,8,8))); + + m_leftTabPane.setPreferredSize( + new Dimension( leftWindowWidth, frameHeight )); + middleTreePane.setPreferredSize( + new Dimension( middleWindowWidth, frameHeight )); + rightTreePane.setPreferredSize( + new Dimension( rightWindowWidth, frameHeight )); + + /* Builds the SAX event text box */ + m_saxEventText = new JTextField(); + + /* Builds the unsolved reference table */ + m_unsolvedReferenceTable = new JTable( + new UnsolvedReferenceTableModel(this)); + + /* Builds the BufferNode information text area */ + m_bufferNodeTextArea = new JTextArea(); + + /* Builds the SAX chain information label */ + m_saxChainLabel = new JLabel(); + + /* Builds the left pane */ + JPanel tabPaneWithSaxEventPane = new JPanel(); + tabPaneWithSaxEventPane.setLayout(new BorderLayout()); + tabPaneWithSaxEventPane.add("Center",m_leftTabPane); + tabPaneWithSaxEventPane.add("South",new JScrollPane(m_saxEventText)); + + JSplitPane leftPane = + new JSplitPane( JSplitPane.VERTICAL_SPLIT, + tabPaneWithSaxEventPane, + new JScrollPane(m_unsolvedReferenceTable)); + leftPane.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createTitledBorder("Original"), + BorderFactory.createEmptyBorder(8,8,8,8))); + + leftPane.setContinuousLayout( true ); + leftPane.setDividerLocation( frameHeight*2/3 ); + leftPane.setPreferredSize( + new Dimension( leftWindowWidth, frameHeight )); + + /* Builds the middle pane */ + JPanel bufferNodeWithSaxChainPane = new JPanel(); + bufferNodeWithSaxChainPane.setLayout(new BorderLayout()); + bufferNodeWithSaxChainPane.add("Center",m_bufferNodeTextArea); + bufferNodeWithSaxChainPane.add("South",new JScrollPane(m_saxChainLabel)); + + JSplitPane middlePane = + new JSplitPane( JSplitPane.VERTICAL_SPLIT, + middleTreePane, + new JScrollPane(bufferNodeWithSaxChainPane)); + + middlePane.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createTitledBorder("Insight SAXEventKeeper"), + BorderFactory.createEmptyBorder(8,8,8,8))); + + middlePane.setContinuousLayout( true ); + middlePane.setDividerLocation( frameHeight/2+5 ); + middlePane.setPreferredSize( + new Dimension( middleWindowWidth, frameHeight )); + + /* Builds the whole frame pane */ + JSplitPane leftWithMiddlePane = + new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, + leftPane, + middlePane ); + leftWithMiddlePane.setContinuousLayout( true ); + leftWithMiddlePane.setDividerLocation( leftWindowWidth ); + leftWithMiddlePane.setPreferredSize( + new Dimension( leftPaneWidth + 10, frameHeight+10 )); + + JSplitPane framePane = + new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, + leftWithMiddlePane, + rightTreePane ); + + + framePane.setContinuousLayout( true ); + framePane.setDividerLocation(leftPaneWidth+10 ); + framePane.setPreferredSize( + new Dimension( frameWidth + 20, frameHeight+10 )); + + /* Adds all GUI components to the main panel */ + mainPanel.setLayout(new BorderLayout()); + mainPanel.add("Center", framePane ); + + m_openButton = new JButton("Open..."); + m_openButton.addActionListener(this); + + m_goButton = new JButton("Go!"); + m_goButton.addActionListener(this); + + m_stepButton = new JButton("Step"); + m_stepButton.addActionListener(this); + + m_startButton = new JButton("Start"); + m_startButton.addActionListener(this); + m_startButton.setEnabled(false); + + m_isExportingButton = new JCheckBox("export, not import", true); + m_isJavaComponentButton = new JCheckBox("use java component", false); + + m_saveButton = new JButton("Save..."); + m_saveButton.addActionListener(this); + + m_batchButton = new JButton("Batch..."); + m_batchButton.addActionListener(this); + + JPanel buttonPanel = new JPanel(); + buttonPanel.add(m_batchButton); + buttonPanel.add(m_openButton); + buttonPanel.add(m_startButton); + buttonPanel.add(m_goButton); + buttonPanel.add(m_stepButton); + buttonPanel.add(m_isExportingButton); + buttonPanel.add(m_isJavaComponentButton); + buttonPanel.add(m_saveButton); + + mainPanel.add("South", buttonPanel); + + enableGoButton(false); + + return mainPanel; + } + + /* + * enables/disables the Go(and Step) button. + */ + private void enableGoButton(boolean enabled) + { + m_goButton.setEnabled(enabled); + m_stepButton.setEnabled(enabled); + } + + /* + * updates the unsolved reference information. + */ + private void updatesUnsolvedReferencesInformation() + { + m_unsolvedReferenceTable.setModel(new UnsolvedReferenceTableModel(this)); + } + + /* + * adjusts the view of the tree in order to make the + * particular Node into the focus tree leaf. + */ + private void updatesTree(Node node, JTree tree) + { + int i=0; + int currentLine = 0; + + while (i<tree.getRowCount()) + { + TreePath treePath = tree.getPathForRow(i); + tree.expandPath(treePath); + + AdapterNode adapterNode = (AdapterNode)treePath.getLastPathComponent(); + + if (node == adapterNode.getNode()) + { + tree.addSelectionPath(treePath); + currentLine = i; + } + + ++i; + } + + tree.setCellRenderer(new XMLTreeCellRanderer(node)); + tree.scrollRowToVisible(currentLine); + } + + /****************************************************************************** + * action listener related methods. + ******************************************************************************/ + + /* + * reads in a document, either the document is a file or + * is a text paragraph. + */ + private void openDocument() + { + if (m_leftTabPane.getSelectedIndex() == 0) + { + File f = openFile(); + if (f != null) + { + parseFile(f); + } + } + else + { + String text = m_leftTextArea.getText(); + + try + { + parseStream(new ByteArrayInputStream(text.getBytes("UTF-8"))); + } + catch(UnsupportedEncodingException e) + { + e.printStackTrace(); + } + + m_leftTabPane.setSelectedIndex(0); + } + } + + /* + * save the result tree to a file. + */ + private void saveResult() + { + saveFile(); + } + + /* + * selects a batch file to excute. + */ + private void openBatch() + { + File f = openFile(); + if (f != null) + { + runBatch(f); + } + } + + /* + * makes the current operation to an end. + */ + private void endMission() + { + enableGoButton(false); + m_parsingThread = null; + + if (m_xmlSecurityFrameworkController != null) + { + m_xmlSecurityFrameworkController.endMission(); + } + + updatesUIs(); + + m_xmlSecurityFrameworkController = null; + freeComponents(); + + System.gc(); + } + + + /****************************************************************************** + * UNO component related methods + ******************************************************************************/ + + /* + * connects the SO server. + */ + private void connectSO(String unoUrlString) + { + if (unoUrlString != null) + { + m_unoURL = new String(unoUrlString); + } + + try + { + m_xRemoteServiceManager = getRemoteServiceManager(m_unoURL); + } + catch(Exception e) + { + e.printStackTrace(); + } + } + + /* + * creates UNO components. + */ + private boolean createComponents() + { + try + { + String SEInitializer_comp; + String XMLSignature_comp; + String XMLEncryption_comp; + String tokenPath; + + if (m_bIsJavaBased) + { + SEInitializer_comp = SEINITIALIZER_COMPONENT_JAVA; + XMLSignature_comp = XMLSIGNATURE_COMPONENT_JAVA; + XMLEncryption_comp = XMLENCRYPTION_COMPONENT_JAVA; + tokenPath = m_javaTokenFile; + } + else + { + SEInitializer_comp = SEINITIALIZER_COMPONENT_C; + XMLSignature_comp = XMLSIGNATURE_COMPONENT_C; + XMLEncryption_comp = XMLENCRYPTION_COMPONENT_C; + tokenPath = m_nssTokenPath; + } + + Object seInitializerObj = m_xRemoteServiceManager.createInstanceWithContext( + SEInitializer_comp, m_xRemoteContext); + + if (seInitializerObj == null) + { + freeComponents(); + return false; + } + + m_xSEInitializer = (XSEInitializer)UnoRuntime.queryInterface( + XSEInitializer.class, seInitializerObj); + + m_xXMLSecurityContext = m_xSEInitializer.createSecurityContext(tokenPath); + + Object xmlSignatureObj = m_xRemoteServiceManager.createInstanceWithContext( + XMLSignature_comp, m_xRemoteContext); + + if (xmlSignatureObj == null) + { + freeComponents(); + return false; + } + + m_xXMLSignature = (XXMLSignature)UnoRuntime.queryInterface( + XXMLSignature.class, xmlSignatureObj); + + Object xmlEncryptionObj = m_xRemoteServiceManager.createInstanceWithContext( + XMLEncryption_comp, m_xRemoteContext); + + if (xmlEncryptionObj == null) + { + freeComponents(); + return false; + } + + m_xXMLEncryption = (XXMLEncryption)UnoRuntime.queryInterface( + XXMLEncryption.class, xmlEncryptionObj); + + return true; + } + catch(Exception e) + { + freeComponents(); + e.printStackTrace(); + return false; + } + } + + /* + * frees UNO components. + */ + private void freeComponents() + { + try + { + if (m_xXMLSecurityContext != null) + { + m_xSEInitializer.freeSecurityContext(m_xXMLSecurityContext); + m_xXMLSecurityContext = null; + } + + m_xXMLSignature = null; + m_xXMLEncryption = null; + m_xSEInitializer = null; + } + catch(Exception e) + { + e.printStackTrace(); + } + } + + /* + * getRemoteServiceManager + */ + private XMultiComponentFactory getRemoteServiceManager(String unoUrl) throws java.lang.Exception + { + if (m_xRemoteContext == null) + { + /* + * First step: create local component context, get local servicemanager and + * ask it to create a UnoUrlResolver object with an XUnoUrlResolver interface + */ + XComponentContext xLocalContext = + com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null); + XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager(); + Object urlResolver = xLocalServiceManager.createInstanceWithContext( + UNOURLRESOLVER, xLocalContext ); + /* + * query XUnoUrlResolver interface from urlResolver object + */ + XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface( + XUnoUrlResolver.class, urlResolver ); + + /* + * Second step: use xUrlResolver interface to import the remote StarOffice.ServiceManager, + * retrieve its property DefaultContext and get the remote servicemanager + */ + Object initialObject = xUnoUrlResolver.resolve( unoUrl ); + XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface( + XPropertySet.class, initialObject); + Object context = xPropertySet.getPropertyValue("DefaultContext"); + m_xRemoteContext = (XComponentContext)UnoRuntime.queryInterface( + XComponentContext.class, context); + } + return m_xRemoteContext.getServiceManager(); + } + + + /****************************************************************************** + * XML related methods + ******************************************************************************/ + + /* + * removes all empty text node inside the particular element + */ + private void removeEmptyText(Node node) + { + int type = node.getNodeType(); + NodeList children; + int i; + + switch (type) + { + case Node.DOCUMENT_NODE: + case Node.ELEMENT_NODE: + Node child = node.getFirstChild(); + while (child!= null) + { + Node nextSibling = child.getNextSibling(); + int childType = child.getNodeType(); + + if (childType==Node.TEXT_NODE) + { + String message = child.getNodeValue().trim(); + if (message == null || message.length()<=0) + { + node.removeChild(child); + } + } + else if (childType == Node.ELEMENT_NODE) + { + removeEmptyText(child); + } + + child = nextSibling; + } + break; + } + } + + /* + * reads a stream, and parses it into the original tree. + */ + private void parseStream(InputStream is) + { + try + { + DocumentBuilderFactory factory = + DocumentBuilderFactory.newInstance(); + m_document = null; + m_startButton.setEnabled(false); + initUI(); + + /* factory.setValidating(true); */ + /* factory.setNamespaceAware(true); */ + + try + { + DocumentBuilder builder = factory.newDocumentBuilder(); + m_document = builder.parse(is); + m_startButton.setEnabled(true); + initUI(); + } + catch (ParserConfigurationException pce) + { + pce.printStackTrace(); + } + catch (IOException ioe) + { + ioe.printStackTrace(); + } + } + catch(Exception exce) + { + System.out.println("input stream Exception"); + } + } + + + /****************************************************************************** + * file operation related methods + ******************************************************************************/ + + /* + * opens a file, and parses it into the original tree. + */ + private void parseFile(File name) + { + try + { + FileInputStream fis = new FileInputStream(name); + parseStream(fis); + fis.close(); + } + catch(Exception exce) + { + System.out.println("open file Exception"); + } + } + + + /* + * selects a file to open + */ + private File openFile() + { + File rc = null; + + JFileChooser fileChooser= new JFileChooser(); + + fileChooser.setDialogTitle("Select File To Open"); + fileChooser.setDialogType(JFileChooser.OPEN_DIALOG); + + fileChooser.setApproveButtonText("Ok"); + + if (m_currentDirectory == null) + { + fileChooser.rescanCurrentDirectory(); + } + else + { + fileChooser.setCurrentDirectory(m_currentDirectory); + } + + fileChooser.setFileFilter(new XMLFileFilter()); + + int result = fileChooser.showDialog(this,null); + if (result==fileChooser.APPROVE_OPTION) + { + m_currentDirectory = fileChooser.getCurrentDirectory(); + rc = fileChooser.getSelectedFile(); + } + + return rc; + } + + private void saveFile() + { + JFileChooser fileChooser= new JFileChooser(); + + fileChooser.setDialogTitle("Select File To Save"); + fileChooser.setDialogType(JFileChooser.SAVE_DIALOG); + + fileChooser.setApproveButtonText("Ok"); + + if (m_currentDirectory == null) + { + fileChooser.rescanCurrentDirectory(); + } + else + { + fileChooser.setCurrentDirectory(m_currentDirectory); + } + + fileChooser.setFileFilter(new XMLFileFilter()); + + int result = fileChooser.showDialog(this,null); + if (result==fileChooser.APPROVE_OPTION) + { + try + { + m_currentDirectory = fileChooser.getCurrentDirectory(); + saveFile(fileChooser.getSelectedFile()); + } + catch(Exception exce) + { + System.out.println("save file Exception"); + exce.printStackTrace(); + } + } + } + + /* + * excutes a batch file. + */ + private void runBatch(File f) + { + FileInputStream fis = null; + + try + { + fis = new FileInputStream(f); + StringBuffer commandBuffer = new StringBuffer(); + + m_logFileOutputStream = new FileOutputStream("TestTool-log.txt"); + m_bIsBatchRunning = true; + int ch = 0; + + while (ch != -1) + { + ch = fis.read(); + + if (ch != 0x0a && ch != -1) + { + if (ch != 0x0d) + { + commandBuffer.append((char)ch); + } + } + else + { + String command = new String(commandBuffer); + if (command.startsWith("Open ")) + { + m_logFileOutputStream.write(("start \""+command+"\" ...\n").getBytes()); + String fileName = command.substring(5); + parseFile(new File(fileName)); + m_logFileOutputStream.write("command end \n\n".getBytes()); + } + else if (command.startsWith("Use Java Component")) + { + m_logFileOutputStream.write(("start \""+command+"\" ...\n").getBytes()); + m_isJavaComponentButton.setSelected(true); + m_logFileOutputStream.write("command end \n\n".getBytes()); + } + else if (command.startsWith("Use C++ Component")) + { + m_logFileOutputStream.write(("start \""+command+"\" ...\n").getBytes()); + m_isJavaComponentButton.setSelected(false); + m_logFileOutputStream.write("command end \n\n".getBytes()); + } + else if (command.startsWith("Go ")) + { + m_logFileOutputStream.write(("start \""+command+"\" ...\n").getBytes()); + String opera = command.substring(3); + if (opera.equals("Sign") || opera.equals("Encrypt")) + { + m_isExportingButton.setSelected(true); + } + else + { + m_isExportingButton.setSelected(false); + } + + startsUp(); + if (m_parsingThread != null) + { + m_bIsUIUpdateSuppressed = true; + try{ + while (m_parsingThread.nextStep()); + endMission(); + } + catch(Exception e) + { + System.out.println("exception happen during batch:"+e); + e.printStackTrace(); + } + + m_bIsUIUpdateSuppressed = false; + updatesUIs(); + } + m_logFileOutputStream.write("command end \n\n".getBytes()); + } + else if (command.startsWith("Save ")) + { + m_logFileOutputStream.write(("start \""+command+"\" ...\n").getBytes()); + String fileName = command.substring(5); + saveFile(new File(fileName)); + m_logFileOutputStream.write("command end \n\n".getBytes()); + } + + commandBuffer = new StringBuffer(); + } + } + + m_bIsBatchRunning = false; + m_logFileOutputStream.close(); + m_logFileOutputStream = null; + + fis.close(); + fis = null; + } + catch(java.io.IOException e) + { + e.printStackTrace(); + } + } + + /* + * save the current result tree to a particular file. + */ + private void saveFile(File f) + { + try{ + FileOutputStream fos = new FileOutputStream(f); + SAXEventPrinter.display((Document)m_rightTreeEventCollector.getDocument(), + 0,fos,false); + fos.close(); + }catch(Exception e) + { + e.printStackTrace(); + } + } + + /****************************************************************************** + * others + ******************************************************************************/ + + /* + * starts up the operation. + */ + private void startsUp() + { + if (m_parsingThread != null) + { + m_parsingThread = null; + } + + m_bIsExporting = m_isExportingButton.isSelected(); + m_bIsJavaBased = m_isJavaComponentButton.isSelected(); + + if (createComponents()) + { + m_rightTreeEventCollector = new SAXEventCollector(this); + + m_parsingThread = new ParsingThread( + m_document, + null, + this); + + m_xmlSecurityFrameworkController = + new XMLSecurityFrameworkController( + this, + m_bIsExporting, + m_bIsJavaBased, + m_rightTreeEventCollector, + m_parsingThread, + m_xXMLSecurityContext, + m_xXMLSignature, + m_xXMLEncryption, + m_xRemoteServiceManager, + m_xRemoteContext); + + enableGoButton(true); + } + else + { + showMessage("Error in creating XML Security Components!"); + } + } + +/************************************************************************************** + * protected methods + **************************************************************************************/ + + /****************************************************************************** + * UI related methods + ******************************************************************************/ + + /* + * updates the sax chain information. + */ + protected void updatesSAXChainInformation(String chainStr) + { + m_saxChainLabel.setText(chainStr); + } + + /* + * update the current SAX event information. + */ + protected void updatesCurrentSAXEventInformation(String event) + { + m_saxEventText.setText(event); + } + + /* + * updates all information in the UI. + */ + protected void updatesUIs() + { + if (!m_bIsUIUpdateSuppressed) + { + m_leftTree.clearSelection(); + updatesTree(null, m_leftTree); + + if (m_xmlSecurityFrameworkController != null) + { + String bufferNodeTreeText = m_xmlSecurityFrameworkController.getBufferNodeTreeInformation(); + if (bufferNodeTreeText == null) + { + m_middleTree.setVisible(false); + m_bufferNodeTextArea.setText("No XML Security Related"); + } + else + { + m_middleTreeEventCollector = new SAXEventCollector(null); + m_xmlSecurityFrameworkController.getDocument(m_middleTreeEventCollector); + + m_middleTreeModelAdapter = new DomToTreeModelAdapter(m_middleTreeEventCollector.getDocument()); + m_middleTree.setModel(m_middleTreeModelAdapter); + updatesTree(null, m_middleTree); + m_middleTree.setVisible(true); + m_bufferNodeTextArea.setText(bufferNodeTreeText); + } + } + else + { + m_middleTree.setVisible(false); + m_bufferNodeTextArea.setText("No XMLImporter/XMLExporter"); + } + + if (m_rightTreeEventCollector != null) + { + m_rightTreeModelAdapter = new DomToTreeModelAdapter((Document)m_rightTreeEventCollector.getDocument()); + m_rightTree.setModel(m_rightTreeModelAdapter); + updatesTree((Node)m_rightTreeEventCollector.getCurrentElement(), m_rightTree); + } + + updatesUnsolvedReferencesInformation(); + } + } + + /* + * shows a message. + */ + protected void showMessage(String msg) + { + if (m_bIsBatchRunning) + { + try + { + if (!msg.startsWith("Message from : SAXEventKeeper")) + { + byte [] b = msg.getBytes(); + m_logFileOutputStream.write(" ".getBytes()); + + for (int i=0; i<b.length; ++i) + { + m_logFileOutputStream.write(b[i]); + if (b[i] == '\n') + { + m_logFileOutputStream.write(" ".getBytes()); + } + } + m_logFileOutputStream.write("\n ==============================\n".getBytes()); + } + } + catch(IOException e) + { + e.printStackTrace(); + } + } + else + { + if (stepMode) + { + JOptionPane optionPane = new JOptionPane(); + optionPane.showMessageDialog(this, msg, "TestTool Notification", JOptionPane.INFORMATION_MESSAGE); + } + else + { + Object[] options = { "OK", "Go back to step mode" }; + if (1 == JOptionPane.showOptionDialog(this, msg, "TestTool Notification", + JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, + null, options, options[0])) + { + stepMode = true; + } + } + } + } + + + /****************************************************************************** + * information retrieving + ******************************************************************************/ + + /* + * gets all unsolved reference ids. + * a reference id is the value of the id attribute of an + * referenced element. + */ + protected Vector getUnsolvedReferenceIds() + { + Vector rc; + + if (m_xmlSecurityFrameworkController == null) + { + rc = new Vector(); + } + else + { + rc = ((XMLSecurityFrameworkController)m_xmlSecurityFrameworkController). + getUnsolvedReferenceIds(); + } + + return rc; + } + + /* + * gets all unsolved reference keeper ids. + * a reference keeper id is the id which the SAXEventKeeper uses + * to identify the corresponding BufferNode. + */ + protected Vector getUnsolvedReferenceKeeperIds() + { + Vector rc; + + if (m_xmlSecurityFrameworkController == null) + { + rc = new Vector(); + } + else + { + rc = ((XMLSecurityFrameworkController)m_xmlSecurityFrameworkController). + getUnsolvedReferenceKeeperIds(); + } + + return rc; + } + + /* + * gets all unsolved references' remaining numbers. + * a remaining number is that how many claims have not been found for + * a unsolved reference. + */ + protected Vector getUnsolvedReferenceRefNum() + { + Vector rc; + + if (m_xmlSecurityFrameworkController == null) + { + rc = new Vector(); + } + else + { + rc = ((XMLSecurityFrameworkController)m_xmlSecurityFrameworkController). + getUnsolvedReferenceRefNum(); + } + + return rc; + } + + +/************************************************************************************** + * public methods + **************************************************************************************/ + + /****************************************************************************** + * action listener related methods. + ******************************************************************************/ + + /* + * action listening method. + */ + public void actionPerformed(ActionEvent e) + { + if (e.getSource().equals(m_startButton)) + { + endMission(); + startsUp(); + } + if (e.getSource().equals(m_goButton)) + { + if (m_parsingThread != null) + { + stepMode = false; + boolean notOver; + while ( notOver = m_parsingThread.nextStep()) + { + if (stepMode) break; + } + + if (!notOver) endMission(); + } + } + if (e.getSource().equals(m_stepButton)) + { + if (m_parsingThread != null) + { + if (!m_parsingThread.nextStep()) + { + endMission(); + } + } + } + if (e.getSource().equals(m_openButton)) + { + openDocument(); + } + if (e.getSource().equals(m_saveButton)) + { + saveResult(); + } + if (e.getSource().equals(m_batchButton)) + { + openBatch(); + } + } + + /* + * void-consturctor method + */ + public TestTool() + { + getRootPane().putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE); + + try + { + m_currentDirectory = new File(System.getProperty("user.dir")); + } + catch(Exception e) + { + System.out.println("getProperty error :"+e); + } + } + + /* + * consturctor method with a specific connection URL + */ + public TestTool(String connecturl) + { + this(); + m_unoURL = new String(connecturl); + } + + public static void main(String argv[]) + { + Dimension screenSize = + Toolkit.getDefaultToolkit().getScreenSize(); + + TestTool tt; + + if (argv.length < 1) + { + System.out.println("Usage: java TestTool [javaTokenFile] [nssTokenPath] [xml file]?"); + return; + } + + boolean hasFile = false; + boolean hasBatch = false; + String fileName = null; + + if (argv.length >= 3) + { + if (argv[2].startsWith("-b")) + { + fileName = argv[2].substring(2); + hasBatch = true; + } + else + { + fileName = argv[2]; + hasFile = true; + } + } + + tt = new TestTool(); + tt.m_javaTokenFile = new String(argv[0]); + tt.m_nssTokenPath = new String(argv[1]); + tt.connectSO(null); + + /* Set up a GUI framework */ + JFrame myFrame = new JFrame("XML Security Components Tester"); + myFrame.addWindowListener( + new WindowAdapter() { + public void windowClosing(WindowEvent e) {System.exit(0);} + } + ); + + myFrame.setContentPane(tt.buildUI(screenSize.width, screenSize.height)); + myFrame.pack(); + int w = screenSize.width-30; + int h = screenSize.height-30; + myFrame.setLocation(screenSize.width/2 - w/2, + screenSize.height/2 - h/2); + myFrame.setSize(w, h); + myFrame.setVisible(true); + + if (hasFile) + { + tt.parseFile(new File(fileName)); + } + else if (hasBatch) + { + tt.runBatch(new File(fileName)); + } + } +} + |