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
}