Home > Core JXTA > ContentService: nuove API per JXSE

ContentService: nuove API per JXSE

dicembre 20th, 2008

Nell’agosto di questo anno sono state realizzate da Mike Cumings, un membro della comunità JXTA, delle API che mirano a sostituirne altre da sempre poco amate e poco utilizzate dai programmatori, cioè CMS e CODAT. Anche se queste API sono già disponibili nelle versioni SVN di JXTA (nel ramo TRUNK), non saranno disponibili ufficialmente prima del rilascio della prossima versione.

Riportiamo una traduzione delle parole che lo stesso Mike Cumings ha usato per presentare il proprio lavoro alla comunità sul forum:

Di recente ho avuto la possibilità di sviluppare e aggiungere un nuovo servizio alle API JXSE, il ContentService. In parole povere, il ContentService è una interfaccia di servizio che può essere usata da un utente finale per trasferire dati arbitrari (Content) da un peer ad un altro. Queste nuove API hanno lo scopo di rimpiazzare, eventualmente, sia le esistenti (e inutilizzate) Codat API sia il progetto CMS.

Quindi, come funziona?

Il Content è condiviso da un peer che poi fornisce accesso ad un advertisement per questa condivisione. Un peer remoto diventa consapevole di questo advertisement (tipicamente, ma non necessariamente, tramite il DiscoveryService) e può usare l’advertisement per iniziare una sessione e ottenere i dati remoti.

In aggiunta alle funzionalità di base, le API del ContentService sono state costruite in modo da essere estensibili tramite plug-in e per supportare un numero qualsiasi di implementazioni di ContentProvider concorrentemente, ognuna delle quali ha la possibilità di accettare o ignorare le richieste in ingresso, basate sulle API. E’ il ContentProvider che effettua attualmente la condivisione ed il trasferimento del Content. Questo permette a specifiche classi di dati di essere intelligentemente condivise da una implementazione di ServiceProviders che hanno una conoscenza profonda di quella classe di dati. Il commit iniziale include due implementazioni molto rudimentali, una che è una ordinaria implementazione simile a TFTP e un’altra che sfrutta i JXTASockets. Queste implementazioni saranno sostituite tra non molto con qualcosa di più robusto, scalabile, e possibilmente standardizzato tra le varie implementazioni JXTA.

Nella eventualità che questa implementazione, come estensione, non fosse desiderata, è possibile sostituire direttamente il ContentService. In alternativa, tutti i fornitori possono essere aggiunti/rimossi/acceduti in modo programmatico dopo che il ContentService è stato inizializzato e avviato, permettendo la rimozione programmatica di implementazioni di provider aggiunti dinamicamente (ad esempio tramite il meccanismo jar SPI).

Aggiornamenti asincroni relativi allo stato del trasferimento e/o della condivisione, sono esposti in modo programmatico tramite eventi. Questo include sia gli eventi lato-server relativi alle condivisioni attive sia gli eventi relativi all’avanzamento dei trasferimenti lato-client.

I benefici percepiti di questo lavoro sono i segenti:

Questo lavoro può essere usato per futuri miglioramenti al meccanismo del loader del core di JXTA, permettendo alle implementazioni dei moduli di essere ottenute tramite protocolli di trasporto nativi per JXTA in aggiunta all’attualmente supportato protocollo HTTP.

Fornisce inoltre un metodo leggero, standard e semplice per spostare dati da un peer ad un altro con una minima gestione programmatica, riducendo le barriere per gli sviluppatori JXTA meno esperti.

I javadocs e gli esempi-tutorial che mostrano l’utilizzo delle API non sono al momento disponibili sui server JXTA. Riportiamo due snippets riportati in mailing list dallo stesso autore, anche se nel corso dello sviluppo le API potrebbero essere mutate a tal punto d non renderle più valide, le riportiamo per completezza:


//Example server code snippet:

ContentService service = new ContentServiceImpl();
service.init(netPeerGroup, ContentService.MODULE_CLASS_ID, null);
service.startApp(new String[0]);
ContentID contentID = IDFactory.newContentID(netPeerGroup.getPeerGroupID(),
                                                                 false);
FileDocument fileDoc = new FileDocument(file, MimeMediaType.AOS);
Content content = new Content(contentID, null, fileDoc);
List<ContentShare> shares = service.shareContent(content);
DiscoveryService discoService = netPeerGroup.getDiscoveryService();
for (ContentShare share : shares) {
    ContentShareAdvertisement adv = share.getContentShareAdvertisement();
    discoService.publish(adv);
}

//Example client transfer initiation code snippet:

ContentService service = new ContentServiceImpl();
service.init(netPeerGroup, ContentService.MODULE_CLASS_ID, null);
service.startApp(new String[0]);
ContentTransfer transfer = service.retrieveContent(contentID);
if (transfer != null) {
    transfer.startTransfer(new File("content"));
}

Da come possiamo vedere, in entrambi gli estratti il codice mantiene una certa semplicità.

Più avanti torneremo ad occuparci di questo nuovo strumento a disposizione, magari presentando un esempio di utilizzo.

Core JXTA , , , , ,

  1. No comments yet.
  1. No trackbacks yet.