Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1

Приложение для работы с файлами с функциональностью Проводника Windows

18.10.2013, 16:31. Показов 6236. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С первым проектом разобрался и успешно сдал. Теперь я получил последний проект. И тоже возникли некоторые недопонимания в реализации задания

Суть: написать-реализовать: Приложение для работы с файлами с функциональностью Проводника Windows или Total Commander с кучей рекомендаций.

Основные компоненты приложения
Кликните здесь для просмотра всего текста

1. Ядро
2. Консольный пользовательский интерфейс (консоль)
3. Графический пользовательский интерфейс
4. Сетевые средства
5. Многопоточный сервер (модель клиент-сервер)
6. База данных (Data base)
7. Веб-приложение (Web-application)
8. J2EE-приложение

Сейчас начинаю разрабатывать ядро.
И вот мои идеи насчет реализации ядра программы
Кликните здесь для просмотра всего текста

Требование к ядру
1.1. Обязательная часть (required)
1. Ядро. Разработать иерархию классов-сущностей, соответствующую данному заданию.
2. Manager. Написать класс, который будет содержать бизнес-логику вашего приложения (производить различные проверки, перед тем как совершать операции с объектами).
3. DAO. Написать класс, который будет манипулировать данными (объектами). Например удалять, добавлять, изменять объекты, искать объекты по какому-то критерию.
4. Данные (объекты) программы должны храниться в оперативной памяти. Можно использовать, например, хранилища вида Collection, Map.
5. Использование паттернов: Singleton, DAO, Facade

Мои идеи насчет ядра
Ядро́ (kernel) — центральная часть данной системы. Ядро предоставляет сервисы файловой системы и сетевых протоколов.
Ядро состоит из двух компонентов
1. Менеджера валидатора
2. Класса, реализующего DAO
Менеджер валидатор обеспечивает проверку на корректность того или иного действия текущего пользователя. К примеру, если пользователь выполняет команду на удаление файла без привилегий на это действие, то менеджер валидатор не должен допустить удаление данного файла. Класса, реализующий DAO будет производить операции с данными только при "корректной" валидации текущего действия, т.е. работа ядра будет по такому принципу:
Запрос с внешней среды передается в
вспомогательный класс "драйвер", далее этот класс запрашивает валидацию у менеджера валидатора, если валидация проходит успешно - этот же запрос адресуется классу, реализующего DAO, далее полученный результат от DAO класс "драйвер" передает как ответ во внешннюю среду.

Внешнее воздействие на составные компоненты ядра возможно только через открытые функции самого ядра. Процесс работы ядра см. рис

Использование паттернов: Singleton, DAO, Facade
Singleton - не понятки, для кого это? Ядро должно быть в единственном экземпляре, хм..., почему?
DAO - вроде понятно.
Facade - тоже, зачем?

Начальная реализация ядра
Кликните здесь для просмотра всего текста

Название: package_kernel.PNG
Просмотров: 491

Размер: 3.1 Кб
Код ядра.
При инициализации ядра происходит конфигурация, т.е. считывается из xml-файла конфиг данные - здесь все пока сыро и на скорую руку сделано
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package ru.junior_progger.kernel;
 
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
 
import ru.junior_progger.exception.KernelConfigurationException;
import ru.junior_progger.main.Privilege;
import ru.junior_progger.main.User;
 
 
public class Kernel {
    private List<User> users;
    private File defaultDirectory;
    
    public Kernel()throws KernelConfigurationException{
        this.setDefaultDirectory(null);
        init();
    }
    public Kernel(File file)throws KernelConfigurationException{
        this.setDefaultDirectory(file);
        init();
    }
    public Kernel(String path) throws KernelConfigurationException{
        this.setDefaultDirectory(new File(path));
        init();
    }
    
    private void init() throws KernelConfigurationException{
        readUsers(defaultDirectory);
    }
    
 
    private void readUsers(File directory) throws KernelConfigurationException{
        this.users = parse(directory.getAbsoluteFile() 
                + File.separator + "configuration.xml");
    }
    private List<User> parse(String path) throws KernelConfigurationException{
        try {
            List<User> users = new ArrayList<>();
            File xmlFile = new File(path);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(xmlFile);
            doc.getDocumentElement().normalize();
            
            if("FileManager".equals(doc.getDocumentElement().getNodeName())){
                NodeList list = doc.getElementsByTagName("user");
                for (int i = 0; i < list.getLength(); i++) {
                    Node node = list.item(i);
                    if(node.getNodeType() == Node.ELEMENT_NODE){
                        Element e = (Element) node;
                        String name = e.getElementsByTagName("name").item(0).getTextContent();
                        String password = e.getElementsByTagName("password").item(0).getTextContent();
                        String priv = e.getElementsByTagName("privilege").item(0).getTextContent();
                        users.add(new User(name, password, Privilege.getValue(priv)));
                    }
                }
            }else {
                throw new KernelConfigurationException("Wrong configuration file!");
            }
            
            return users;
        } catch(SAXException e){
            throw new KernelConfigurationException(e.getMessage());
        } catch (ParserConfigurationException e) {
            throw new KernelConfigurationException(e.getMessage());
        } catch(IOException e){ 
            throw new KernelConfigurationException(e.getMessage());
        } 
    }
    
    public boolean deleteFile(File file, User user){
        return false;
    }
    public boolean createFile(String fileName, User user){
        return false;
    }
    public boolean createDirectory(String directoryName, User user){
        return false;
    }
    public File[] getAllFiles(File directory, User user){
        return null;
    }
    public String[] getAllFileNames(File directory, User user){
        return null;
    }
    public File[] getDirectories(String dir, User user){
        return null;
    }
    public String[] getDirectories(File dir, User user){
        return null;
    }
    public File findFile(File directory, FilenameFilter filter, User user){
        return null;
    }
    public boolean canRead(File file, User user){
        return false;
    }
    public boolean canWrite(File file, User user){
        return false;
    }
    public boolean exists(File file, User user){
        return false;
    }
    public File getParent(File file, User user){
        return null;
    }
    public boolean copyFile(File sourse, File destination, User user){
        return false;
    }
    public boolean rename(File source, String newFileName, User user){
        return false;
    }
    
    
 
