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