JRuby & Rails Controller

Salve a tutti. Rinnovo i miei complimenti per l’ottimo servizio che
offrite.

Volevo porvi una domanda e spero che mi possiate dare qualche
suggerimento. Probabilmente la soluzione è molto semplice, ma non riesco
proprio a sbloccarmi.

PREMESSA:
Ho scelto jRuby perché devo usare delle classi JAVA e più precisamente
vorrei utilizzare le API di Jena

PROBLEMA:
Riesco facilmente ad interfacciarmi con Java, ma trovo delle limitazioni
all’interno dei controller di Rails.

All’interno del controller inizializzo una classe jena (ModelFactory)
che crea un modello (Jena) di una ontologia. La salvo in una variabile
(@model) ma non riesco a capire come posso conservarla in tutte le
action.

@model = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)

In pratica vorrei poter mantenere il contenuto di @model in ogni action

SOLUZIONI FALLITE:

  • session: essendo ModelFactory una classe Jena/Java non è possibile
    realizzare una conversione automatica con marshal
  • model e salvataggio nel DB: l’operazione fallisce perché non riesce ad
    applicare il metodo ‘gsub’ alla classe (perché ovviamente non lo
    contiene)

SOLUZIONE ATTUALE (molto poco elegante):
Creo una costante.
MODEL = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
E’ una soluzione che non mi piace affatto. C’è un modo alternativo per
superare questo mio problema?

Vi ringrazio anticipatamente

Ciao Pippo,
non mi è chiarissimo il problema, se ti interessa la persistenza o solo
una visibilità maggiore, in quest’ultimo caso hai provato a crearlo
nell’application controller?

Marco M. wrote:

Ciao Pippo,
non mi è chiarissimo il problema, se ti interessa la persistenza o solo
una visibilità maggiore, in quest’ultimo caso hai provato a crearlo
nell’application controller?

Si scusa hai ragione mi sono espresso male. Vorrei che la variabile sia
persistente e mantenesse quindi il contenuto fra pagina e pagina. Jena
genera un suo modello(jena) su cui si possono eseguire svariate
interrogazioni. Io sostanzialmente non vorrei rigenerare ogni volta
questo modello(jena). In rails il contenuto della variabile è
persistente solo fra il metodo del controller e la sua relativa view.
Fra i diversi metodi dello stesso controller la variabile viene
reinizializzata ad ogni accesso. In generale, risolvevo questa esigenza
con session o memorizzando in un DB, ma in questo caso non posso. Credo
che sia collegato alla spiegazione fornita qui:
http://www.ruby-forum.com/topic/133234

Probabilmente la soluzione è banale ma proprio non trovo vie di uscita.

Sostanzialmente tu mi suggerisci di creare il modello(jena)
nell’application_controller? Provo

2010/8/24 Pippo S. [email protected]:

@model = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)

provato a serializzare/deserializzare e mettere in session quello?
Puoi sicuramente come serializzazione java, ma mi pare che jena
potesse serializzare in N3 e robe simili, poi le metti come campo
text/blob nel db

SOLUZIONE ATTUALE (molto poco elegante):
Creo una costante.
MODEL = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
E’ una soluzione che non mi piace affatto. C’è un modo alternativo per
superare questo mio problema?

perché?

Ciao,

come spiegato nel link che citavi, quando passi da un’action all’altra
(ad esempio cliccando su un link o su un submit), l’oggetto controller
cambia; questo vuol dire che non puoi passare oggetti complessi da
un’action all’altra: sostanzialmente puoi passare (ad esempio tramite
session) solo stringhe e numeri.

Non conosco le classi java di cui parli, quindi ho una domanda: quanto
è costoso produrre l’oggetto che ti serve?

Se non è costoso potresti semplicemente usare un’instance variable,
una costante o quant’altro.

Se il costo è proibitivo, puoi tentare di scoprire se l’oggetto è
serializzabile.

pietro

gabriele renzi wrote:

2010/8/24 Pippo S. [email protected]:

@model = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)

provato a serializzare/deserializzare e mettere in session quello?
Puoi sicuramente come serializzazione java, ma mi pare che jena
potesse serializzare in N3 e robe simili, poi le metti come campo
text/blob nel db

Più che altro è che sto caricando una ontologia di 20 MB e tirarla su
ogni volta ad ogni azione non è troppo divertente per l’utente. Quindi
in Java dici che posso serializzare la classe? Ora ho fatto una ricerca
più approfondita nelle API di Jena e credo che esistano metodi di questo
tipo. Hai ragione. A occhio dovrebbero essere adatte cose come:

ModelFactory.createFileModelMaker
ModelFactory.createModelRDBMaker

Io cercavo di risolvere la cosa direttamente in ruby ed effettivamente
mi complicavo le cose.

SOLUZIONE ATTUALE (molto poco elegante):
Creo una costante.
MODEL = ModelFactory.createOntologyModel(OntModelSpec::OWL_MEM)
E’ una soluzione che non mi piace affatto. C’� un modo alternativo per
superare questo mio problema?

perch�?

Perché poi non posso più modificare il model in run-time

2010/8/25 Pippo S. [email protected]:

Hai ragione. A occhio dovrebbero essere adatte cose come:

