У OrientDB проблемы с Unicode, турецким языком и перечислениями

Я использую библиотеку, которая имеет тип enum с такими константами;

Type.SHORT
Type.LONG
Type.FLOAT
Type.STRING

Во время отладки в Eclipse я получил ошибку:

No enum const class Type.STRİNG

Поскольку я использую турецкую систему, есть проблема с работой i>İ, но, поскольку это перечисление const, даже если я указал все атрибуты как UTF-8, ничто не могло получить, что STRING это то, что Затмение следует искать. Но он по-прежнему ищет STRİNG и не может найти, и я не могу его использовать. Что я должен сделать для этого?

Проект > Свойства > Ресурс > Кодировка текстового файла теперь UTF-8. Проблема держится.

EDIT: Дополнительная информация может дать некоторые подсказки, которые я не могу получить; Я работаю над OrientDB. Это моя первая попытка, поэтому я не знаю, может ли проблема быть в пакетах OrientDB. Но я использую много других библиотек, я никогда не видел такой проблемы. В этом пакете есть перечисление OType, и я только пытаюсь подключиться к базе данных.

    String url = "local:database";
    ODatabaseObjectTx db = new ODatabaseObjectTx(url).
    Person person = new Person("John");
    db.save(person);
    db.close();

Кода, который я использую, больше нет. База данных создана, но затем я получаю java.lang.IllegalArgumentException:

Caused by: java.lang.IllegalArgumentException: No enum const class com.orientechnologies.orient.core.metadata.schema.OType.STRİNG
    at java.lang.Enum.valueOf(Unknown Source)
    at com.orientechnologies.orient.core.metadata.schema.OType.valueOf(OType.java:41)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLCreateProperty.parse(OCommandExecutorSQLCreateProperty.java:81)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLCreateProperty.parse(OCommandExecutorSQLCreateProperty.java:35)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:43)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:28)
    at com.orientechnologies.orient.core.storage.OStorageEmbedded.command(OStorageEmbedded.java:63)
    at com.orientechnologies.orient.core.command.OCommandRequestTextAbstract.execute(OCommandRequestTextAbstract.java:63)
    at com.orientechnologies.orient.core.metadata.schema.OClassImpl.addProperty(OClassImpl.java:342)
    at com.orientechnologies.orient.core.metadata.schema.OClassImpl.createProperty(OClassImpl.java:258)
    at com.orientechnologies.orient.core.metadata.security.OSecurityShared.create(OSecurityShared.java:177)
    at com.orientechnologies.orient.core.metadata.security.OSecurityProxy.create(OSecurityProxy.java:37)
    at com.orientechnologies.orient.core.metadata.OMetadata.create(OMetadata.java:70)
    at com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.create(ODatabaseRecordAbstract.java:142)
    ... 4 more

Вот класс OType: http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OType.java

И другой класс; OCommandExecutorSQLCreateProperty: http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateProperty.java

Строка 81 говорит: type = OType.valueOf(word.toString());


person Yasin Okumuş    schedule 11.09.2011    source источник
comment
Правильно ли Eclipse выполняет автозаполнение, когда вы нажимаете CTRL+Space сразу после ввода Type.STR?   -  person Philipp Reichart    schedule 12.09.2011
comment
На самом деле я не использую его, набрав напрямую. Должно быть что-то вроде отражения или что-то, что его использует. А вот как ответить на ваш вопрос, набрав, проблем нет. Ctrl+Space дает мне Type.STRING (правильно, без проблем)   -  person Yasin Okumuş    schedule 12.09.2011
comment
Может быть, есть проблема с кодом, который рефлексивно вызывает перечисление — откуда берется это значение? Форма пользовательского ввода Турецкая клавиатура или другая система, которая отправляет İ вместо I?   -  person Philipp Reichart    schedule 12.09.2011
comment
Спасибо за ваши усилия. Я добавил некоторый код, который я использовал, я надеюсь, что это дает некоторые подсказки о том, что я хочу сделать. Я работаю на Eclipse и до сих пор не видел такой проблемы. Я знаю, что может быть что-то об этой турецкой кодировке, но эта просто другая, и я даже не могу получить исходную/первоначальную точку этого. Это просто странно, я думал, что это какая-то часть настроек, но все настройки, которые я знаю, показывают UTF-8, и ничего не помогает.   -  person Yasin Okumuş    schedule 12.09.2011
comment
Не могли бы вы добавить трассировку стека для исключения, чтобы мы могли видеть, откуда оно вызывается?   -  person Philipp Reichart    schedule 12.09.2011
comment
Я добавил stacktrace и некоторые источники классов.   -  person Yasin Okumuş    schedule 12.09.2011
comment
Код, который устанавливает «слово», был бы критическим.   -  person bmargulies    schedule 12.09.2011
comment
Может быть, но на самом деле я не сказал ни слова. Что это может быть? Я имею в виду, что мне нужно знать, связана ли проблема с Eclipse, OrientDB или со мной?   -  person Yasin Okumuş    schedule 12.09.2011
comment
Последнее, что нужно сделать сегодня вечером, я только что проверил весь ствол OrientDB и поискал в нем STRİNG — ничего не нашел. Это должно быть где-то в вашем коде или файлах конфигурации.   -  person Philipp Reichart    schedule 12.09.2011


