Created
July 29, 2016 15:22
-
-
Save Nasawa/e20e1635bcb248c8c332c76d275b4c25 to your computer and use it in GitHub Desktop.
Java application to backup a filesystem repeatedly over an interval of minutes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package backup; | |
import java.awt.Dimension; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import java.awt.event.WindowAdapter; | |
import java.awt.event.WindowEvent; | |
import java.beans.PropertyChangeEvent; | |
import java.beans.PropertyChangeListener; | |
import java.io.File; | |
import java.io.IOException; | |
import java.util.ArrayList; | |
import java.util.List; | |
import javax.swing.BoxLayout; | |
import javax.swing.JButton; | |
import javax.swing.JFileChooser; | |
import javax.swing.JFrame; | |
import javax.swing.JLabel; | |
import javax.swing.JOptionPane; | |
import javax.swing.JPanel; | |
import javax.swing.JTextField; | |
import javax.swing.WindowConstants; | |
import org.apache.commons.io.FileUtils; | |
@SuppressWarnings("serial") | |
public class BackupApplication extends JPanel implements ActionListener, PropertyChangeListener | |
{ | |
JFileChooser chooser; | |
JButton src, dest, start; | |
JPanel srcHost, destHost, startHost, headHost; | |
JTextField srcText, destText, destArea, nameText, delayText; | |
JLabel statusText, nameLabel, delayLabel; | |
Thread t; | |
File data; | |
public BackupApplication() | |
{ | |
Dimension d = new Dimension(120, 20); | |
src = new JButton("Source"); | |
dest = new JButton("Destination"); | |
start = new JButton("Start"); | |
src.setPreferredSize(d); | |
dest.setPreferredSize(d); | |
start.setPreferredSize(d); | |
src.addActionListener(this); | |
dest.addActionListener(this); | |
start.addActionListener(this); | |
srcText = new JTextField(25); | |
destText = new JTextField(25); | |
nameText = new JTextField(10); | |
delayText = new JTextField(2); | |
statusText = new JLabel("Copying currently not active."); | |
nameLabel = new JLabel("Backup Name:"); | |
delayLabel = new JLabel("Rate (in mins):"); | |
d = new Dimension(320, 20); | |
srcText.setMaximumSize(d); | |
destText.setMaximumSize(d); | |
statusText.setMaximumSize(d); | |
statusText.addPropertyChangeListener(this); | |
headHost = new JPanel(); | |
headHost.setLayout(new BoxLayout(headHost, BoxLayout.X_AXIS)); | |
srcHost = new JPanel(); | |
srcHost.setLayout(new BoxLayout(srcHost, BoxLayout.X_AXIS)); | |
destHost = new JPanel(); | |
destHost.setLayout(new BoxLayout(destHost, BoxLayout.X_AXIS)); | |
startHost = new JPanel(); | |
startHost.setLayout(new BoxLayout(startHost, BoxLayout.X_AXIS)); | |
d = new Dimension(200, 30); | |
srcHost.setPreferredSize(d); | |
destHost.setPreferredSize(d); | |
startHost.setPreferredSize(d); | |
headHost.add(nameLabel); | |
headHost.add(nameText); | |
headHost.add(delayLabel); | |
headHost.add(delayText); | |
srcHost.add(srcText); | |
srcHost.add(src); | |
destHost.add(destText); | |
destHost.add(dest); | |
startHost.add(statusText); | |
startHost.add(start); | |
add(headHost); | |
add(srcHost); | |
add(destHost); | |
add(startHost); | |
} | |
public BackupApplication(JLabel label) | |
{ | |
statusText = label; | |
} | |
public static void main(String[] args) throws IOException | |
{ | |
JFrame frame = new JFrame("Backup Application"); | |
BackupApplication app = new BackupApplication(); | |
app.setLayout(new BoxLayout(app, BoxLayout.Y_AXIS)); | |
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); | |
frame.addWindowListener(new WindowAdapter() | |
{ | |
public void windowClosing(WindowEvent e) | |
{ | |
int q = JOptionPane.showConfirmDialog(null, "Are you sure you want to quit?"); | |
if (q == JOptionPane.OK_OPTION) | |
System.exit(0); | |
} | |
}); | |
frame.getContentPane().add(app, "Center"); | |
frame.setSize(app.getPreferredSize()); | |
frame.setVisible(true); | |
app.settings(true); | |
} | |
public void settings(boolean isRead) throws IOException | |
{ | |
data = new File("./backup.txt"); | |
data.createNewFile(); | |
JTextField[] fields = {nameText, delayText, srcText, destText}; | |
List<String> lines; | |
if(isRead) | |
{ | |
lines = FileUtils.readLines(data); | |
for(int i = 0; i < fields.length; i++) | |
fields[i].setText(lines.get(i)); | |
} | |
else | |
{ | |
lines = new ArrayList<String>(); | |
for(int i = 0; i < fields.length; i++) | |
lines.add(fields[i].getText()); | |
FileUtils.writeLines(data, lines); | |
} | |
} | |
@SuppressWarnings("deprecation") | |
@Override | |
public void actionPerformed(ActionEvent e) | |
{ | |
if (e.getSource() == start) | |
{ | |
if (t != null) | |
{ | |
t.stop(); | |
t = null; | |
start.setText("Start"); | |
return; | |
} | |
if (srcText.getText() != "" && destText.getText() != "" && srcText.getText() != destText.getText()) | |
{ | |
try | |
{ | |
settings(false); | |
} | |
catch (IOException e1) | |
{ | |
e1.printStackTrace(); | |
} | |
t = new Thread(new CopyWorker(nameText.getText(), Integer.parseInt(delayText.getText()) * 60000, | |
srcText.getText(), destText.getText(), statusText)); | |
t.start(); | |
statusText.setText("Copying initialized..."); | |
start.setText("Stop"); | |
} | |
else | |
{ | |
JOptionPane.showMessageDialog(null, "Your paths are empty or invalid!"); | |
} | |
return; | |
} | |
if (t != null) | |
{ | |
t.stop(); | |
t = null; | |
start.setText("Start"); | |
} | |
chooser = new JFileChooser(); | |
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); | |
chooser.setAcceptAllFileFilterUsed(false); | |
destArea = e.getSource() == src ? srcText : destText; | |
chooser.setCurrentDirectory(new File(destArea.getText() == "" ? "." : destArea.getText())); | |
chooser.setDialogTitle(String.format("Choose %s Location", destArea == srcText ? "Source" : "Destination")); | |
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) | |
destArea.setText(chooser.getSelectedFile().toString()); | |
} | |
public Dimension getPreferredSize() | |
{ | |
return new Dimension(400, 150); | |
} | |
@SuppressWarnings("deprecation") | |
@Override | |
public void propertyChange(PropertyChangeEvent evt) | |
{ | |
if (evt.getSource() == statusText) | |
{ | |
if (statusText.getText().equals("Error")) | |
{ | |
start.setText("Start"); | |
if (t != null) | |
{ | |
t.stop(); | |
t = null; | |
} | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package backup; | |
import java.io.File; | |
import java.io.IOException; | |
import java.time.LocalDateTime; | |
import javax.swing.JLabel; | |
import javax.swing.JOptionPane; | |
import org.apache.commons.io.FileUtils; | |
public class CopyWorker implements Runnable | |
{ | |
String src, dest, name; | |
int delay = 30 * 60 * 1000; | |
JLabel status; | |
public CopyWorker(String n, int t, String s, String d, JLabel l) | |
{ | |
src = s; | |
dest = d; | |
status = l; | |
name = n; | |
delay = t; | |
} | |
@Override | |
public void run() | |
{ | |
while(true) | |
{ | |
String time = System.currentTimeMillis() + ""; | |
status.setText("Copying..."); | |
File out = new File(String.format("%s/%s-%s", dest, name, time)); | |
out.mkdir(); | |
try | |
{ | |
FileUtils.copyDirectory(new File(src), out); | |
status.setText(String.format("Last Copy @ %s", LocalDateTime.now().toString())); | |
Thread.sleep(delay); | |
} | |
catch (InterruptedException | IOException e) | |
{ | |
JOptionPane.showMessageDialog(null, "Something broke!"); | |
status.setText("Error"); | |
e.printStackTrace(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment