Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Много-файловое хранилище Java объектов в формате xml (часть 2)

Anna | 5.06.2014 | нет комментариев

От того что прошло много времени и библиотека изменилась, то решил продолжить изложение и осветить некоторые моменты. Большое спасибо пользователям за конструктивную критику, которая верю помогла повысить usability.
Первое, что хотелось бы подметить, так это то, что из основного фасадного класса XmlDataStore была убрана группа способов для работы с root объектами. Сейчас распределение объектов на корневые и остальные отсутствует.

Интерфейс IXmlDataStoreIdentifiable

От того что, при обсуждении первой версии было верно замечено, что способы getId() и setId() могут быть использованы разработчиками модели данных в каких-то своих целях и необязательно они будут трудиться с типом java.lang.String, то наименование способов изменилось на getDataStoreId() и setDataStoreId(). И интерфейс соответственно выглядит дальнейшим образом:

public interface IXmlDataStoreIdentifiable {
	String getDataStoreId();
	void setDataStoreId(String dataStoreId);
}

Также был добавлен отвлеченный класс, реализующий данный интерфейс:

public abstract class AbstractXmlDataStoreIdentifiable
		implements IXmlDataStoreIdentifiable {

	private String	dataStoreId;
	@Override
	public String getDataStoreId() {
		return dataStoreId;
	}
	@Override
	public void setDataStoreId(final String dataStoreId) {
		this.dataStoreId = dataStoreId;
	}
}

Наследоваться дозволено как от интерфейса, так и от абстрактного класса.

Формат файлов

В библиотеку введена вероятность сменить формат файлов объектов на всякий иной. Это делается с поддержкой фабрики, которая должна предоставлять writer и reader.

public interface IXmlDataStoreIOFactory {
	IXmlDataStoreObjectsReader newInstanceReader(
	        Map<Class<? extends IXmlDataStoreIdentifiable>, XmlDataStorePolicy> policies);
	IXmlDataStoreObjectsWriter newInstanceWriter(
	        Map<Class<? extends IXmlDataStoreIdentifiable>, XmlDataStorePolicy> policies);
}

Отлично видно, что параметром всякого из способов является мапа политик хранения, Дабы реализации writer-а и reader-а могли определять тип хранения объекта и сберегать отдельные из объектов как примитивные ссылки. Интерфейсы выглядят дальнейшим образом:

public interface IXmlDataStoreObjectsWriter {
	void writeReferences(Writer writer, Collection<IXmlDataStoreIdentifiable> references)
	        throws XmlDataStoreIOException;
	void writeObjects(Writer writer, Collection<IXmlDataStoreIdentifiable> objects)
	        throws XmlDataStoreIOException;
}

Класс writer должен реализовать два способа:
1) способ для сериализации ссылок writeReferences();
2) способ для сериализации объектов writeObjects().
Причем в случае происхождения каких-либо ошибок в ходе выполнения этих способов они обязаны выбрасывать исключение типа XmlDataStoreIOException.

public interface IXmlDataStoreObjectsReader {
	Collection<IXmlDataStoreIdentifiable> readReferences(Reader reader)
	        throws XmlDataStoreIOException;
	Collection<IXmlDataStoreIdentifiable> readObjects(Reader reader)
	        throws XmlDataStoreIOException;
}

Интерфейс reader-а симметричен и определяет способы для десериализации ссылок и объектов.

Выборка объектов по различным полям

От того что в первой версии не предоставлялась вероятность выборки объектов по разным полям, то эта вероятность была реализована в больше поздних версиях посредством интерфейса IXmlDataStorePredicate.

public interface IXmlDataStorePredicate<T extends IXmlDataStoreIdentifiable> {
	boolean passed(final T object);
}

Способ passed() должен возвращать true если объект должен быть включен в результирующую выборку. А в классе XmlDataStore реализован дальнейший способ:

public <T extends IXmlDataStoreIdentifiable> Map<String, T> loadObjects(
	final Class<T> cl, final IXmlDataStorePredicate<T> predicate) throws XmlDataStoreReadException

Фрагментация

Как теснее говорилось в предыдущей статье: «фрагментация подразумевает под собой разбиение одного файла (политика ClassObjectsFile) на фрагменты, содержащие ограниченное число объектов, а индекс в данном случае будет содержать ссылки с указанием файла фрагмента, в котором сохранен объект».

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB