/*
* Copyright (C) 2014 Vinu K.N
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.domainmath.gui.update;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import org.apache.commons.io.FileUtils;
import org.domainmath.gui.dialog.Error;
import org.domainmath.gui.dialog.Msg;
/**
* It helps user to complete update process.
* @author Vinu K.N
*/
public class UpdateFrame extends javax.swing.JFrame{
private static final long serialVersionUID = 5346596629938962773L;
private File backup;
private final File updateZipFile;
private final File userDir;
private final File updateDir;
public UpdateFrame() {
updateZipFile = new File(System.getProperty("user.dir")+File.separator+"update"+File.separator+"update.zip");
userDir = new File(System.getProperty("user.dir"));
updateDir = new File(System.getProperty("user.dir")+File.separator+"update");
initComponents();
if(updateDir.exists()){
if(updateDir.isDirectory()){
setLocationRelativeTo(null);
setIconImage(icon);
this.progressBar.setValue((progressBar.getMaximum()/2));
backup = backup();
unzip(updateZipFile.getAbsolutePath(),userDir.getAbsolutePath());
deleteTemp(updateDir);
}
}else{
dispose();
}
}
/**
* Delete temp folder.
* @param f
*/
private void deleteTemp(File f){
try {
moveFile(updateDir.listFiles(),userDir);
FileUtils.forceDelete(new File(userDir.getAbsolutePath()+File.separator+"update.zip"));
FileUtils.deleteDirectory(f);
new Msg(this,"Update has been completed. Please restart DomainMath IDE.");
System.exit(0);
} catch (IOException ex) {
Logger.getLogger(UpdateFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* 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() {
progressBar = new javax.swing.JProgressBar();
fileLabel = new javax.swing.JLabel();
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("DomainMath IDE");
setResizable(false);
fileLabel.setText("Back up...");
jPanel1.setBackground(new java.awt.Color(255, 102, 51));
jLabel1.setFont(new java.awt.Font("Segoe UI Light", 0, 18)); // NOI18N
jLabel1.setForeground(new java.awt.Color(255, 255, 255));
jLabel1.setText("Please Wait...");
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 398, javax.swing.GroupLayout.PREFERRED_SIZE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 59, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 397, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(fileLabel)
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 96, Short.MAX_VALUE)
.addComponent(fileLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
/* Create and display the form */
java.awt.EventQueue.invokeLater(() -> {
new UpdateFrame().setVisible(true);
});
}
public java.net.URL imgURL = getClass().getResource("/org/domainmath/gui/update/resources/DomainMath.png");
public Image icon = Toolkit.getDefaultToolkit().getImage(imgURL);
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel fileLabel;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JProgressBar progressBar;
// End of variables declaration//GEN-END:variables
/**
* Back up contents to a folder.
* @return backup folder
*/
private File backup() {
// make an unique folder to store backup files.
Long n = new Random().nextLong();
File backupDir = new File(System.getProperty("user.dir")+File.separator+"backup_"+n.toString());
backupDir.mkdir();
// get files list.
List<File> fileList = getFileList(new File(System.getProperty("user.dir")+File.separator+"files_backup.ini"));
// backup.
for(File file:fileList){
// copy folders.
if(file.isDirectory()){
try {
FileUtils.copyDirectoryToDirectory(file, backupDir);
FileUtils.deleteDirectory(file);
} catch (IOException ex) {
}
}else if(file.isFile()) {
try {
FileUtils.copyFileToDirectory(file, backupDir);
FileUtils.forceDelete(file);
} catch (IOException ex) {
}
}
}
return backupDir;
}
/**
* Move files to src dir.
* @param file_list
* @param srcDir
*/
private void moveFile(File[] file_list ,File srcDir){
for(File file:file_list){
// copy folders.
if(file.isDirectory()){
try {
FileUtils.copyDirectoryToDirectory(file, srcDir);
FileUtils.deleteDirectory(file);
} catch (IOException ex) {
}
}else if(file.isFile()) {
try {
FileUtils.copyFileToDirectory(file, srcDir);
FileUtils.forceDelete(file);
} catch (IOException ex) {
}
}
}
}
private List<File> getFileList(File datafile) {
List<File> data = Collections.synchronizedList(new ArrayList());
String line;
try {
FileInputStream fin = new FileInputStream(datafile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
try {
while((line=br.readLine()) != null) {
StringTokenizer s2 = new StringTokenizer(line,"\n");
while(s2.hasMoreTokens()) {
data.add(new File(System.getProperty("user.dir")+File.separator+s2.nextToken()));
}
}
br.close();
} catch (IOException ex) {
dispose();
}
} catch (FileNotFoundException ex) {
String error= "You can not continue update process,you"
+ "are using older version of DomainMath IDE.You can download latest"
+ "version from Internet.";
new Error(this,"Unable to update.",error);
dispose();
}
return data;
}
private void unzip(String src, String des) {
try {
System.out.println(src+"-"+des);
ZipFile zipFile = new ZipFile(src);
zipFile.extractAll(des);
this.fileLabel.setText("Completed");
this.progressBar.setValue(progressBar.getMaximum());
} catch (ZipException e) {
new Error(this,"Unable to update.","Unable to extract downloaded files.");
e.printStackTrace();
dispose();
}
}
}