ModelFactory.createFileModelMaker
ModelFactory.createModelRDBMaker

Io cercavo di risolvere la cosa direttamente in ruby ed effettivamente
mi complicavo le cose.

no quelli sono anche più smart: si gestiscono la persistenza da se su
file o su db, se per te va bene è sicuramente la soluzione migliore.

Perché poi non posso più modificare il model in run-time
In realtà puoi farlo, una costante significa solo che non puoi
cambiare l’associazione nome-oggetto, ma l’oggetto rimane mutabile:

A=Array.new
=> []
A=2
(irb):2: warning: already initialized constant A
=> 2
A=Array.new
(irb):3: warning: already initialized constant A
=> []
A << 2
=> [2]
A
=> [2]

Ma si, se devi modificarlo poi avresti casini con i thread e i restart
e la persistenza, che è non è bello :slight_smile:

gabriele renzi wrote:

2010/8/25 Pippo S. [email protected]:

Hai ragione. A occhio dovrebbero essere adatte cose come:

ModelFactory.createFileModelMaker
ModelFactory.createModelRDBMaker

Io cercavo di risolvere la cosa direttamente in ruby ed effettivamente
mi complicavo le cose.

no quelli sono anche più smart: si gestiscono la persistenza da se su
file o su db, se per te va bene è sicuramente la soluzione migliore.

Grazie mille! Come sempre, gentili e di grande aiuto.

Pietro G. wrote:

Non conosco le classi java di cui parli, quindi ho una domanda: quanto
� costoso produrre l’oggetto che ti serve?

Se non � costoso potresti semplicemente usare un’instance variable,
una costante o quant’altro.

Beh ma anche le instance variable vengono rigenerate, o mi sbaglio? Mi
riferisco a @model che ho citato prima, per esempio. Ad ogni richiesta
al server me la ritrovo reinizializzata. Con le costanti funziona, ma
poi non posso modificarle run-time.

Si è abbastanza costoso produrre quell’oggetto. Ogni volta sarebbe una
lettura di 20Mb

Se il costo � proibitivo, puoi tentare di scoprire se l’oggetto �
serializzabile.

Si forse opterò per qualcosa di simile

Grazie

Concludo il topic segnalando che alla fine sto procedendo con l’utilizzo
di activeRDF. C’è un adaptor di Jena che gestisce proprio la
persistenza:

2010/9/14 Pippo S. [email protected]:

Concludo il topic segnalando che alla fine sto procedendo con l’utilizzo
di activeRDF. C’è un adaptor di Jena che gestisce proprio la
persistenza:

Non hai letto la mia domanda?

Msan M. wrote:

2010/8/24 Pippo S. [email protected]:

Salve a tutti. Rinnovo i miei complimenti per l’ottimo servizio che
offrite.

Volevo porvi una domanda e spero che mi possiate dare qualche
suggerimento. Probabilmente la soluzione � molto semplice, ma non riesco
proprio a sbloccarmi.

PREMESSA:
Ho scelto jRuby perch� devo usare delle classi JAVA e pi� precisamente
vorrei utilizzare le API di Jena

Scusa hai scelto jruby esclusivamente perche’ devi usare classi java o
ci sono degli altri motivi?
Io non uso java ma utilizzo jruby sostanzialmente per un motivo, la
facilita’ di deploy delle applicazioni.
Rispetto a ruby non ho trovato nessunissima differenza.

Scusa non avevo letto!

Si essenzialmente per il riuso di classi Java, altrimenti tendo ad usare
ruby. Potrei sbagliarmi, ma credo che il supporto sia più limitato (per
esempio con le gemme). Quindi sostanzialmente uso jRuby solo quando è
strettamente necessario. In ogni caso con jRuby non ho mai avuto
problemi. Anch’io ho trovato il deploy molto rapido: io uso per esempio
warbler.

2010/9/14 Pippo S. [email protected]:

Ho scelto jRuby perch� devo usare delle classi JAVA e pi� precisamente
Si essenzialmente per il riuso di classi Java, altrimenti tendo ad usare
ruby. Potrei sbagliarmi, ma credo che il supporto sia più limitato (per
esempio con le gemme). Quindi sostanzialmente uso jRuby solo quando è
strettamente necessario. In ogni caso con jRuby non ho mai avuto
problemi. Anch’io ho trovato il deploy molto rapido: io uso per esempio
warbler.

Anch’io uso warbler e rispetto alla soluzione apache + passenger non
c’e’ paragone.
Per le gemme ormai sono quasi tutte supportate.

2010/8/24 Pippo S. [email protected]:

Salve a tutti. Rinnovo i miei complimenti per l’ottimo servizio che
offrite.

Volevo porvi una domanda e spero che mi possiate dare qualche
suggerimento. Probabilmente la soluzione è molto semplice, ma non riesco
proprio a sbloccarmi.

PREMESSA:
Ho scelto jRuby perché devo usare delle classi JAVA e più precisamente
vorrei utilizzare le API di Jena

Scusa hai scelto jruby esclusivamente perche’ devi usare classi java o
ci sono degli altri motivi?
Io non uso java ma utilizzo jruby sostanzialmente per un motivo, la
facilita’ di deploy delle applicazioni.
Rispetto a ruby non ho trovato nessunissima differenza.