2011-09-11 2 views
6

Sto usando una lib che ha un tipo enum con tali come;OrientDB che ha problemi con Unicode, turco ed enums

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

Mentre io sono il debug in Eclipse, ho ottenuto un errore:

No enum const class Type.STRİNG 

Come sto usando un sistema turco, c'è un problema sulla i di lavoro> io, ma come questo è un const enum , anche se inserisco tutti gli attributi come UTF-8, nulla potrebbe ottenere che STRING è ciò che Eclipse dovrebbe cercare. Ma cerca ancora STRİNG e non riesce a trovarlo e non posso utilizzarlo. Cosa devo fare per quello?

Progetto> Proprietà> Resouce> La codifica del file di testo è UTF-8 ora. Il problema continua

MODIFICA: Ulteriori informazioni possono fornire alcuni indizi che non riesco a ottenere; Sto lavorando su OrientDB. Questo è il mio primo tentativo, quindi non so se il problema potrebbe essere sui pacchetti di OrientDB. Ma sto usando molte altre librerie, non ho mai visto un problema simile. Esiste un enumerazione OType in questo pacchetto e sto solo cercando di connettermi al database.

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

Non c'è più codice che uso ancora. Database creato ma poi ho ottenere il 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 

Ecco classe oType: http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OType.java

E altra classe; OCommandExecutorSQLCreateProperty: http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateProperty.java

Linea 81 dice: type = OType.valueOf(word.toString());

+0

Il completamento automatico di Eclipse è corretto quando si preme 'CTRL + Spazio' subito dopo aver digitato' Type.STR'? –

+0

In realtà non lo uso digitando direttamente. Ci deve essere qualcosa come il riflesso o qualcosa che lo usa. Ma come risposta alla tua domanda, digitando, non ci sono problemi. Ctrl + Spazio mi dà Type.STRING (corretto, senza problemi) –

+0

Forse c'è un problema con il codice che chiama in modo riflessivo l'enum - da dove viene quel valore? L'input dell'utente forma la tastiera solo turca, o un altro sistema che invia 'İ' invece di' I'? –

risposta

6

È corretto presumere che si stia eseguendo questo programma utilizzando un locale turco?Poi sembra che il bug è in linea 118 di OCommandExecutorSQLCreateProperty:

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

Si dovrà specificare le impostazioni internazionali il cui superiore mantello regole dovrebbe essere utilizzato, probabilmente Locale.ENGLISH come parametro per toUpperCase.

+0

Grazie mille. Penso che la risposta più ragionevole sia tua per ora. Ma come lo farei? Sto solo usando questa libreria e perché questo accade solo a questa libreria? –

+0

Ho scoperto il problema, non alla linea che hai indicato ma molto simile. Esiste un metodo "toUpperCase()" nella riga 40 di OCommandExecuterSQLAbstract. Mi dà STRENO come dovrebbe dare la localizzazione turca. Ho cambiato il mio locale come Locale.setLocale (Locale.ITALIANO), funziona bene. Ma c'è un problema; se ho bisogno di lavorare con i dati turchi, e se non ho locale turco, sarà un altro problema. Suggerisco ad OrientDB di risolvere questo problema cambiando il loro codice comeUtilizzatore di chiavi (Locale.ENGLISH); Vedremo cosa succede :) Grazie mille –

+0

Ho usato questa soluzione e ho effettuato il commit come OrientDB SVN r3818. Ho lasciato l'operatore SQL .toUpperCase() perché è corretto utilizzare le impostazioni internazionali per lavorare con testo turco. Lvc @ – Lvca

0

Un work-around è quello di digitare Type.ST e quindi premere Ctrl-spazio. Eclipse dovrebbe completare automaticamente il nome della variabile senza dover calcolare come inserire una maiuscola senza punto I su una tastiera turca. :)

+0

Non ci sono problemi. Solo qualche cosa lo chiama, ed Eclipse sbaglia. –

1

Questo problema è correlato alla connessione del database. Presumibilmente, c'è una stringa in OrientDB da qualche parte, e la stai leggendo, e poi prova a usarla per selezionare un membro dell'enum.

Sto assumendo nel codice che hai postato che la variabile word provenga da dati nel database. Se viene da qualche altra parte, il problema è "altrove". Se OrientDB, per qualche strana ragione, restituisce "STRINN" come metadati per indicare il tipo di qualcosa, allora questo è effettivamente un difetto in OrientDB.

Se quella stringa contiene effettivamente un ©, quindi nessuna impostazione di Eclipse avrà alcun effetto sui risultati. Si dovrà scrivere il codice per normalizzare I della I.

Se si dump il contenuto della 'parola' come una sequenza di valori esadecimali per i char s della stringa, penso che vedrete il vostro I fissando proprio a te. È necessario modificare ciò che è nel DB per avere un vecchio semplice I.

+0

Grazie. Beh, in realtà succede anche se non ci sono dati sul database. Questa eccezione viene lanciata durante la creazione del database, non metto nemmeno nulla. Allora dovrei pensare di più a un problema delle classi OrientDB? –

+1

Sembra suggerire che il problema sia nei metadati di OrientDB. 'String' è uno dei tipi di dati supportati? Stai usando una versione turca di OrientDB o il suo driver? È difficile immaginare qualcosa che sfugga al QA, ma a meno che tu non stia gestendo i metadati (probabilmente un file di mappatura?) È lì che guarderei. – TMN

+0

Non sto usando nessuna versione turca. Solo il mio sistema operativo (Windows7) è turco (e forse JVM ottiene le impostazioni internazionali predefinite come turco), ma non uso la versione turca di alcun plugin Eclipse o qualsiasi pacchetto/libreria, OrientDB e il suo driver. Penso che non ci siano problemi con il tipo di dati String come supporto.E, non sto gestendo i metadati/mappatura, sono solo all'inizio :) –

1

Sfortunatamente, è correlato all'impostazione locale, locale del sistema operativo che è turco.

Due lavoro intorno opzioni:

1. Change your regional settings to English-US 

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

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

ho creato segnalazioni di bug per XMLBeans, esistono e CXF Apache per lo stesso problema. Enumeration toUpper è il punto dell'eccezione.

Alcuni link correlati:

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