blob: ba41225e47a7cbd5bfc4e19d038e276a44c6e60b [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the 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));
}
}
}