    public File getDefaultDirectory() {
        return defaultDirectory;
    }
    public void setDefaultDirectory(File defaultDirectory) {
        this.defaultDirectory = defaultDirectory;
    }
    public User getUserByName(String name){
        for (User cur : users) {
            if(cur.getName().equals(name))
                return cur;
        }
        return null;
    }
}

Сам файл с заданием Задание.docx
Ваши мнения
Где есть ошибки, недочеты?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2013, 16:31
Ответы с готовыми решениями:

Приложение для работы с файлами Excel
Есть необходимость написания прилоги работающей с файлами Excel, но не используя возможностей для работы с таковыми самого экселя. Т.е. мне...

Обсуждение и сравнение способов и инструментов для работы с текстовыми файлами в ОС windows
Garry Galler, никогда не поздно узнать, что .NET среда еще быстрее, чем cmd и PowerShell. (тут я даю код в три строки с скомпилированным...

Написать Windows-приложение для работы с информацией о пациентах терапевтического отделения больницы
Подготовить текстовый файл, содержащий информацию о пациентах терапевтического отделения больницы: фамилию, год рождения, дату поступления,...

59
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
22.10.2013, 12:33  [ТС]
Студворк — интернет-сервис помощи студентам
Как вам вот этот код - говнокод?

Есть список(енум) возможных операций
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package ru.junior_progger.entity;
 
public enum Operation {
    Help, 
    DefaultPath, 
    ShowFiles,
    OpenFile,
    WriteToFile,
    ShowFileNames,
    ShowDirectoryNames,
    CreateFile,
    CreateDirectory,
    DeleteFile,
    DeleteDirectory,
    CopyFile,
    CopyDirectory,
    RenameFile,
    RenameDirectory,
    FindFile,
    FindDirectory,
    MoveFile,
    MoveDirectory,
    ShowSubDirectories,
    LookHiddenFiles,
    LookHiddenDirectories,
    HideDirectory,
    HideFile,
    Exit;
    
    public static Operation getValueOf(String text) {
        switch (text.toLowerCase()) {
        case "-1":
        case "?":
        case "/?":
        case "help":
            return Help;
        case "path":
        case "change default path":
        case "change path":
            return DefaultPath;
        case "files":
        case "show files":
        case "show all files":
            return ShowFiles;
        case "show file names":
        case "file names":
            return ShowFileNames;
        case "directory names":
        case "dir names":
        case "dirs":
            return ShowDirectoryNames;
        case "create file":
            return CreateFile;
        case "delete file":
            return DeleteFile;
        case "copy file":
            return CopyFile;
        case "rename file":
            return RenameFile;
        case "find file":
            return FindFile;
        case "move file":
            return MoveFile;
        case "show directories":
        case "show sub directories":
        case "directories":
            return ShowSubDirectories;
        case "create directory":
            return CreateDirectory;
        case "delete directory":
            return DeleteDirectory;
        case "copy directory":
            return CopyDirectory;
        case "find directory":
            return FindDirectory;
        case "rename directory":
            return RenameDirectory;
        case "move directory":
            return MoveDirectory;
        case "show hidden files":
            return LookHiddenFiles;
        case "show hidden directories":
            return LookHiddenDirectories;
        case "hide file":
            return HideFile;
        case "hide directory":
            return HideDirectory;
        case "open file":
            return OpenFile;
        case "write to file":
            return WriteToFile;         
        case "exit":
            return Exit;
        default:
            return null;
        }
    }
}


И есть класс Юзеров
Кликните здесь для просмотра всего текста

Общий класс предок
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package ru.junior_progger.entity;
 
public abstract class User {
    protected String name;
    protected String password;
    
    public User(){ 
        
    }
    public User(String name){
        this.name = name;
    }
    public User(String name, String password){
        this.name = name;
        this.password = password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
 
    
    public abstract boolean contains(Operation priv);
    public boolean checkPassword(String password){
        return this.password.equals(password);
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof User){
            User us = (User) obj;
            
            return us.name.equals(this.name) && us.password.equals(this.password);
        }
        return super.equals(obj);
    }
}

Класс Админ
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package ru.junior_progger.entity;
 
public class Administrator extends User {
    private static Operation[] privileges = initPrivileges();
    private static Operation[] initPrivileges() {
        return new Operation[] { 
                Operation.Help, Operation.DefaultPath,
                Operation.ShowDirectoryNames, Operation.ShowFiles,
                Operation.ShowFileNames, Operation.CreateFile,
                Operation.CreateDirectory, Operation.DeleteFile,
                Operation.DeleteDirectory, Operation.CopyFile,
                Operation.CopyDirectory, Operation.RenameFile,
                Operation.RenameDirectory, Operation.FindFile,
                Operation.FindDirectory, Operation.MoveFile,
                Operation.MoveDirectory, Operation.ShowSubDirectories,
                Operation.LookHiddenFiles, Operation.LookHiddenDirectories,
                Operation.HideDirectory, Operation.OpenFile,
                Operation.WriteToFile, Operation.HideFile, Operation.Exit };
    }
    
    public Administrator(String name){
        this.name = name;
    }
    public Administrator(String name, String password){
        this.name = name;
        this.password = password;
    }
 
    @Override
    public String toString() {
        return "Admin: " + this.name;
    }
    
    public Operation[] getPrivileges() {
        return Administrator.privileges;
    }
 
    @Override
    public boolean contains(Operation oper) {
        for (Operation privilege : Administrator.privileges) {
            if(privilege == oper)
                return true;
        }
        return false;
    }
}


И обычный юзер
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package ru.junior_progger.entity;
 
public class DefaultUser extends User{
    private static Operation[] Operations = initOperations();
    private static Operation[] initOperations() {
        return new Operation[] { 
                Operation.ShowFileNames, Operation.ShowSubDirectories,
                Operation.ShowDirectoryNames,
                Operation.CreateFile, Operation.CreateDirectory, 
                Operation.FindFile, Operation.FindDirectory, 
                Operation.MoveFile, Operation.MoveDirectory, 
                Operation.CopyFile, Operation.CopyDirectory,
                Operation.Help,  Operation.DefaultPath,
                Operation.Exit, Operation.ShowFiles,
                Operation.OpenFile
        };
                
    }
    
    public DefaultUser(String name){
        this.name = name;
    }
    public DefaultUser(String name, String password){
        this.name = name;
        this.password = password;
    }
 
    @Override
    public String toString() {
        return "Default user: " + this.name;
    }
    
    public Operation[] getOperations() {
        return DefaultUser.Operations;
    }
 
    @Override
    public boolean contains(Operation oper) {
        for (Operation Operation : DefaultUser.Operations) {
            if(Operation == oper)
                return true;
        }
        return false;
    }
}

Нормально, что у юзеров поле пароль хранится в открытом виде, как можно это реализовать по другому?


Как можно это оформить элегантно, красиво, удобно?
Спасибо.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.10.2013, 13:14
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
но не для всех файлов,
значит в виндовсе неправильно зарегано расширение mp3
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
запускается в неактивном окне, а надо что она активизировалась
это никак не сделать средствами java, так как другое приложение находится за пределами JVM и доступ к нему только через нативки
1
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
22.10.2013, 13:25
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
А как скрыть файл?
если я правильно понял - fileAttr
1
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.10.2013, 13:27
Цитата Сообщение от warloc69 Посмотреть сообщение
если я правильно понял - fileAttr
правильно но скрытым он будет только в виндах ) в юниксах нет понятия "скрытый" )
1
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
22.10.2013, 13:33
Цитата Сообщение от mutagen Посмотреть сообщение
в юниксах нет понятия "скрытый" )
В юниксах есть поянтие "хрен ты меня сгрепаешь "
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
22.10.2013, 15:57  [ТС]
Прогаю значит, никого не трогаю, тут эклипс начинает чудить, теперь свой код не могу свернуть вообще, т.е.
я делаю вот так
1. Ctrl + A
2. Ctrl+Shift+Numpud_divide

