package ir.ac.iust.nlp.dependencyparser.converter; import ir.ac.iust.nlp.dependencyparser.BasePanel; import ir.ac.iust.nlp.dependencyparser.enumeration.Format; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.JComboBox; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.io.FileUtils; /** * * @author Mojtaba Khallash */ public class ConverterPanel extends BasePanel { Format sourceFormat = Format.CONLL; Format targetFormat = Format.CONLL; public ConverterPanel(String dir) { super(dir); initComponents(); setCurrentDirectory(dir); mappingVisibility(false); setDrop(); } private void setDrop() { txtInputFile.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { sourceFormat = getFormat(getExtension(txtInputFile.getText()), cboInputType); } @Override public void removeUpdate(DocumentEvent e) {} @Override public void changedUpdate(DocumentEvent e) {} }); initDrop(txtInputFile, false); initDrop(txtOutputPath, true); initDrop(txtMappingFile, false); } private void setCurrentDirectory(String dir) { txtInputFile.setText(dir + File.separator + "Treebank" + File.separator + "converter" + File.separator + "train.mst"); sourceFormat = getFormat(getExtension(txtInputFile.getText()), cboInputType); txtOutputPath.setText(dir + File.separator + "Output" + File.separator + "converter" + File.separator); txtMappingFile.setText(dir + File.separator + "Treebank" + File.separator + "converter" + File.separator + "mapfiles" + File.separator + "talbanken" + File.separator + "malt2malt.xml"); } @Override public void threadFinished() { btnStartConvert.setEnabled(true); // Input file File inputFrom = new File(txtInputFile.getText()).getAbsoluteFile(); String input = inputFrom.getName(); File inputTo = new File(workingDir + input); if (!inputFrom.equals(inputTo)) { inputTo.delete(); } if (txtMappingFile.isVisible()) { // Mapping file File MappingFrom = new File(txtMappingFile.getText()).getAbsoluteFile(); String mapping = MappingFrom.getName(); File MappingTo = new File(workingDir + mapping); if (!MappingFrom.equals(MappingTo)) { MappingTo.delete(); } // Output file String output = txtOutputPath.getText() + "output." + getExtension(targetFormat); File outputFrom = new File(output).getAbsoluteFile(); output = outputFrom.getName(); File outputTo = new File(workingDir + output); if (!outputFrom.equals(outputTo)) { try { FileUtils.copyFile(outputTo, outputFrom); } catch(Exception e){} outputTo.delete(); } } } @Override public boolean canSave() { return true; } @Override public void save() { } @Override public void saveAs() { save(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jLabel2 = new javax.swing.JLabel(); jPanel8 = new javax.swing.JPanel(); pnlParameter = new javax.swing.JPanel(); lblInputFile = new javax.swing.JLabel(); txtInputFile = new javax.swing.JTextField(); btnBrowseInputFile = new javax.swing.JButton(); lblOutputPath = new javax.swing.JLabel(); txtOutputPath = new javax.swing.JTextField(); btnBrowseOutputPath = new javax.swing.JButton(); lblInputType = new javax.swing.JLabel(); cboInputType = new javax.swing.JComboBox(); lblOutputType = new javax.swing.JLabel(); cboOutputType = new javax.swing.JComboBox(); btnStartConvert = new javax.swing.JButton(); pnlMapping = new javax.swing.JPanel(); btnBrowseMappingFile = new javax.swing.JButton(); lblMappingFile = new javax.swing.JLabel(); txtMappingFile = new javax.swing.JTextField(); tabDependencyInfo = new javax.swing.JTabbedPane(); pnlLog = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); txtLog = new javax.swing.JTextArea(); jLabel2.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N jLabel2.setText("Type Converter"); jPanel8.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jPanel8.setPreferredSize(new java.awt.Dimension(380, 2)); javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8); jPanel8.setLayout(jPanel8Layout); jPanel8Layout.setHorizontalGroup( jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 0, Short.MAX_VALUE) ); jPanel8Layout.setVerticalGroup( jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 0, Short.MAX_VALUE) ); pnlParameter.setBorder(javax.swing.BorderFactory.createTitledBorder("Parameter")); lblInputFile.setText("Input File:"); txtInputFile.setEditable(false); btnBrowseInputFile.setText("..."); btnBrowseInputFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnBrowseInputFile_Click(evt); } }); lblOutputPath.setText("Output Path:"); txtOutputPath.setEditable(false); btnBrowseOutputPath.setText("..."); btnBrowseOutputPath.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnBrowseOutputPath_Click(evt); } }); lblInputType.setText("Type:"); cboInputType.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "CoNLL", "Malt-XML", "Malt-TAB", "MST", "Clear", "Tiger" })); cboInputType.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { cboInputType_itemStateChanged(evt); } }); lblOutputType.setText("Type:"); cboOutputType.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "CoNLL", "Malt-XML", "Malt-TAB", "MST", "Clear", "Tiger" })); cboOutputType.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { cboOutputType_itemStateChanged(evt); } }); btnStartConvert.setText("Convert"); btnStartConvert.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnStartConvertActionPerformed(evt); } }); btnBrowseMappingFile.setText("..."); btnBrowseMappingFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnBrowseMappingFile_Click(evt); } }); lblMappingFile.setText("Mapping File:"); txtMappingFile.setEditable(false); javax.swing.GroupLayout pnlMappingLayout = new javax.swing.GroupLayout(pnlMapping); pnlMapping.setLayout(pnlMappingLayout); pnlMappingLayout.setHorizontalGroup( pnlMappingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlMappingLayout.createSequentialGroup() .addComponent(lblMappingFile) .addGap(10, 10, 10) .addComponent(txtMappingFile) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnBrowseMappingFile, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)) ); pnlMappingLayout.setVerticalGroup( pnlMappingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlMappingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblMappingFile) .addComponent(txtMappingFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnBrowseMappingFile)) ); javax.swing.GroupLayout pnlParameterLayout = new javax.swing.GroupLayout(pnlParameter); pnlParameter.setLayout(pnlParameterLayout); pnlParameterLayout.setHorizontalGroup( pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlParameterLayout.createSequentialGroup() .addContainerGap() .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlParameterLayout.createSequentialGroup() .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblOutputPath) .addComponent(lblInputFile)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(txtInputFile) .addComponent(txtOutputPath)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlParameterLayout.createSequentialGroup() .addComponent(btnBrowseOutputPath, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(lblOutputType)) .addGroup(pnlParameterLayout.createSequentialGroup() .addComponent(btnBrowseInputFile, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(lblInputType))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(cboInputType, 0, 74, Short.MAX_VALUE) .addComponent(cboOutputType, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(pnlParameterLayout.createSequentialGroup() .addComponent(pnlMapping, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(42, 42, 42) .addComponent(btnStartConvert, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); pnlParameterLayout.setVerticalGroup( pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlParameterLayout.createSequentialGroup() .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblInputType) .addComponent(cboInputType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnBrowseInputFile)) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblInputFile) .addComponent(txtInputFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblOutputType) .addComponent(cboOutputType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblOutputPath) .addComponent(txtOutputPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnBrowseOutputPath))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(pnlParameterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(btnStartConvert, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(pnlMapping, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(34, 34, 34)) ); txtLog.setColumns(20); txtLog.setRows(5); jScrollPane1.setViewportView(txtLog); javax.swing.GroupLayout pnlLogLayout = new javax.swing.GroupLayout(pnlLog); pnlLog.setLayout(pnlLogLayout); pnlLogLayout.setHorizontalGroup( pnlLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 534, Short.MAX_VALUE) ); pnlLogLayout.setVerticalGroup( pnlLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE) ); tabDependencyInfo.addTab("Log", pnlLog); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(tabDependencyInfo) .addComponent(jPanel8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 539, Short.MAX_VALUE) .addComponent(pnlParameter, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel2) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(pnlParameter, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tabDependencyInfo) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private String getExtension(String fileName) { String extension = ""; int i = fileName.lastIndexOf('.'); if (i > 0) { extension = fileName.substring(i+1); } return extension; } private void btnBrowseInputFile_Click(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBrowseInputFile_Click txtInputFile.setText(showFileDialog(txtInputFile.getText(), false)); }//GEN-LAST:event_btnBrowseInputFile_Click private void btnBrowseOutputPath_Click(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBrowseOutputPath_Click txtOutputPath.setText(showFileDialog(txtOutputPath.getText(), true)); }//GEN-LAST:event_btnBrowseOutputPath_Click private void btnStartConvertActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStartConvertActionPerformed btnStartConvert.setEnabled(false); txtLog.setText(""); try { PrintStream out = new PrintStream(new OutputStream() { private StringBuffer buffer = new StringBuffer(); @Override public void write(int b) throws IOException { this.buffer.append((char) b); txtLog.setText(buffer.toString()); txtLog.setCaretPosition(txtLog.getDocument().getLength() - 1); } }); // Input file File inputFrom = new File(txtInputFile.getText()).getAbsoluteFile(); String input = inputFrom.getName(); File inputTo = new File(workingDir + input); if (!inputFrom.equals(inputTo)) { FileUtils.copyFile(inputFrom, inputTo); input = inputTo.getName(); } // Output file String output = txtOutputPath.getText() + "output." + getExtension(targetFormat); File file = new File(output); if (file.exists()) { file.delete(); } if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } String mapping = null; if (txtMappingFile.isVisible()) { // Mapping file File MappingFrom = new File(txtMappingFile.getText()).getAbsoluteFile(); mapping = MappingFrom.getName(); File MappingTo = new File(workingDir + mapping); if (!MappingFrom.equals(MappingTo)) { FileUtils.copyFile(MappingFrom, MappingTo); mapping = MappingTo.getName(); } // Output file File outputTo = new File(workingDir + "output." + getExtension(targetFormat)); output = outputTo.getName(); } // Run in a new thread Runnable job = new RunnableConverter(this, out, input, sourceFormat, output, targetFormat, mapping); ExecutorService threadPool = Executors.newFixedThreadPool(1); threadPool.execute(job); threadPool.shutdown(); } catch (Exception ex) { threadFinished(); } }//GEN-LAST:event_btnStartConvertActionPerformed private void cboInputType_itemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboInputType_itemStateChanged sourceFormat = getFormat(cboInputType.getSelectedItem().toString(), null); if (sourceFormat == Format.CONLL || sourceFormat == Format.Clear || sourceFormat == Format.MST) { mappingVisibility(false); } else { mappingVisibility(true); } }//GEN-LAST:event_cboInputType_itemStateChanged private void cboOutputType_itemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboOutputType_itemStateChanged targetFormat = getFormat(cboOutputType.getSelectedItem().toString(), null); }//GEN-LAST:event_cboOutputType_itemStateChanged private void btnBrowseMappingFile_Click(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBrowseMappingFile_Click txtMappingFile.setText(showFileDialog(txtMappingFile.getText(), false)); }//GEN-LAST:event_btnBrowseMappingFile_Click Format getFormat(String extension, JComboBox cbo) { Format format; switch(extension.toLowerCase()) { default: case "conll": format = Format.CONLL; break; case "ulab": case "mst": format = Format.MST; break; case "xml": case "malt-xml": format = Format.Malt_XML; break; case "tab": case "malt-tab": format = Format.Malt_TAB; break; case "tiger": format = Format.Tiger; break; case "clear": format = Format.Clear; break; } if (cbo != null) { cbo.setSelectedIndex(format.ordinal()); } return format; } private String getExtension(Format format) { switch(format) { //Clear, default: case CONLL: return "conll"; case MST: return "mst"; case Malt_XML: case Tiger: return "xml"; case Malt_TAB: return "tab"; } } void showInput() throws IOException { txtLog.setText(""); List<String> lines = Files.readAllLines(Paths.get(txtInputFile.getText()), Charset.forName("UTF-8")); for (int i = 0; i<lines.size();i++) { txtLog.append(lines.get(i) + "\n"); } } private void mappingVisibility(boolean show) { lblMappingFile.setVisible(show); txtMappingFile.setVisible(show); btnBrowseMappingFile.setVisible(show); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnBrowseInputFile; private javax.swing.JButton btnBrowseMappingFile; private javax.swing.JButton btnBrowseOutputPath; private javax.swing.JButton btnStartConvert; private javax.swing.JComboBox cboInputType; private javax.swing.JComboBox cboOutputType; private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel8; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel lblInputFile; private javax.swing.JLabel lblInputType; private javax.swing.JLabel lblMappingFile; private javax.swing.JLabel lblOutputPath; private javax.swing.JLabel lblOutputType; private javax.swing.JPanel pnlLog; private javax.swing.JPanel pnlMapping; private javax.swing.JPanel pnlParameter; private javax.swing.JTabbedPane tabDependencyInfo; private javax.swing.JTextField txtInputFile; private javax.swing.JTextArea txtLog; private javax.swing.JTextField txtMappingFile; private javax.swing.JTextField txtOutputPath; // End of variables declaration//GEN-END:variables }