java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Model.java
author František Kučera <franta-hg@frantovo.cz>
Fri, 15 Dec 2023 01:36:17 +0100
branchv_0
changeset 31 1ab5ce94a146
parent 30 d511e4bf7d8f
permissions -rw-r--r--
konfigurace, parser CLI parametrů
     1 /**
     2  * Rozšířené atributy – program na správu rozšířených atributů souborů
     3  * Copyright © 2012 František Kučera (frantovo.cz)
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, either version 3 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 package cz.frantovo.rozsireneatributy.gui;
    18 
    19 import cz.frantovo.rozsireneatributy.Atribut;
    20 import cz.frantovo.rozsireneatributy.Konfigurace;
    21 import java.io.File;
    22 import java.io.IOException;
    23 import java.io.RandomAccessFile;
    24 import java.nio.ByteBuffer;
    25 import java.nio.channels.FileChannel;
    26 import java.nio.channels.FileLock;
    27 import java.nio.file.Path;
    28 import java.nio.file.attribute.UserDefinedFileAttributeView;
    29 import java.nio.file.spi.FileSystemProvider;
    30 import java.util.ArrayList;
    31 import java.util.HashSet;
    32 import java.util.List;
    33 import java.util.ResourceBundle;
    34 import java.util.Set;
    35 import java.util.logging.Level;
    36 import java.util.logging.Logger;
    37 import javax.swing.event.TableModelEvent;
    38 import javax.swing.event.TableModelListener;
    39 import javax.swing.table.TableModel;
    40 
    41 /**
    42  * @author Ing. František Kučera (frantovo.cz)
    43  */
    44 public class Model implements TableModel {
    45 
    46 	private static final Logger log = Logger
    47 		.getLogger(Model.class.getSimpleName());
    48 	private static final ResourceBundle překlady = ResourceBundle
    49 		.getBundle(Atribut.class.getPackageName() + ".Překlady");
    50 	private final String[] sloupečky = {
    51 		překlady.getString("tabulka.název"),
    52 		překlady.getString("tabulka.hodnota")
    53 	};
    54 	private final Set<TableModelListener> posluchače = new HashSet<>();
    55 	private final Konfigurace konfigurace;
    56 	private final UserDefinedFileAttributeView souborovýSystém;
    57 	private final List<Atribut> atributy = new ArrayList<>();
    58 
    59 	private RandomAccessFile zámekSoubor;
    60 	private FileChannel zámekKanál;
    61 	private FileLock zámek;
    62 
    63 	public Model(Konfigurace konfigurace) throws IOException {
    64 		this.konfigurace = konfigurace;
    65 		Path cesta = konfigurace.getSoubor().toPath();
    66 		FileSystemProvider posyktovatelFS = cesta.getFileSystem().provider();
    67 		souborovýSystém = posyktovatelFS
    68 			.getFileAttributeView(cesta, UserDefinedFileAttributeView.class);
    69 		načtiAtributy();
    70 	}
    71 
    72 	public Konfigurace getKonfigurace() {
    73 		return konfigurace;
    74 	}
    75 
    76 	@Override
    77 	public int getRowCount() {
    78 		return atributy.size();
    79 	}
    80 
    81 	@Override
    82 	public int getColumnCount() {
    83 		return sloupečky.length;
    84 	}
    85 
    86 	@Override
    87 	public String getColumnName(int n) {
    88 		return sloupečky[n];
    89 	}
    90 
    91 	@Override
    92 	public Class<?> getColumnClass(int n) {
    93 		return String.class;
    94 	}
    95 
    96 	@Override
    97 	public boolean isCellEditable(int m, int n) {
    98 		return true;
    99 	}
   100 
   101 	@Override
   102 	public Object getValueAt(int m, int n) {
   103 		switch (n) {
   104 			case 0:
   105 				return atributy.get(m).getKlíč();
   106 			case 1:
   107 				return atributy.get(m).getHodnota();
   108 			default:
   109 				return null;
   110 		}
   111 	}
   112 
   113 	@Override
   114 	public void setValueAt(Object hodnota, int m, int n) {
   115 		Atribut a = atributy.get(m);
   116 		try {
   117 			if (n == 0) {
   118 				/**
   119 				 * Měníme klíč – název atributu
   120 				 */
   121 				String novýKlíč = String.valueOf(hodnota);
   122 				if (!novýKlíč.equals(a.getKlíč())) {
   123 					if (a.isPlatnýKlíč()) {
   124 						souborovýSystém.delete(a.getKlíč());
   125 					}
   126 					a.setKlíč(novýKlíč);
   127 					if (a.isPlatnýKlíč() && a.isPlatnáHodnota()) {
   128 						souborovýSystém.write(a.getKlíč(), a.getHodnotaBajty());
   129 					}
   130 				}
   131 			} else if (n == 1) {
   132 				/**
   133 				 * Měníme hodnotu atributu
   134 				 */
   135 				a.setHodnota(String.valueOf(hodnota));
   136 				if (a.isPlatnýKlíč() && a.isPlatnáHodnota()) {
   137 					souborovýSystém.write(a.getKlíč(), a.getHodnotaBajty());
   138 				}
   139 			}
   140 		} catch (IOException e) {
   141 			log.log(Level.SEVERE, "Selhalo ukládání atributu na FS", e);
   142 		}
   143 	}
   144 
   145 	@Override
   146 	public void addTableModelListener(TableModelListener l) {
   147 		posluchače.add(l);
   148 	}
   149 
   150 	@Override
   151 	public void removeTableModelListener(TableModelListener l) {
   152 		posluchače.remove(l);
   153 	}
   154 
   155 	/**
   156 	 * @param m číslo řádku
   157 	 * @return atribut, který se na něm nachází
   158 	 */
   159 	public Atribut getAtribut(int m) {
   160 		return atributy.get(m);
   161 	}
   162 
   163 	public void přidejAtribut(Atribut a) {
   164 		atributy.add(a);
   165 		upozorniPosluchače();
   166 	}
   167 
   168 	public void odeberAtribut(Atribut a) throws IOException {
   169 		atributy.remove(a);
   170 		if (a.isPlatnýKlíč()) {
   171 			souborovýSystém.delete(a.getKlíč());
   172 		}
   173 		upozorniPosluchače();
   174 	}
   175 
   176 	public final void načtiAtributy() throws IOException {
   177 		List<String> jménaAtributů = souborovýSystém.list();
   178 		atributy.clear();
   179 		for (String jménoAtributu : jménaAtributů) {
   180 			ByteBuffer hodnotaAtributu = ByteBuffer
   181 				.allocate(souborovýSystém.size(jménoAtributu));
   182 			souborovýSystém.read(jménoAtributu, hodnotaAtributu);
   183 			atributy.add(new Atribut(jménoAtributu, hodnotaAtributu));
   184 		}
   185 		upozorniPosluchače();
   186 	}
   187 
   188 	private void upozorniPosluchače() {
   189 		for (TableModelListener p : posluchače) {
   190 			p.tableChanged(new TableModelEvent(this));
   191 		}
   192 	}
   193 
   194 	public boolean isZámekPodporovaný() {
   195 		return konfigurace.getSoubor().isFile();
   196 	}
   197 
   198 	public void nastavZámek(boolean zamknout) throws IOException {
   199 		if (!isZámekPodporovaný()) {
   200 			throw new IOException(překlady
   201 				.getString("chyba.lzeZamknoutJenSoubor"));
   202 		}
   203 
   204 		if (zamknout && zámekSoubor == null) {
   205 			zámekSoubor = new RandomAccessFile(konfigurace.getSoubor(), "rw");
   206 			zámekKanál = zámekSoubor.getChannel();
   207 			zámek = zámekKanál.lock();
   208 		} else if (!zamknout && zámekSoubor != null) {
   209 			zámek.release();
   210 			zámekKanál.close();
   211 			zámekSoubor.close();
   212 			zámek = null;
   213 			zámekKanál = null;
   214 			zámekSoubor = null;
   215 		}
   216 
   217 	}
   218 }