Ноль реакций, походу хватит на сегодня прогать

Добавлено через 8 минут
Решение
1. Windows
2. Preferences
3. Java
4. Editor
5. Folding
6. Поставить галочку в Enable folding
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
23.10.2013, 21:28
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Как вам вот этот код - говнокод?

Есть список(енум) возможных операций
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package ru.junior_progger.entity;
 
public enum Operation {
    Help, 
    DefaultPath, 
    ShowFiles,
    OpenFile,
    WriteToFile,
    ShowFileNames,
    ShowDirectoryNames,
    CreateFile,
    CreateDirectory,
    DeleteFile,
    DeleteDirectory,
    CopyFile,
    CopyDirectory,
    RenameFile,
    RenameDirectory,
    FindFile,
    FindDirectory,
    MoveFile,
    MoveDirectory,
    ShowSubDirectories,
    LookHiddenFiles,
    LookHiddenDirectories,
    HideDirectory,
    HideFile,
    Exit;
    
    public static Operation getValueOf(String text) {
        switch (text.toLowerCase()) {
        case "-1":
        case "?":
        case "/?":
        case "help":
            return Help;
        case "path":
        case "change default path":
        case "change path":
            return DefaultPath;
        case "files":
        case "show files":
        case "show all files":
            return ShowFiles;
        case "show file names":
        case "file names":
            return ShowFileNames;
        case "directory names":
        case "dir names":
        case "dirs":
            return ShowDirectoryNames;
        case "create file":
            return CreateFile;
        case "delete file":
            return DeleteFile;
        case "copy file":
            return CopyFile;
        case "rename file":
            return RenameFile;
        case "find file":
            return FindFile;
        case "move file":
            return MoveFile;
        case "show directories":
        case "show sub directories":
        case "directories":
            return ShowSubDirectories;
        case "create directory":
            return CreateDirectory;
        case "delete directory":
            return DeleteDirectory;
        case "copy directory":
            return CopyDirectory;
        case "find directory":
            return FindDirectory;
        case "rename directory":
            return RenameDirectory;
        case "move directory":
            return MoveDirectory;
        case "show hidden files":
            return LookHiddenFiles;
        case "show hidden directories":
            return LookHiddenDirectories;
        case "hide file":
            return HideFile;
        case "hide directory":
            return HideDirectory;
        case "open file":
            return OpenFile;
        case "write to file":
            return WriteToFile;         
        case "exit":
            return Exit;
        default:
            return null;
        }
    }
}


И есть класс Юзеров
Кликните здесь для просмотра всего текста

Общий класс предок
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package ru.junior_progger.entity;
 
public abstract class User {
    protected String name;
    protected String password;
    
    public User(){ 
        
    }
    public User(String name){
        this.name = name;
    }
    public User(String name, String password){
        this.name = name;
        this.password = password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
 
    
    public abstract boolean contains(Operation priv);
    public boolean checkPassword(String password){
        return this.password.equals(password);
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof User){
            User us = (User) obj;
            
            return us.name.equals(this.name) && us.password.equals(this.password);
        }
        return super.equals(obj);
    }
}

Класс Админ
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package ru.junior_progger.entity;
 
public class Administrator extends User {
    private static Operation[] privileges = initPrivileges();
    private static Operation[] initPrivileges() {
        return new Operation[] { 
                Operation.Help, Operation.DefaultPath,
                Operation.ShowDirectoryNames, Operation.ShowFiles,
                Operation.ShowFileNames, Operation.CreateFile,
                Operation.CreateDirectory, Operation.DeleteFile,
                Operation.DeleteDirectory, Operation.CopyFile,
                Operation.CopyDirectory, Operation.RenameFile,
                Operation.RenameDirectory, Operation.FindFile,
                Operation.FindDirectory, Operation.MoveFile,
                Operation.MoveDirectory, Operation.ShowSubDirectories,
                Operation.LookHiddenFiles, Operation.LookHiddenDirectories,
                Operation.HideDirectory, Operation.OpenFile,
                Operation.WriteToFile, Operation.HideFile, Operation.Exit };
    }
    
