# HG changeset patch # User František Kučera # Date 1702412351 -3600 # Node ID d511e4bf7d8f1b41e7d3b1e1cb1d492791709f1a # Parent 8d42303538edd0a6e25ab2f9a3e44b6a49f0b28f volitelné zamykání souborů (POSIX) a zaslání notifikace ostatním aplikacím (inotify/CLOSE_WRITE) diff -r 8d42303538ed -r d511e4bf7d8f java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Atribut.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Atribut.java Mon Dec 11 00:49:59 2023 +0100 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Atribut.java Tue Dec 12 21:19:11 2023 +0100 @@ -19,6 +19,9 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; +/** + * @author Ing. František Kučera (frantovo.cz) + */ public class Atribut { private String klíč; diff -r 8d42303538ed -r d511e4bf7d8f java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties Mon Dec 11 00:49:59 2023 +0100 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties Tue Dec 12 21:19:11 2023 +0100 @@ -5,6 +5,8 @@ chyba.chyb\u00edParametr=O\u010dek\u00e1v\u00e1m pr\u00e1v\u011b jeden parametr \u2013 n\u00e1zev souboru. chyba.nepoda\u0159iloSeSmazat=Nepoda\u0159ilo se smazat atribut. chyba.nepoda\u0159iloSeNa\u010d\u00edst=Nepoda\u0159ilo se na\u010d\u00edst atributy. +chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Nepoda\u0159ilo se nastavit z\u00e1mek. +chyba.lzeZamknoutJenSoubor=Je podporov\u00e1no zamyk\u00e1n\u00ed pouze norm\u00e1ln\u00edch sobour\u016f ne adres\u00e1\u0159\u016f atd. tabulka.n\u00e1zev=N\u00e1zev tabulka.hodnota=Hodnota @@ -12,3 +14,5 @@ p\u0159idatAtribut=P\u0159idat atribut smazatAtribut=Smazat atribut znovuNa\u010d\u00edst=Znovu na\u010d\u00edst +zamknout=Zamknout +zamknout.popis=Otev\u0159e soubor pro z\u00e1pis a vytvo\u0159\u00ed na n\u011bm z\u00e1mek. P\u0159i odemknut\u00ed uvoln\u00ed z\u00e1mek a zav\u0159e soubor. diff -r 8d42303538ed -r d511e4bf7d8f java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties Mon Dec 11 00:49:59 2023 +0100 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties Tue Dec 12 21:19:11 2023 +0100 @@ -5,6 +5,8 @@ chyba.chyb\u00edParametr=Expecting one parameter \u2013 file name. chyba.nepoda\u0159iloSeSmazat=Failed to delete the attribute. chyba.nepoda\u0159iloSeNa\u010d\u00edst=Failed to load attributes. +chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Unable to lock the file. +chyba.lzeZamknoutJenSoubor=File locking is supported only for regular files, not for directories or specials. tabulka.n\u00e1zev=Name tabulka.hodnota=Value @@ -12,3 +14,5 @@ p\u0159idatAtribut=Add attribute smazatAtribut=Delete attribute znovuNa\u010d\u00edst=Reload all +zamknout=Lock +zamknout.popis=Open the file for write and lock it. On unlocking, release the lock and close the file. diff -r 8d42303538ed -r d511e4bf7d8f java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Startér.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Startér.java Mon Dec 11 00:49:59 2023 +0100 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Startér.java Tue Dec 12 21:19:11 2023 +0100 @@ -41,10 +41,10 @@ * http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html * #so-what-is-a-path-really * - * $ setfattr -n "user.fiki.pozdrav" -v 'Dobrý den!' pokus.txt + * $ setfattr -n "user.franta.pozdrav" -v 'Dobrý den!' pokus.txt * (v javě pak pracujeme s klíči bez předpony „user.“) - * - * @author fiki + * + * @author Ing. František Kučera (frantovo.cz) */ public class Startér { diff -r 8d42303538ed -r d511e4bf7d8f java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Model.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Model.java Mon Dec 11 00:49:59 2023 +0100 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Model.java Tue Dec 12 21:19:11 2023 +0100 @@ -19,7 +19,10 @@ import cz.frantovo.rozsireneatributy.Atribut; import java.io.File; import java.io.IOException; +import java.io.RandomAccessFile; import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; import java.nio.file.Path; import java.nio.file.attribute.UserDefinedFileAttributeView; import java.nio.file.spi.FileSystemProvider; @@ -35,8 +38,7 @@ import javax.swing.table.TableModel; /** - * - * @author fiki + * @author Ing. František Kučera (frantovo.cz) */ public class Model implements TableModel { @@ -49,10 +51,16 @@ překlady.getString("tabulka.hodnota") }; private Set posluchače = new HashSet<>(); + private File soubor; private UserDefinedFileAttributeView souborovýSystém; private List atributy = new ArrayList<>(); + private RandomAccessFile zámekSoubor; + private FileChannel zámekKanál; + private FileLock zámek; + public Model(File soubor) throws IOException { + this.soubor = soubor; Path cesta = soubor.toPath(); FileSystemProvider posyktovatelFS = cesta.getFileSystem().provider(); souborovýSystém = posyktovatelFS @@ -172,4 +180,29 @@ p.tableChanged(new TableModelEvent(this)); } } + + public boolean isZámekPodporovaný() { + return soubor.isFile(); + } + + public void nastavZámek(boolean zamknout) throws IOException { + if (!isZámekPodporovaný()) { + throw new IOException(překlady + .getString("chyba.lzeZamknoutJenSoubor")); + } + + if (zamknout && zámekSoubor == null) { + zámekSoubor = new RandomAccessFile(soubor, "rw"); + zámekKanál = zámekSoubor.getChannel(); + zámek = zámekKanál.lock(); + } else if (!zamknout && zámekSoubor != null) { + zámek.release(); + zámekKanál.close(); + zámekSoubor.close(); + zámek = null; + zámekKanál = null; + zámekSoubor = null; + } + + } } diff -r 8d42303538ed -r d511e4bf7d8f java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form Mon Dec 11 00:49:59 2023 +0100 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form Tue Dec 12 21:19:11 2023 +0100 @@ -23,7 +23,9 @@ - + + + @@ -37,6 +39,7 @@ + @@ -82,5 +85,15 @@ + + + + + + + + + + diff -r 8d42303538ed -r d511e4bf7d8f java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java Mon Dec 11 00:49:59 2023 +0100 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java Tue Dec 12 21:19:11 2023 +0100 @@ -28,8 +28,7 @@ import javax.swing.event.ListSelectionListener; /** - * - * @author fiki + * @author Ing. František Kučera (frantovo.cz) */ public class Panel extends javax.swing.JPanel { @@ -46,6 +45,11 @@ this.model = model; initComponents(); + tlačítkoZamknout.setEnabled(model.isZámekPodporovaný()); + tlačítkoZamknout.setToolTipText(model.isZámekPodporovaný() + ? překlady.getString("zamknout.popis") + : překlady.getString("chyba.lzeZamknoutJenSoubor")); + tabulka = new JTable(model); nastavEditor(); tabulka.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); @@ -85,8 +89,9 @@ } private void zobrazChybovouHlášku(String hláška, Throwable chyba) { - JOptionPane.showMessageDialog(this, hláška, - překlady.getString("chyba"), JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, hláška + "\n" + + chyba.getLocalizedMessage(), + překlady.getString("chyba.titulek"), JOptionPane.ERROR_MESSAGE); log.log(Level.WARNING, hláška, chyba); } @@ -98,6 +103,7 @@ tlačítkoPřidat = new javax.swing.JButton(); tlačítkoSmazat = new javax.swing.JButton(); tlačítkoZnovuNačíst = new javax.swing.JButton(); + tlačítkoZamknout = new javax.swing.JToggleButton(); tlačítkoPřidat.setMnemonic('p'); java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("cz/frantovo/rozsireneatributy/Překlady"); // NOI18N @@ -125,6 +131,13 @@ } }); + tlačítkoZamknout.setText(bundle.getString("zamknout")); // NOI18N + tlačítkoZamknout.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tlačítkoZamknoutActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -136,7 +149,9 @@ .addComponent(tlačítkoSmazat) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tlačítkoZnovuNačíst) - .addContainerGap(222, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tlačítkoZamknout) + .addContainerGap(122, Short.MAX_VALUE)) .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 543, Short.MAX_VALUE) ); layout.setVerticalGroup( @@ -147,7 +162,8 @@ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(tlačítkoPřidat) .addComponent(tlačítkoSmazat) - .addComponent(tlačítkoZnovuNačíst)) + .addComponent(tlačítkoZnovuNačíst) + .addComponent(tlačítkoZamknout)) .addContainerGap()) ); }// //GEN-END:initComponents @@ -173,10 +189,21 @@ .getString("chyba.nepodařiloSeNačíst"), e); } }//GEN-LAST:event_tlačítkoZnovuNačístActionPerformed + + private void tlačítkoZamknoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZamknoutActionPerformed + try { + model.nastavZámek(tlačítkoZamknout.isSelected()); + } catch (Exception e) { + zobrazChybovouHlášku(překlady + .getString("chyba.nepodařiloSeNastavitZámek"), e); + } + }//GEN-LAST:event_tlačítkoZamknoutActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JScrollPane posuvnýPanel; private javax.swing.JButton tlačítkoPřidat; private javax.swing.JButton tlačítkoSmazat; + private javax.swing.JToggleButton tlačítkoZamknout; private javax.swing.JButton tlačítkoZnovuNačíst; // End of variables declaration//GEN-END:variables }