Ответы (4)


Правильно ли я предполагаю, что вы запускаете эту программу, используя турецкую локаль? Тогда кажется, что ошибка находится в строке 118 OCommandExecutorSQLCreateProperty:

linkedType = OType.valueOf(linked.toUpperCase());

Вам нужно будет указать Локаль, правила верхнего регистра которой должны использоваться, возможно, Locale.ENGLISH в качестве параметра для toUpperCase.

person Jörn Horstmann    schedule 12.09.2011
comment
Спасибо большое. Я думаю, что самый разумный ответ на данный момент ваш. Но как мне это сделать? Я использую только эту библиотеку, и почему это происходит только с этой библиотекой? - person Yasin Okumuş; 13.09.2011
comment
Я обнаружил проблему не в той строке, которую вы указали, но очень похожей. В строке 40 OCommandExecuterSQLAbstract есть метод toUpperCase(). Он дает мне STRİNG, поскольку турецкая локаль должна давать. Я меняю свой язык как Locale.setLocale(Locale.ENGLISH), он работает хорошо. Но существует проблема; если мне нужно работать с турецкими данными, и если у меня нет турецкой локали, это будет другая проблема. Я предлагаю OrientDB исправить это, изменив свой код на toUpperCase(Locale.ENGLISH); Посмотрим, что будет :) Большое спасибо - person Yasin Okumuş; 13.09.2011
comment
Я использовал это решение и зафиксировал его как OrientDB SVN r3818. Я оставил SQL-оператор .toUpperCase(), потому что правильно использовать настройки локали для работы с турецким текстом. Lvc@ - person Lvca; 13.09.2011

Эта проблема связана с вашим подключением к базе данных. Предположительно, где-то в OrientDB есть строка, и вы читаете ее, а затем пытаетесь использовать для выбора члена перечисления.

Я предполагаю, что в опубликованном вами коде переменная word исходит из данных в базе данных. Если это происходит откуда-то еще, то проблема заключается «где-то еще». Если OrientDB по какой-то странной причине возвращает «STRİNG» в качестве метаданных, чтобы сообщить вам тип чего-либо, то это действительно дефект OrientDB.

Если эта строка на самом деле содержит İ, то никакие настройки Eclipse не повлияют на результаты. Вам нужно будет написать код, чтобы нормализовать İ к I.

Если вы выведете содержимое 'word' в виде последовательности шестнадцатеричных значений для char строки, я думаю, вы увидите, что ваш İ смотрит прямо на вас. Вы должны изменить то, что находится в БД, чтобы иметь старый добрый I.

person bmargulies    schedule 11.09.2011
comment
Спасибо. Ну, на самом деле это происходит даже при отсутствии данных в базе данных. Это исключение выбрасывается при создании базы данных, я даже ничего не ставлю. Тогда мне стоит больше подумать о проблеме классов OrientDB? - person Yasin Okumuş; 12.09.2011
comment
Похоже, проблема в метаданных OrientDB. Является ли String одним из поддерживаемых типов данных? Вы используете турецкую версию OrientDB или ее драйвер? Трудно представить, что что-то настолько простое ускользнет от QA, но если вы не управляете метаданными (возможно, файлом сопоставления?), я бы посмотрел именно на это. - person TMN; 12.09.2011
comment
Я не использую турецкую версию. Только моя ОС (Windows7) является турецкой (и, возможно, JVM получает локаль по умолчанию как турецкую), но я также не использую турецкую версию любого плагина Eclipse или каких-либо пакетов/библиотек, OrientDB и его драйвера. Я думаю, что нет проблем с поддержкой типа данных String. И я не управляю метаданными/отображением, я только в начале :) - person Yasin Okumuş; 13.09.2011

К сожалению, это связано с региональными настройками, турецкой локалью вашей ОС.

Два варианта обхода:

1. Change your regional settings to English-US

2. Give encoding to the jvm as command line param for setting locale to English

    -Duser.language=en -Duser.region=EN

Я создал отчеты об ошибках для xmlbeans, exists и apache cxf для одной и той же проблемы. Перечисление toUpper является исключением.

Некоторые связанные ссылки:

https://issues.apache.org/jira/browse/XMLSCHEMA-22

http://mail-archives.apache.org/mod_mbox/xmlbeans-user/201001.mbox/%[email protected]%3E

http://mail-archives.apache.org/mod_mbox/cxf-users/201203.mbox/%[email protected]%3E

https://vaadin.com/forum/-/message_boards/view_message/793105

http://comments.gmane.org/gmane.comp.apache.cxf.user/18316

person serkan    schedule 01.03.2013

Один из обходных путей — ввести Type.ST, а затем нажать Ctrl-пробел. Eclipse должен автоматически дополнять имя переменной без необходимости выяснять, как ввести заглавную букву I без точек на турецкой клавиатуре. :)

person Ted Hopp    schedule 11.09.2011
comment
В этом нет проблем. Просто что-то называет это, и Eclipse ошибается. - person Yasin Okumuş; 12.09.2011