    public Administrator(String name){
        this.name = name;
    }
    public Administrator(String name, String password){
        this.name = name;
        this.password = password;
    }
 
    @Override
    public String toString() {
        return "Admin: " + this.name;
    }
    
    public Operation[] getPrivileges() {
        return Administrator.privileges;
    }
 
    @Override
    public boolean contains(Operation oper) {
        for (Operation privilege : Administrator.privileges) {
            if(privilege == oper)
                return true;
        }
        return false;
    }
}


И обычный юзер
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package ru.junior_progger.entity;
 
public class DefaultUser extends User{
    private static Operation[] Operations = initOperations();
    private static Operation[] initOperations() {
        return new Operation[] { 
                Operation.ShowFileNames, Operation.ShowSubDirectories,
                Operation.ShowDirectoryNames,
                Operation.CreateFile, Operation.CreateDirectory, 
                Operation.FindFile, Operation.FindDirectory, 
                Operation.MoveFile, Operation.MoveDirectory, 
                Operation.CopyFile, Operation.CopyDirectory,
                Operation.Help,  Operation.DefaultPath,
                Operation.Exit, Operation.ShowFiles,
                Operation.OpenFile
        };
                
    }
    
    public DefaultUser(String name){
        this.name = name;
    }
    public DefaultUser(String name, String password){
        this.name = name;
        this.password = password;
    }
 
    @Override
    public String toString() {
        return "Default user: " + this.name;
    }
    
    public Operation[] getOperations() {
        return DefaultUser.Operations;
    }
 
    @Override
    public boolean contains(Operation oper) {
        for (Operation Operation : DefaultUser.Operations) {
            if(Operation == oper)
                return true;
        }
        return false;
    }
}

Нормально, что у юзеров поле пароль хранится в открытом виде, как можно это реализовать по другому?


Как можно это оформить элегантно, красиво, удобно?
Спасибо.
А админ не является Юзером? Не проще было бы а базовый класс юзер запихнуть переменную типа "priority" и в хандлере (в том методе где вы обрабатываете запросы) проверять это только 1 РАЗ это приоритет! Кода уменьшилось бы 3 раза )

Добавлено через 2 минуты
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Суть: написать-реализовать: Приложение для работы с файлами с функциональностью Проводника Windows или Total Commander с кучей рекомендаций.
Зачем тут ЭТО?
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Сетевые средства
5. Многопоточный сервер (модель клиент-сервер)
6. База данных (Data base)
7. Веб-приложение (Web-application)
8. J2EE-приложение
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
23.10.2013, 21:38  [ТС]
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
А админ не является Юзером? Не проще было бы а базовый класс юзер запихнуть переменную типа "priority" и в хандлере (в том методе где вы обрабатываете запросы) проверять это только 1 РАЗ это приоритет! Кода уменьшилось бы 3 раза )
- он является юзером, я павильно понимаю ситуацию: админа можно было б унаследовать от DefaultUser'a?

Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
Сетевые средства
5. Многопоточный сервер (модель клиент-сервер)
6. База данных (Data base)
7. Веб-приложение (Web-application)
8. J2EE-приложение
Пока сам не понимаю)))
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
23.10.2013, 21:49
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
- он является юзером, я павильно понимаю ситуацию: админа можно было б унаследовать от DefaultUser'a?
Конечно ! Хоть такая архитектура будет иметь побочный эффект:

1. У простых юзеров могут быть методы которые предназначены Админам, но админ как бы тоже юзер и проверять каждого юзер или нет нету смысла, мы просто 1 раз проверяем приорити текущего клиента , и принимаем решения разрешить этому клиенту выполнить эту операцию или нет.

А если вы захотите добавить например Модератора ? Или наблюдателя какого нить ? Опять новый класс?

А так мы можем просто для каждого определить его приоритет (например 1 - User, 2 - Moderator, 3 - Admin) ,
а также если в вашем приложении нужно будет хранить эти акки в базе то просто создаем в базе столбец priority и ВСЕ )
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
23.10.2013, 21:53  [ТС]
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
А если вы захотите добавить например Модератора ? Или наблюдателя какого нить ? Опять новый класс?
Почему то мне так и казалось. Да, здесь надо тогда "осознать" этот момент.
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
23.10.2013, 22:06
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
public class Administrator extends User {
* * private static Operation[] privileges = initPrivileges();
* * private static Operation[] initPrivileges() {
* * * * return new Operation[] {
* * * * * * * * Operation.Help, Operation.DefaultPath,
* * * * * * * * Operation.ShowFiles, Operation.ShowFileNames,
* * * * * * * * Operation.CreateFile, Operation.CreateDirectory,
* * * * * * * * Operation.DeleteFile, Operation.DeleteDirectory,
* * * * * * * * Operation.CopyFile, Operation.CopyDirectory,
* * * * * * * * Operation.RenameFile, Operation.RenameDirectory,
* * * * * * * * Operation.FindFile, Operation.FindDirectory,
* * * * * * * * Operation.MoveFile, Operation.MoveDirectory,
* * * * * * * * Operation.ShowSubDirectories, Operation.LookHiddenFiles,
* * * * * * * * Operation.LookHiddenDirectories, Operation.HideDirectory,
* * * * * * * * Operation.OpenFile, Operation.WriteToFile,
* * * * * * * * Operation.HideFile, Operation.Exit };
* * }
Афигеть... WTF??

Добавлено через 7 минут
Используйте функциональные объекты (объекты запросы (команда + шаблонный метод)) для реализации ваших "Operation". Java всё-таки ООП язык )
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
24.10.2013, 01:59  [ТС]
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
Используйте функциональные объекты (объекты запросы (команда + шаблонный метод)) для реализации ваших "Operation". Java всё-таки ООП язык )
С этого места поподробнее

