Класс AbstractDocument
- Все реализуемые интерфейсы:
Serializable, Document
- Прямые известные подклассы:
DefaultStyledDocument, PlainDocument
public abstract class AbstractDocument extends Object implements Document, Serializable
Этот класс реализует механизм блокировки документа. Он допускает нескольких читателей или одного писателя; писатели должны дождаться уведомления всех наблюдателей документа о предыдущем изменении, прежде чем начинать новое изменение документа. Блокировка чтения захватывается и освобождается с помощью метода render. Блокировка записи захватывается методами, изменяющими документ, и удерживается на протяжении всего вызова метода. Уведомление выполняется в потоке, вызвавшем изменение, и на время уведомления этот поток получает полный доступ к чтению документа, однако другие читатели не допускаются до завершения уведомления. Уведомление представляет собой событие beans, которое не допускает дальнейших изменений, пока не будут уведомлены все слушатели.
Любые модели, унаследованные от этого класса и используемые вместе с текстовым компонентом, реализация внешнего вида которого является производной от BasicTextUI, можно безопасно обновлять асинхронно, поскольку BasicTextUI сериализует весь доступ к иерархии View, если документ имеет тип AbstractDocument. Блокировка предполагает, что независимый поток будет обращаться к иерархии View только из методов DocumentListener и что одновременно будет активен только один поток событий.
Если требуется поддержка параллелизма, следует учитывать следующие дополнительные условия. Путь выполнения кода любой реализации DocumentListener и любой реализации UndoListener должен быть потокобезопасным и не должен обращаться к блокировке компонента, если требуется избежать взаимных блокировок. Методы repaint и revalidate класса JComponent являются потокобезопасными.
AbstractDocument моделирует неявный разрыв в конце документа. Помимо прочего, это позволяет разместить каретку после последнего символа. В результате getLength возвращает значение на единицу меньше длины Content. Если вы создаёте собственный Content, обязательно инициализируйте его дополнительным символом. Примеры этого см. в StringContent и GapContent. Ещё одно следствие заключается в том, что элементы, моделирующие неявный конечный символ, будут иметь endOffset == (getLength() + 1). Например, в DefaultStyledDocument это getParagraphElement(getLength()).getEndOffset() == getLength() + 1
.
Предупреждение: сериализованные объекты этого класса не будут совместимы с будущими выпусками Swing. Текущая поддержка сериализации предназначена для кратковременного хранения или RMI между приложениями, работающими с одной и той же версией Swing. Начиная с версии 1.4 в пакете java.beans добавлена поддержка долговременного хранения всех JavaBeans. См. XMLEncoder.
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
class |
AbstractDocument.AbstractElement |
Реализует абстрактную часть элемента. |
static interface |
AbstractDocument.AttributeContext |
Интерфейс, позволяющий реализациям MutableAttributeSet использовать подключаемые методы сжатия атрибутов. |
class |
AbstractDocument.BranchElement |
Реализует составной элемент, содержащий другие элементы. |
static interface |
AbstractDocument.Content |
Интерфейс для описания последовательности символьного содержимого, которое можно редактировать. |
class |
AbstractDocument.DefaultDocumentEvent |
Сохраняет изменения документа по мере его изменения. |
static class |
AbstractDocument.ElementEdit |
Реализация ElementChange, которую можно добавить в событие документа. |
class |
AbstractDocument.LeafElement |
Реализует элемент, непосредственно представляющий содержимое некоторого вида. |
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
protected static final String |
BAD_LOCATION |
Сообщение об ошибке, указывающее на недопустимую позицию. |
static final String |
BidiElementName |
Имя элементов, используемых для хранения однонаправленного фрагмента |
static final String |
ContentElementName |
Имя элементов, используемых для представления содержимого |
static final String |
ElementNameAttribute |
Имя атрибута, используемого для указания имён элементов. |
protected EventListenerList |
listenerList |
Список слушателей событий документа. |
static final String |
ParagraphElementName |
Имя элементов, используемых для представления абзацев |
static final String |
SectionElementName |
Имя элементов, используемых для хранения разделов (строк/абзацев). |
Поля, объявленные в интерфейсе Document
StreamDescriptionProperty, TitleProperty | Модификатор и тип | Поле | Описание |
|---|---|---|
static final String |
StreamDescriptionProperty |
Имя свойства, содержащего описание потока, использованного для инициализации документа. |
static final String |
TitleProperty |
Имя свойства, содержащего заголовок документа, если он есть. |
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Создаёт новый AbstractDocument, использующий указанный механизм хранения содержимого. |
|
protected |
Создаёт новый AbstractDocument, использующий указанный механизм хранения содержимого. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
addDocumentListener |
Добавляет слушателя документа для уведомления о любых изменениях. |
void |
addUndoableEditListener |
Добавляет слушателя отмены действий для уведомления о любых изменениях. |
protected Element |
createBranchElement |
Создаёт ветвевой элемент документа, который может содержать другие элементы. |
protected Element |
createLeafElement |
Создаёт листовой элемент документа. |
Position |
createPosition |
Возвращает позицию, которая будет отслеживать изменения документа. |
void |
dump |
Выводит диагностические данные. |
protected void |
fireChangedUpdate |
Уведомляет всех слушателей, зарегистрировавших интерес к уведомлениям о событиях этого типа. |
protected void |
fireInsertUpdate |
Уведомляет всех слушателей, зарегистрировавших интерес к уведомлениям о событиях этого типа. |
protected void |
fireRemoveUpdate |
Уведомляет всех слушателей, зарегистрировавших интерес к уведомлениям о событиях этого типа. |
protected void |
fireUndoableEditUpdate |
Уведомляет всех слушателей, зарегистрировавших интерес к уведомлениям о событиях этого типа. |
int |
getAsynchronousLoadPriority() |
Возвращает приоритет асинхронной загрузки. |
protected final AbstractDocument.AttributeContext |
getAttributeContext() |
Возвращает контекст для управления атрибутами. |
Element |
getBidiRootElement() |
Возвращает корневой элемент двунаправленной структуры этого документа. |
protected final AbstractDocument.Content |
getContent() |
Возвращает содержимое документа. |
protected final Thread |
getCurrentWriter() |
Возвращает текущий поток записи, если он существует. |
abstract Element |
getDefaultRootElement() |
Возвращает корневой элемент, на основе которого следует строить представления, если не предоставлен другой механизм назначения представлений структурам элементов. |
DocumentFilter |
getDocumentFilter() |
Возвращает DocumentFilter, отвечающий за фильтрацию вставки/удаления. |
DocumentListener[] |
getDocumentListeners() |
Возвращает массив всех слушателей документа, зарегистрированных для этого документа. |
Dictionary |
getDocumentProperties() |
Обеспечивает управление набором свойств. |
final Position |
getEndPosition() |
Возвращает позицию, соответствующую концу документа. |
int |
getLength() |
Возвращает длину данных. |
<T extends EventListener> |
getListeners |
Возвращает массив всех объектов, зарегистрированных в данный момент в качестве FooListener в этом документе. |
abstract Element |
getParagraphElement |
Возвращает элемент абзаца, содержащий указанную позицию. |
final Object |
getProperty |
Вспомогательный метод для получения значения свойства. |
Element[] |
getRootElements() |
Возвращает все определённые корневые элементы. |
final Position |
getStartPosition() |
Возвращает позицию, соответствующую началу документа. |
String |
getText |
Возвращает последовательность текста из документа. |
void |
getText |
Возвращает текст, содержащийся в указанной части документа. |
UndoableEditListener[] |
getUndoableEditListeners() |
Возвращает массив всех слушателей отменяемых изменений, зарегистрированных для этого документа. |
void |
insertString |
Вставляет содержимое в документ. |
protected void |
insertUpdate |
Обновляет структуру документа в результате вставки текста. |
protected void |
postRemoveUpdate |
Обновляет структуру документа в результате удаления текста. |
final void |
putProperty |
Вспомогательный метод для сохранения значения свойства. |
final void |
readLock() |
Захватывает блокировку для начала чтения состояния документа. |
final void |
readUnlock() |
Снимает блокировку чтения. |
void |
remove |
Удаляет содержимое из документа. |
void |
removeDocumentListener |
Удаляет слушателя документа. |
void |
removeUndoableEditListener |
Удаляет слушателя отмены действий. |
protected void |
removeUpdate |
Обновляет структуру документа в результате удаления текста. |
void |
render |
Позволяет безопасно отображать модель при наличии параллелизма, если модель поддерживает асинхронное обновление. |
void |
replace |
Удаляет область текста от offset до offset + length и заменяет её на text. |
void |
setAsynchronousLoadPriority |
Задаёт приоритет асинхронной загрузки. |
void |
setDocumentFilter |
Задаёт DocumentFilter. |
void |
setDocumentProperties |
Заменяет словарь свойств этого документа. |
protected final void |
writeLock() |
Захватывает блокировку для начала изменения защищаемого ею документа. |
protected final void |
writeUnlock() |
Освобождает блокировку записи, ранее полученную с помощью writeLock. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект другому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация объявлена устаревшей и может быть удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Приостанавливает текущий поток до его пробуждения, обычно посредством вызова notify или interrupt. |
final void |
wait |
Приостанавливает текущий поток до его пробуждения, обычно посредством вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Приостанавливает текущий поток до его пробуждения, обычно посредством вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
Подробное описание полей
listenerList
protected EventListenerList listenerList
BAD_LOCATION
protected static final String BAD_LOCATION
- См. также:
ParagraphElementName
public static final String ParagraphElementName
- См. также:
ContentElementName
public static final String ContentElementName
- См. также:
SectionElementName
public static final String SectionElementName
- См. также:
BidiElementName
public static final String BidiElementName
- См. также:
ElementNameAttribute
public static final String ElementNameAttribute
- См. также:
Подробное описание конструкторов
AbstractDocument
protected AbstractDocument(AbstractDocument.Content data)
AbstractDocument, использующий указанный механизм хранения содержимого.- Параметры:
-
data— содержимое
AbstractDocument
protected AbstractDocument(AbstractDocument.Content data, AbstractDocument.AttributeContext context)
AbstractDocument, использующий указанный механизм хранения содержимого.- Параметры:
-
data— содержимое -
context— контекст атрибутов
Подробное описание методов
getDocumentProperties
public Dictionary<Object,Object> getDocumentProperties()
documentProperties для добавления к документу свойств, действующих на уровне всего документа.- Возвращает:
- не-
nullDictionary - См. также:
setDocumentProperties
public void setDocumentProperties(Dictionary<Object,Object> x)
- Параметры:
-
x— новый словарь - См. также:
fireInsertUpdate
protected void fireInsertUpdate(DocumentEvent e)
- Параметры:
-
e— событие - См. также:
fireChangedUpdate
protected void fireChangedUpdate(DocumentEvent e)
- Параметры:
-
e— событие - См. также:
fireRemoveUpdate
protected void fireRemoveUpdate(DocumentEvent e)
- Параметры:
-
e— событие - См. также:
fireUndoableEditUpdate
protected void fireUndoableEditUpdate(UndoableEditEvent e)
- Параметры:
-
e— событие - См. также:
getListeners
public <T extends EventListener> T[] getListeners(Class<T> listenerType)
FooListeners этого документа. Регистрация FooListeners выполняется с помощью метода addFooListener. В аргументе listenerType можно указать литерал класса, например FooListener.class. Например, запросить у документа d его прослушиватели документа можно следующим образом:
DocumentListener[] mls = (DocumentListener[])(d.getListeners(DocumentListener.class));Если таких прослушивателей нет, этот метод возвращает пустой массив.
- Параметры типа:
T— тип прослушивателя- Параметры:
-
listenerType— тип запрашиваемых прослушивателей - Возвращает:
- массив всех объектов, зарегистрированных в качестве
FooListeners этого компонента, или пустой массив, если такие прослушиватели не были добавлены - Вызывает исключение:
-
ClassCastException— еслиlistenerTypeне задает класс или интерфейс, реализующийjava.util.EventListener - Начиная с:
- 1.3
- См. также:
getAsynchronousLoadPriority
public int getAsynchronousLoadPriority()
- Возвращает:
- приоритет асинхронной загрузки или
-1, если документ не следует загружать асинхронно
setAsynchronousLoadPriority
public void setAsynchronousLoadPriority(int p)
- Параметры:
-
p— новый приоритет асинхронной загрузки; значение меньше нуля означает, что документ не следует загружать асинхронно
setDocumentFilter
public void setDocumentFilter(DocumentFilter filter)
DocumentFilter. DocumentFilter передается insert и remove, чтобы условно разрешить вставку/удаление текста. Значение null означает, что фильтрация выполняться не будет.- Параметры:
-
filter—DocumentFilter, используемый для ограничения текста - Начиная с:
- 1.4
- См. также:
getDocumentFilter
public DocumentFilter getDocumentFilter()
DocumentFilter, отвечающий за фильтрацию вставки/удаления. Возвращаемое значение null означает, что фильтрация выполняться не будет.- Возвращает:
- DocumentFilter
- Начиная с:
- 1.4
- См. также:
render
public void render(Runnable r)
Реализация на время выполнения объекта Runnable захватывает блокировку чтения. Одновременно могут выполняться несколько объектов Runnable, а все операции записи будут блокироваться, пока активны объекты Runnable отображения. Если объект Runnable выбрасывает исключение, его блокировка будет безопасно снята. Защита от объекта Runnable, который никогда не завершает работу, не предусмотрена: в таком случае документ фактически останется заблокированным на все время его существования.
Если переданный объект Runnable попытается внести какие-либо изменения в этой реализации, произойдет взаимная блокировка. Отслеживание отдельных потоков отображения для обнаружения этой ситуации не выполняется, однако подкласс может понести дополнительные расходы на их отслеживание и выброс исключения.
Этот метод является потокобезопасным, хотя большинство методов Swing таковыми не являются. Дополнительные сведения см. в разделе Параллельное выполнение в Swing.
getLength
addDocumentListener
public void addDocumentListener(DocumentListener listener)
- Определено в:
-
addDocumentListenerв интерфейсеDocument - Параметры:
-
listener— добавляемыйDocumentListener - См. также:
removeDocumentListener
public void removeDocumentListener(DocumentListener listener)
- Определено в:
-
removeDocumentListenerв интерфейсеDocument - Параметры:
-
listener— удаляемыйDocumentListener - См. также:
getDocumentListeners
public DocumentListener[] getDocumentListeners()
- Возвращает:
- все
DocumentListeners этого документа или пустой массив, если в данный момент не зарегистрировано ни одного прослушивателя документа - Начиная с:
- 1.4
- См. также:
addUndoableEditListener
public void addUndoableEditListener(UndoableEditListener listener)
UndoableEdit, вызывают отправку соответствующего DocumentEvent, чтобы синхронизировать представления с моделью.- Определено в:
-
addUndoableEditListenerв интерфейсеDocument - Параметры:
-
listener— добавляемыйUndoableEditListener - См. также:
removeUndoableEditListener
public void removeUndoableEditListener(UndoableEditListener listener)
- Определено в:
-
removeUndoableEditListenerв интерфейсеDocument - Параметры:
-
listener— удаляемыйUndoableEditListener - См. также:
getUndoableEditListeners
public UndoableEditListener[] getUndoableEditListeners()
- Возвращает:
- все
UndoableEditListeners этого документа или пустой массив, если в данный момент не зарегистрировано ни одного прослушивателя отменяемых изменений - Начиная с:
- 1.4
- См. также:
getProperty
public final Object getProperty(Object key)
getDocumentProperties().get(key);
- Определено в:
-
getPropertyв интерфейсеDocument - Параметры:
-
key— ключ свойства, не являющийсяnull - Возвращает:
- значение этого свойства или
null - См. также:
putProperty
public final void putProperty(Object key, Object value)
getDocumentProperties().put(key, value);Если
value — это null, данный метод удалит свойство.- Определено в:
-
putPropertyв интерфейсеDocument - Параметры:
-
key— ключ, не являющийсяnull -
value— значение свойства - См. также:
remove
public void remove(int offs, int len) throws BadLocationException
Этот метод является потокобезопасным, хотя большинство методов Swing таковыми не являются. Дополнительные сведения см. в разделе Параллельное выполнение в Swing.
- Определено в:
-
removeв интерфейсеDocument - Параметры:
-
offs— начальное смещение >= 0 -
len— количество удаляемых символов >= 0 - Вызывает исключение:
-
BadLocationException— указанная позиция удаления не является допустимой позицией в документе - См. также:
replace
public void replace(int offset, int length, String text, AttributeSet attrs) throws BadLocationException
offset до offset + length и заменяет ее на text. Реализация определяет, как именно это выполняется: некоторые реализации могут рассматривать эту операцию как две отдельные операции — удаление и последующую вставку, другие могут выполнять замену как одну атомарную операцию.- Параметры:
-
offset— индекс дочернего элемента -
length— длина удаляемого текста; значение 0 означает, что удалять ничего не нужно -
text— вставляемый текст;nullозначает, что текст для вставки отсутствует -
attrs— AttributeSet, задающий атрибуты вставляемого текста; допустимо значениеnull, которое обычно рассматривается как пустой набор атрибутов, однако точная интерпретация определяется подклассом - Вызывает исключение:
-
BadLocationException— указанная позиция не является допустимой позицией в документе - Начиная с:
- 1.4
insertString
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
Этот метод является потокобезопасным, хотя большинство методов Swing таковыми не являются. Дополнительные сведения см. в разделе Параллельное выполнение в Swing.
- Определено в:
-
insertStringв интерфейсеDocument - Параметры:
-
offs— начальное смещение >= 0 -
str— вставляемая строка; для null или пустой строки ничего не происходит -
a— атрибуты вставляемого содержимого - Вызывает исключение:
-
BadLocationException— указанная позиция вставки не является допустимой позицией в документе - См. также:
getText
public String getText(int offset, int length) throws BadLocationException
- Определено в:
-
getTextв интерфейсеDocument - Параметры:
-
offset— начальное смещение >= 0 -
length— количество извлекаемых символов >= 0 - Возвращает:
- текст
- Вызывает исключение:
-
BadLocationException— указанный диапазон включает позицию, не являющуюся допустимой позицией в документе - См. также:
getText
public void getText(int offset, int length, Segment txt) throws BadLocationException
Если свойство partialReturn параметра txt имеет значение false, данные, возвращаемые в Segment, будут иметь всю запрошенную длину и могут быть как копией, так и оригиналом — это зависит от способа хранения данных. Если свойство partialReturn имеет значение true, возвращается только то количество текста, которое можно получить без создания копии. Частичный возврат повышает производительность при сканировании больших частей документа. Ниже приведен пример использования частичного возврата для доступа ко всему документу:
int nleft = doc.getDocumentLength();
Segment text = new Segment();
int offs = 0;
text.setPartialReturn(true);
while (nleft > 0) {
doc.getText(offs, nleft, text);
// do something with text
nleft -= text.count;
offs += text.count;
}
- Определено в:
-
getTextв интерфейсеDocument - Параметры:
-
offset— начальное смещение >= 0 -
length— количество извлекаемых символов >= 0 -
txt— объект Segment, в который будет помещен текст - Вызывает исключение:
-
BadLocationException— указанный диапазон включает позицию, не являющуюся допустимой позицией в документе
createPosition
public Position createPosition(int offs) throws BadLocationException
Этот метод является потокобезопасным, хотя большинство методов Swing таковыми не являются. Дополнительные сведения см. в разделе Параллельное выполнение в Swing.
- Определено в:
-
createPositionв интерфейсеDocument - Параметры:
-
offs— позиция в модели >= 0 - Возвращает:
- позиция
- Вызывает исключение:
-
BadLocationException— если указанная позиция не соответствует допустимому местоположению в связанном документе - См. также:
getStartPosition
public final Position getStartPosition()
- Определено в:
-
getStartPositionв интерфейсеDocument - Возвращает:
- позиция
getEndPosition
public final Position getEndPosition()
- Определено в:
-
getEndPositionв интерфейсеDocument - Возвращает:
- позиция
getRootElements
public Element[] getRootElements()
- Определено в:
-
getRootElementsв интерфейсеDocument - Возвращает:
- корневой элемент
getDefaultRootElement
public abstract Element getDefaultRootElement()
- Определено в:
-
getDefaultRootElementв интерфейсеDocument - Возвращает:
- корневой элемент
- См. также:
getBidiRootElement
public Element getBidiRootElement()
- Возвращает:
- корневой элемент двунаправленной структуры этого документа
getParagraphElement
public abstract Element getParagraphElement(int pos)
- Параметры:
-
pos— начальное смещение >= 0 - Возвращает:
- элемент
getAttributeContext
protected final AbstractDocument.AttributeContext getAttributeContext()
- Возвращает:
- контекст
insertUpdate
protected void insertUpdate(AbstractDocument.DefaultDocumentEvent chng, AttributeSet attr)
- Параметры:
-
chng— описание изменения -
attr— атрибуты изменения
removeUpdate
protected void removeUpdate(AbstractDocument.DefaultDocumentEvent chng)
- Параметры:
-
chng— описание изменения
postRemoveUpdate
protected void postRemoveUpdate(AbstractDocument.DefaultDocumentEvent chng)
- Параметры:
-
chng— описание изменения
dump
public void dump(PrintStream out)
- Параметры:
-
out— выходной поток
getContent
protected final AbstractDocument.Content getContent()
- Возвращает:
- содержимое
createLeafElement
protected Element createLeafElement(Element parent, AttributeSet a, int p0, int p1)
- Параметры:
-
parent— родительский элемент -
a— атрибуты элемента -
p0— начало диапазона >= 0 -
p1— конец диапазона >= p0 - Возвращает:
- новый элемент
createBranchElement
protected Element createBranchElement(Element parent, AttributeSet a)
- Параметры:
-
parent— родительский элемент -
a— атрибуты - Возвращает:
- элемент
getCurrentWriter
protected final Thread getCurrentWriter()
- Возвращает:
- поток, активно изменяющий документ, или
null, если в данный момент изменения не выполняются
writeLock
protected final void writeLock()
writeLock, если он не пытается получить дополнительные writeLock во время уведомления документа. Попытка получить writeLock во время уведомления DocumentListener приведет к IllegalStateException. Возможность получать более одной writeLock на поток позволяет подклассам получить блокировку записи, выполнить несколько операций, а затем освободить блокировку. Вызовы writeLock должны быть уравновешены вызовами writeUnlock, иначе Document останется заблокированным, и чтение или запись станут невозможны.
- Выбрасывает:
-
IllegalStateException— выбрасывается при недопустимой попытке получить блокировку. Если документ реализован правильно, это может произойти только в случае, когда слушатель документа пытается изменить документ. Такая ситуация нарушает модель событий JavaBeans, в которой порядок доставки не гарантируется и все слушатели должны получить уведомление до разрешения дальнейших изменений.
writeUnlock
protected final void writeUnlock()
writeLock. После уменьшения счетчика блокировок, если не осталось активных блокировок, доступ к документу будет разрешен новому потоку записи или потокам чтения.- См. также:
readLock
public final void readLock()
readUnlock.- См. также:
readUnlock
public final void readUnlock()
readLock();
try {
// do something
} finally {
readUnlock();
}
- См. также:
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.