Добавлено через 1 час 3 минуты
Рассматривали с куратором этот проЭкт, и вот что решили:

1. Базовая идея - не была понята мною с самого начала.
2. Необходимо создавать свои сущности File, Folder.
3. Неправильно реализован шаблон DAO.

Итого: К сожалению, придется переписывать существенную часть кода
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
24.10.2013, 06:07
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
С этого места поподробнее

Добавлено через 1 час 3 минуты
Рассматривали с куратором этот проЭкт, и вот что решили:

1. Базовая идея - не была понята мною с самого начала.
2. Необходимо создавать свои сущности File, Folder.
3. Неправильно реализован шаблон DAO.

Итого: К сожалению, придется переписывать существенную часть кода
Я уже писал типа такого (Virtual File Manager Server) , как приду с колледжа залью.
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
24.10.2013, 06:13  [ТС]
И все же. Я вот сейчас уже 5-ый час бьюсь: читаю, слушаю, смотрю про паттерн DAO, так и не понимаю как его реализовать правильно. Поправьте, пожалуйста, если где-то я ошибаюсь

Итак, у нас есть некая абстракция, которая управляет работой с некоторыми данными - это будет главным звеном DAO - назавем его DAOManager. У этого класса будет поле-интрефейс IDAOExecutor, которому все поступающие запросы к DAOManager'a транслируются, т.е. перенаправляются. В частности, что нам это дает?
Мы можем у этого DAOManager поменять поле IDAOExecutor, который допустим может работать с БД, или же поменять на реализацию с работой в файловой системе, засчет чего мы получаем некую гибкость.

Я правильно понимаю суть этого паттерна?

Добавлено через 5 минут

Не по теме:

Сегодня, 06:07
Сегодня, 06:08 [ТС]
- я вот пятой точкой чувствую, что мне написали :)

0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
24.10.2013, 06:54
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
И все же. Я вот сейчас уже 5-ый час бьюсь: читаю, слушаю, смотрю про паттерн DAO, так и не понимаю как его реализовать правильно. Поправьте, пожалуйста, если где-то я ошибаюсь

Итак, у нас есть некая абстракция, которая управляет работой с некоторыми данными - это будет главным звеном DAO - назавем его DAOManager. У этого класса будет поле-интрефейс IDAOExecutor, которому все поступающие запросы к DAOManager'a транслируются, т.е. перенаправляются. В частности, что нам это дает?
Мы можем у этого DAOManager поменять поле IDAOExecutor, который допустим может работать с БД, или же поменять на реализацию с работой в файловой системе, засчет чего мы получаем некую гибкость.

Я правильно понимаю суть этого паттерна?

Добавлено через 5 минут

Не по теме:



- я вот пятой точкой чувствую, что мне написали :)

Я не совсем понял, вам нужно что бы вместо бд были файлы ? Или что бы вы имитировали бд? Тогда зачем писать свой класс File? Мб вам нужно эти файлы хранить в памяти ,а не на жёстком диске ?
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
24.10.2013, 13:54  [ТС]
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
Мб вам нужно эти файлы хранить в памяти ,а не на жёстком диске ?
- да.
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
вам нужно что бы вместо бд были файлы
- свои File, Folder.
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Приложение для работы с файлами с функциональностью Проводника Windows или Total Commander
- поэтому здесь нужны свои сущности.
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
24.10.2013, 17:56
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
File, Folder.
Folder и File не получится , так как и в UNIX системах и в Джаве нету разницы между File и Dir.
Для него используется паттерн "компоновщик" , то есть в данном случае Folder это узел , а File это лист.
У этого паттерна есть побочные эффекты (лишние методы ,которые например не могут быть у объекта File (например addNewFile) , но они решаймы)

Поэтому вам понадобится булево поле типа isFile и проверять его при создании новых объектов.

Добавлено через 7 минут
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
package core.systems;
 
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
 
 
/*
 * Author Gundarev Aleksey
 * Last fix : 07.10.2013 by 3jIo
 * 
 *Описание класса:
 *
 *Ядро программы , которое обеспечивает взаимодействие с файлами в 
 *Virtual File System. Различие между файлом и папкой (листом и узлом)
 *в том что папка может содеражать другие папки и файлы (листы или узлы) и тд.
 *Дял создания объекта типа File нужно воспользоваться методом  createFile или
 *createDir который принимают 2 параметра:
 *String name : Имя папки/файла (узла/листа)
 *File parent : Родитель папки/файла (это может быть каталог или дочерняя папка в какой-то иерархии,
 *если родителя нету (parent == null) , то это означает что мы создаем каталог.)
 *
 *
 *Используемый паттер :
 * Компоновщик
 *
 *Потоко безопастный класс (все методы синхронизированны)
 */
 
 
public class File extends Dir implements Comparable<File>
{
    private volatile String name;
    private List<File> contents;
    private volatile File parent;
    private boolean isFile;
    private Date createDate;
    private static SimpleDateFormat format = new SimpleDateFormat();
    private List<String> blockedList = new ArrayList<String>();
    private static Pattern fileCheck = Pattern.compile("[\\\\/:*?\"<>|]+");  //("[A_Za-z0-9_!~=+-.]+\\.[A_Za-z0-9_!~=+-]+");
    
    
    public List<String> getBlockedList()
    {
        return blockedList;
    }
    
    
    public static void main (String [] args)
    {
        
        /*
        Matcher match = fileCheck.matcher("fi.le.cpp");
        System.out.println(match.matches());
        
        
        List<File> list = new ArrayList<File>();
        
        for(int i = 10; i > 0; i--)
        {
            list.add(new File("Test " + i, true,null));
        }
        
        for(int i = 20; i > 10; i--)
        {
            list.add(new File("Test " + i, false,null));
        }
        
        System.out.println("Before sort: ");
        
        for(int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));
        }
        
        System.out.println("After sort: ");
        Collections.sort(list);
        
        for(int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));
        }
        */
        
        
        
        
        Pattern patt = Pattern.compile("^.:");
        Matcher match = patt.matcher("c:\\test");
        System.out.println(match.find());
        
        /*
        ------
        Catalogue catalogue = Catalogue.newCatalog("C:");
        
        //catalogue.newFile("operation.txt");
        //catalogue.newFile("localFile.cpp");
        //catalogue.newFile("javaFile.java");
        //catalogue.newFile("cppFile.h");
        
        boolean bol = catalogue.newDir("MyFiles");
        
        if(!bol)
        {
            System.out.println("Trouble");
            
            System.exit(111);
        }
        //catalogue.newDir("temp");
        //catalogue.newDir("LikeThis");
        
        catalogue.getFile("MyFiles").newFile("Test1.txt");
        catalogue.getFile("MyFiles").newFile("Test2.txt");
        catalogue.getFile("MyFiles").newFile("Test3.txt");
        catalogue.getFile("MyFiles").newDir("TestDir");
        
        catalogue.getFile("MyFiles").getFile("TestDir").newFile("MyFile.txt");
        catalogue.getFile("MyFiles").getFile("TestDir").newFile("MyFile2.txt");
        
        
        catalogue.getFile("MyFiles").getFile("TestDir").getFile("MyFile.txt").lockFile("System");
        catalogue.getFile("MyFiles").getFile("Test3.txt").lockFile("I am");
        
        System.out.println(catalogue.showTree());
        */
 
        
    }
    
    public static boolean checkFileName(String name)
    {
        Matcher match = fileCheck.matcher(name);
        
        if(match.find())
        {
            return false;
        }
        
        return true;
    }
    
    
    public String getAbsolutePath()
    {
        List<String> temp = new ArrayList<String>(3);
        temp.add(getName());
        
        File file = getParent();
        
        if(file != null)
        {
            temp.add(file.getName());
            
            while(((file = file.getParent()) != null))
            {
                temp.add(file.getName());
            }
            
            Collections.reverse(temp);
            
            StringBuilder builder = new StringBuilder();
            
            Iterator<String> iter = temp.iterator();
            
            while(iter.hasNext())
            {
                builder.append(iter.next()).
                append("\\");
            }
            
            return builder.toString();
        }
        
        //Каталог, парентов нету
        return temp.get(0);
    }
    
    @SuppressWarnings("unused")
    private Object sortHelper(Object [] obj)
    {
        Object [] temp = new Object[obj.length];
        
        for(int i = obj.length - 1, j = 0;  j < obj.length || i > 0;  j++, i--)
        {
            temp[j] = obj[i];
        }
        
        return temp;
    }
    
    
    //Возвращает кол-во всех элементов в иерархии
    public int treeLength()
    {
        File file = getParent();
        
        if(file != null)
        {
            //Текущий объект + парент = 2;
            int size = 2;
            
            for( ; ((file = file.getParent()) != null); size++);
            
            return size;
        }
        
        //Каталог, предков нету.
        return 1;
    }
    
    
    //Блокирует файл по имени
    //Thread safe
    public boolean lockFile(String blockerName)
    {
        synchronized (blockedList) 
        {
            Iterator<String> iter = blockedList.iterator();
            
            while(iter.hasNext())
            {
                //Не допускаем деад-локов
                if(iter.next().equals(blockerName))
                {
                    return false;
                }
            }
            blockedList.add(blockerName);
        }
        return true;
    }
    
    //разблокировка файла 
    //PS Папки может блокировать только Systems или же если имеются вложенные блок. файлы (как указанно заказчиком)
    public boolean unlockFile(String blockerName)
    {
        synchronized (blockedList)
        {
            return blockedList.remove(blockerName);
        }
    }
    
    //Возвращает true если имеються заблокированные файлы 
    //или текущий файл кем-то заблокирован
    public boolean isBlocked()
    {
        synchronized (blockedList) 
        {
            return !blockedList.isEmpty();
        }
    }
    
    
    public static File createFile(String name,File back)
    {
        
        if(checkFileName(name))
        {
            return new File(name,true,back);    
        }
        
        return null;
        
    }
    
    public static File createDir(String name,File back)
    {
        
        if(checkFileName(name))
        {
            return new File(name,false,back);   
        }
        
        return null;
    }
    
    
    protected File(String name,boolean isFile,File back)
    {
        setName(name);
        this.isFile = isFile;
        createDate = new Date();
        this.parent = back;
        
        if(!isFile)
        {
            contents = new LinkedList<File>();
        }
    }
    
    public void setParent(File file)
    {
        this.parent = file;
    }
    
    public boolean isFile()
    {
        return isFile;
    }
    
    public boolean isDir()
    {
        return !isFile;
    }
    
    private boolean addFile(String name,boolean isFile)
    {
            //Если Текущий объект папка
            if(isDir())
            {
                synchronized (contents)
                {
                    for(int i = 0; i < contents.size(); i++)
                    {
                        if(contents.get(i).getName().equalsIgnoreCase(name))
                        {
                            return false;
                        }
                    }
 
                    contents.add(new File(name,isFile,this));
                    //Так как операций на чтение больше. (Можно использовать дерево)
                    Collections.sort(contents);
                }
                return true;
            }
    
        return false;
    }
    
    public boolean newFile(String name)
    {
        return addFile(name, true);
    }
    
    public boolean newDir(String name)
    {
        return addFile(name, false);
    }
    
    private ReentrantReadWriteLock nameLock = new ReentrantReadWriteLock();
    private Lock writeLock = nameLock.writeLock();
    private Lock readLock = nameLock.readLock();
    
    public String getName()
    {
        readLock.lock();
        
        try
        {
            return name;
        }
        finally
        {
            readLock.unlock();
        }
        
    }
    
    private void setName(String name)
    {
        writeLock.lock();
        
        try
        {
            this.name = name;
        }
        finally
        {
            writeLock.unlock();
        }
        
    }
    
    public boolean rename(String name)
    {
        Matcher match = fileCheck.matcher(name);
        
        if(match.matches())
        {
            if(!isBlocked())
            {
                setName(name);
                
                return true;
            }
            
        }
        
        return false;
    }
    
    public String createDate()
    {
        return format.format(createDate);
    }
 
 
    @Override
    public int compareTo(File o) 
    {
        if(isFile && o.isFile)
        {
            return getName().compareTo(o.getName());
        }
        
        return isFile ? 1 : -1;
    }
    
    public String showContents()
    {
        if(isDir())
        {
            if(!isEmpty())
            {
                StringBuilder builder = new StringBuilder();
                
                synchronized (contents)
                {
                    //Collections.sort(contents);
                    Iterator<File> iter = contents.iterator();
                
                    while(iter.hasNext())
                    {
                        builder.append(iter.next());
                    }
                
                    return builder.toString();
                }
            }
            
            return "empty";
        }
        
        return null;
    }
    
    
    public List<File> getContents()
    {
        return contents;
    }
    
    /*
     * Возвращает файл по имени
     * если такого файла нету возврашает null
     */
    public File getFile(String name)
    {
        if(!contents.isEmpty())
        {
            synchronized (contents)
            {
                Iterator<File> iter = contents.iterator();
                File file;
                
                while(iter.hasNext())
                {
                    file = iter.next();
                    
                    if(file.getName().equalsIgnoreCase(name))
                    {
                        return file;
                    }
                }
            }
 
        }
        
        return null;
    }
 
    
    @Override
    public String toString() 
    {
        StringBuilder builder = new StringBuilder();
        
        builder.append(getName()).append("\t").append(isFile ? "File" : "Dir")
        .append("\t").append(createDate());
        
        return builder.toString();
    }
    
    public File getParent()
    {
        return parent;
    }
    
    
    //Используется при перемещение файлов
    public boolean add(File file)
    {
        if(isDir())
        {
            File fl = file.getParent();
            
            //Только у каталогов парент == null
            //Поэтому собственно мы не можем его добавить в другую директорию
                if(fl != null)
                {       
                    //Проверяем нужно ли переименновать файл
                    tryRename(file, this);
                    
                    synchronized (contents) 
                    {
                        if(contents.add(file))
                        {
                            fl.delete(file);
                            
                            file.setParent(this);
                            
                            return true;
                        }
                    }
                }
        }
        
        return false;
    }
    
    public boolean checkRename(File in,File out)
    {
        if(in == null || out == null)
        {
            return false;
        }
        
        return checkRename(in.getName(), out);
    }
    
    public boolean checkRename(String in,File out)
    {
        if(!out.isEmpty() && out.isDir())
        {
            synchronized (out.contents) 
            {
                Iterator<File> iter = out.contents.iterator();
                
                while(iter.hasNext())
                {
                    if(in.equalsIgnoreCase(iter.next().getName()))
                    {
                        return true;
                    }
                }
            }
        }
        
        return false;
    }
    
    
    public void tryRename(File in,File out)
    {
        int tr = 1;
        while(checkRename(in,out))
        {
            in.setName(in.getName() + "_COPY(" + tr++ + ")");
        }
        
    }
 
    //Копирование реализованно рекурсией
    //System -- Система имя запрещенное для использования
    @Override
    public File clone() throws CloneNotSupportedException 
    {
        File file;
        
        lockFile("System");
        
        try
        {
            if(isFile())
            {
                file = new File(name, isFile, parent);
                file.blockedList = new ArrayList<String>();
                file.createDate = (Date) createDate.clone();
                return file;
            }
            else
            {
                return copyHelper(this);
            }
            
        }finally
        {
            unlockFile("System");
        }
    }
    
    //Fixed 3jIo (05.10.2013) : метод удалял оригинал
    //Вспомогательный метод для clone образующий рекурсию
    //Thread safe
    private File copyHelper(File file) throws CloneNotSupportedException
    {
        File fl = null;
        
        if(file.isDir())
        {
            fl = new File(file.getName(),false,file.parent);
            fl.createDate = (Date) file.createDate.clone();
            List<File> temp = file.contents;
            fl.contents = new ArrayList<File>(temp.size());
            fl.blockedList = new ArrayList<String>();
            
            synchronized (temp) 
            {
                Iterator<File> iter = temp.iterator();
                File tmp;
                
                while(iter.hasNext())
                {
                    tmp = iter.next().clone();
                    tmp.setParent(fl);
                    fl.contents.add(tmp);
                }
            }
            
        }
        
        return fl;
    }
    
    //Вешать блокировку на папку может только система или содеражищиеся файлы
    /*
     * Метод запускает рекурсивный метод который проверяет есть ли заблокированные
     * потомки 
     * Если вызван для файла то просто вызращает результат метода isBlocked файла
     * тоже самое и для пустой папки , так как она все равно может быть заблокированна
     */
    public boolean checkBlockedDir()
    {
        if(isDir() && !isBlocked())
        {
            return checkBlockedHelper(this);
        }
        
        return isBlocked();
    }
    
    public boolean checkBlockedDir(File file)
    {
        if(file.isDir() && !file.isBlocked())
        {
            return checkBlockedHelper(file);
        }
        
        return file.isBlocked();
    }
    
    //Рекурсивный метод проходящий по всем вложенным файлам
    //Возвращает true если есть заблокированные файлы
    //Папка может быть заблокированна системой или же если её кто-то использует или просматривает
    //то папку нельзя удалить, иначе возникнут коллизии и баги.
    
    private boolean checkBlockedHelper(File file)
    {
        if(file.isDir() && !file.isBlocked())
        {
            synchronized (file.getContents())
            {
                Iterator<File> iter = file.getContents().iterator();
                
                while(iter.hasNext())
                {
                    if(checkBlockedHelper(iter.next()))
                    {
                        return true;
                    }
                }
            }
            
            return false;
        }
       return file.isBlocked();
    }
    
    //Удаляет из contents ссылку,если есть вложенные заблокированные файлы 
    //То возвращает false
    //Thread Safe
    public boolean delete(File file)
    {
        if(!checkBlockedDir(file))
        {
            synchronized (contents) 
            {
                return contents.remove(file);
            }
        }
 
        return false;
    }
    
    
    
    //Удаляет из contents ссылку объекта, поле this.name которого ровна name
    public boolean delete(String name)
    {
        synchronized (contents)
        {
            Iterator<File> iter = contents.iterator();
            File file;
        
            while(iter.hasNext())
            {
                file = iter.next();
            
                if(file.getName().equalsIgnoreCase(name) && !file.checkBlockedDir())
                {
                    iter.remove();
                    return true;
                }
            }
        }
        
        return false;
    
    }
    
    //Вспомогательный метод который сообщает есть ли 
    // содержатся ли другие файлы в папке
    //Если текущий объект не папка то false
    public boolean isEmpty()
    {
        if(isDir())
        {
            synchronized (contents) 
            {
                return contents.isEmpty();
            }
        }
        
        return false;
    }
    
        
    /*
     * Проверяет не находится ли parent
     * выше по иерархии текущего файла
     * возвращает true если parent является 
     * предком текущего файла
     */
    
    public boolean checkParent(File parent)
    {
        return checkParent(this, parent);
    }
    
    /*
     * Проверяет не находится ли parent
     * выше по иерархии child.
     * возвращает true если parent является
     * предком child
     */
    
    public static boolean checkParent(File child,File parent)
    {
        if(child != null && parent != null)
        {
            synchronized (child) 
            {
                if(parent != child)
                {
                    return checkParent(child.getParent(), parent);
                }
            }
            
            return true;
        }   
        return false;
    }
    
}


Добавлено через 1 час 11 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//Удаляет из contents ссылку объекта, поле this.name которого ровна name
    //fixed by 3jIo : Оптимизировал
    public boolean delete(String name)
    {
        synchronized (contents)
        {
            Iterator<File> iter = contents.iterator();
            File file;
        
            while(iter.hasNext())
            {
                file = iter.next();
            
                if(file.getName().equalsIgnoreCase(name))
                {
                    //Были лишние итерации.
                    if(!file.checkBlockedDir())
                    {
                        iter.remove();
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }
        
        return false;
    
    }
Добавлено через 1 минуту
И да extends Dir можно убрать.

Добавлено через 8 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
     * Возвращает файл по имени
     * если такого файла нету возврашает null
     * fixed by 3jIo : Проверку на Dir забыл
     */
    public File getFile(String name)
    {
        if(isDir())
        {
            if(!contents.isEmpty())
            {
                synchronized (contents)
                {
                    Iterator<File> iter = contents.iterator();
                    File file;
                    
                    while(iter.hasNext())
                    {
                        file = iter.next();
                        
                        if(file.getName().equalsIgnoreCase(name))
                        {
                            return file;
                        }
                    }
                }
 
            }
        }
        return null;
    }
1
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
24.10.2013, 20:17
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
так как и в UNIX системах и в Джаве нету разницы между File и Dir
тоесть не будет разницы применяю я less к фолдеру или файлу ?

less foldername == less filename так получается ?
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
24.10.2013, 20:35
Цитата Сообщение от warloc69 Посмотреть сообщение
less foldername == less filename так получается ?
То наверно получится так:

Java
1
2
3
4
5
6
7
8
if(isDir)
{
   return showDirInfo();
}
else 
{
  return showFilecontents()
}
0
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
27.10.2013, 01:27  [ТС]
Итак вопрос: как создать "глубокую" копию объекта? Или почему у меня этот Generic не работает?

Java
1
2
3
4
5
6
7
8
9
10
11
12
    private <T extends AbstractFile> T getCopy(T obj){
        if(obj == null)
            return null;
        
        String name = String.valueOf(obj.getName().toCharArray());
        Date date = (Date) obj.getCreateDate().clone();
        // Клонирование объекта - я хз как его делать?
        // Нашел вот такое решение
        User autor = new User(obj.getAutor());
        // Ошибка! - почему? (ведь у AbstractFile  же есть конструктор соответствующий.
        return new T(name, autor, date);
    }
Добавлено через 1 час 17 минут
Есть такие сущности AbstractFile, File, и Folder(List<AbstractFile> files), причем две последние унаследованы от AbstractFile. Далее Folder может у себя хранить как File так и другие подпапки:

1. Уже целый час бьюсь не могу написать рекурсивный поиск файла или папки, т.е. вот такой код : но я подаю по StackOverflowException e
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
             public boolean exists(File file, Folder folder) {
        // Если файл существует в root каталоге
        File[] files = this.getFiles(folder);
        for (File f : files) {
            if(f.equals(file))
                return true;
        }
        // Если файла нету в текущем каталоге, то ищем в подкаталогах
        Folder[] folders = this.getDirectories(folder);
        if(folders != null && folders.length != 0)
            for (Folder f : folders) {
                if(exists(file, f))
                    return true;
            }
        return false;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.10.2013, 01:27

Выбор решения для проекта! Приложение для Windows + приложение для Android или Web приложение?
Здравствуйте! Один мой знакомый, владелец мебельной фирмы, обратился ко мне с серьезным предложением. Ему необходимо разработать...

Написать пакет классов для работы с деловой графикой, предназначенный для работы в среде Windows
Написать пакет классовдля работы с деловой графикой, предназначенный для работы в среде Windows. Предусмотреть наличие в пакете классы для...

почему-то в папке windows вместе с системными файлами, находится папка windows с теми же файлами! Копия, короче
Ребята, а у меня почему-то в папке windows вместе с системными файлами, находится папка windows с теми же файлами! Копия, короче. И весит...

Web приложение для управления файлами
Всем привет. В языке Java немного разбираюсь. Подскажите, у кого опыта в этом деле гораздо больше, с чего начать писать данное приложение?...

Как создать windows forms приложение с возможностью работы с win32?
Значит смысл примерно такой. Хочу создать Windows Forms приложении на C++. Это я делать умею. Все получилось. Проблема в том, что мне по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru