r481 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/services wikitty-hessian-client/src/main/java/org/nuiton/wikitty/services
Author: bpoussin Date: 2010-11-18 11:47:41 +0100 (Thu, 18 Nov 2010) New Revision: 481 Url: http://nuiton.org/repositories/revision/wikitty/481 Log: - WikittyServiceSlave implementation finished (state saved and read to know last event received from master) - add force argument to replay WikittyService method Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceImpl.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java trunk/wikitty-hessian-client/src/main/java/org/nuiton/wikitty/services/WikittyServiceSlave.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-11-18 10:47:41 UTC (rev 481) @@ -45,11 +45,11 @@ /** * Create WikittyConfig with default value and load wikitty-config.properties */ - public WikittyConfig() { + public WikittyConfig(String ... args) { super(); init(); try { - parse(null); + parse(args); } catch (ArgumentsParserException eee) { if (log.isErrorEnabled()) { log.error("Can't load wikitty configuration", eee); @@ -57,13 +57,14 @@ } } - /** - * Create WikittyConfig and load particular configuration filename - * @param configFilename - */ - public WikittyConfig(String configFilename) { - setDefaultOption(Option.WIKITTY_CONFIG_FILE.getKey(), configFilename); - } + // REMOVE IT poussin 20101118, bad constructor. It not initialize correctly config +// /** +// * Create WikittyConfig and load particular configuration filename +// * @param configFilename +// */ +// public WikittyConfig(String configFilename) { +// setDefaultOption(Option.WIKITTY_CONFIG_FILE.getKey(), configFilename); +// } /** * Create WikittyConfig and use props as default value @@ -117,7 +118,7 @@ WIKITTY_STORAGE_JDBC_URL( "wikitty.storage.jdbc.host", _("JDBC url"), - "jdbc:h2:file:./target/data/data", String.class, false, false), + "jdbc:h2:file:./target/data/db", String.class, false, false), WIKITTY_STORAGE_JDBC_LOGIN( "wikitty.storage.jdbc.login", _("JDBC login name"), @@ -133,7 +134,7 @@ WIKITTY_STORAGE_JDBC_XADATASOURCE_H2_URL( "wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.URL", _("JDBC xadatasource property h2 url"), - "jdbc:h2:file:./target/data/data", String.class, false, false), + "jdbc:h2:file:./target/data/db", String.class, false, false), WIKITTY_STORAGE_JDBC_XADATASOURCE_H2_USER( "wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.user", _("JDBC xadatasource property h2 username"), @@ -234,11 +235,15 @@ _("Room to use for XMPP transporter"), "test@conference.im.codelutin.com", String.class, false, false), - WIKITTY_SLAVE_ASYNC_STORE( - "wikitty.service.slave.async.store", - _("Slave service use asyncrhonous method to send modification" - + " to master"), - "false", Boolean.class, false, false), + WIKITTY_SLAVE_SYNC_STATE_INTERVALE( + "wikitty.service.slave.sync.state.intervale", + _("Intervale in second where slave service save state" + + " synchronisation time"), + "300", Integer.class, false, false), + WIKITTY_SLAVE_SYNC_STATE_FILE( + "wikitty.service.slave.sync.state.file", + _("File path to store synchronisation state"), + "./target/data/syncState", String.class, false, false), WIKITTY_SLAVE_MASTER_URL( "wikitty.service.slave.master.hessian.endpoint", _("Master url service, where to delegate modification action"), Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-11-18 10:47:41 UTC (rev 481) @@ -191,6 +191,8 @@ * * @param securityToken security token * @param events event to replay + * @param force for to not change wikitty version (use version in wikitty + * present in event) * @return new event that represent all event passed in argument. * if arguement have: store, store, delete, clear, store. Return event * resume all by only one clear + store, because all action before clear is @@ -199,7 +201,7 @@ * two serveur must have same history ?) */ public WikittyEvent replay( - String securityToken, List<WikittyEvent> events); + String securityToken, List<WikittyEvent> events, boolean force); /** * Manage Update and creation. Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java 2010-11-18 10:47:41 UTC (rev 481) @@ -392,8 +392,9 @@ } @Override - public WikittyEvent replay(String securityToken, List<WikittyEvent> events) { - return ws.replay(securityToken, events); + public WikittyEvent replay( + String securityToken, List<WikittyEvent> events, boolean force) { + return ws.replay(securityToken, events, force); } @Override Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java 2010-11-18 10:47:41 UTC (rev 481) @@ -103,8 +103,9 @@ } @Override - public WikittyEvent replay(String securityToken, List<WikittyEvent> events) { - return delegate.replay(securityToken, events); + public WikittyEvent replay( + String securityToken, List<WikittyEvent> events, boolean force) { + return delegate.replay(securityToken, events, force); } @Override Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceImpl.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceImpl.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceImpl.java 2010-11-18 10:47:41 UTC (rev 481) @@ -1048,7 +1048,8 @@ * @return */ @Override - public WikittyEvent replay(String securityToken, List<WikittyEvent> events) { + public WikittyEvent replay( + String securityToken, List<WikittyEvent> events, boolean force) { // indique qu'il faut vider la base avant de faire les ajouts boolean mustClear = false; @@ -1118,7 +1119,7 @@ result.add(eventDeleteExtension); WikittyEvent eventStoreWikitty = - store(securityToken, tx, toAddWikitty.values(), false); + store(securityToken, tx, toAddWikitty.values(), force); result.add(eventStoreWikitty); WikittyEvent eventDeleteWikitty = Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java 2010-11-18 10:47:41 UTC (rev 481) @@ -366,8 +366,9 @@ } @Override - public WikittyEvent replay(String securityToken, List<WikittyEvent> events) { - WikittyEvent result = ws.replay(securityToken, events); + public WikittyEvent replay( + String securityToken, List<WikittyEvent> events, boolean force) { + WikittyEvent result = ws.replay(securityToken, events, force); // notify listeners fireEvent(result); return result; Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java 2010-11-18 10:47:41 UTC (rev 481) @@ -142,7 +142,8 @@ } @Override - public WikittyEvent replay(String securityToken, List<WikittyEvent> events) { + public WikittyEvent replay( + String securityToken, List<WikittyEvent> events, boolean force) { String userId = getUserId(securityToken); for (WikittyEvent e : events) { if (e.getType().contains( @@ -171,7 +172,7 @@ checkDeleteExtension(securityToken, e.getDeletedExtensions()); } } - WikittyEvent result = ws.replay(securityToken, events); + WikittyEvent result = ws.replay(securityToken, events, force); return result; } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2010-11-18 10:47:41 UTC (rev 481) @@ -71,7 +71,7 @@ } public void commit(String securityToken) { - ws.replay(securityToken, events); + ws.replay(securityToken, events, false); this.tx.clear(null); events.clear(); } @@ -142,8 +142,9 @@ } @Override - public WikittyEvent replay(String securityToken, List<WikittyEvent> events) { - WikittyEvent e = tx.replay(securityToken, events); + public WikittyEvent replay( + String securityToken, List<WikittyEvent> events, boolean force) { + WikittyEvent e = tx.replay(securityToken, events, force); events.add(e); return e; } Modified: trunk/wikitty-hessian-client/src/main/java/org/nuiton/wikitty/services/WikittyServiceSlave.java =================================================================== --- trunk/wikitty-hessian-client/src/main/java/org/nuiton/wikitty/services/WikittyServiceSlave.java 2010-11-18 10:05:29 UTC (rev 480) +++ trunk/wikitty-hessian-client/src/main/java/org/nuiton/wikitty/services/WikittyServiceSlave.java 2010-11-18 10:47:41 UTC (rev 481) @@ -1,9 +1,15 @@ package org.nuiton.wikitty.services; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jivesoftware.smack.PacketListener; @@ -14,14 +20,10 @@ import org.nuiton.util.ApplicationConfig; import org.nuiton.wikitty.WikittyConfig; import org.nuiton.wikitty.WikittyException; -import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.WikittyService; import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyExtension; -import org.nuiton.wikitty.services.WikittyEvent; -import org.nuiton.wikitty.services.WikittyServiceDelegator; -import org.nuiton.wikitty.services.XMPPNotifierTransporter; import org.wikitty.hessian.WikittyHessianFactory; /** @@ -32,12 +34,22 @@ * received * * Configuration: - * <li> slave login - * <li> slave passwd * <li> master service url * <li> master service xmpp room - * <li> async store + * <li> sync state file + * <li> sync state intervale * + * Il n'est pas necessaire que l'on sache exactement quel est le dernier event + * jouer. Car on peut rejouer plusieurs fois l'event sans qu'il y ait de + * probleme. Il faut juste que l'on ne loupe pas d'event. + * + * (FIXME poussin 20101118 verifier que ca ne pose pas de probleme avec + * les numeros de version)(en fait il faudrait pour le replay utiliser par le + * slave avoir un argument force en plus pour que les numeros de version soit + * identique sur le master et le slave. Il faut verifier pourquoi lorsqu'on + * demande un force il peut y avoir un "Wikitty is obsolete" ce qui ne permet + * pas de rejouer plusieurs fois les events) + * * @author poussin * @version $Revision$ * @@ -56,15 +68,34 @@ protected WikittyService master; protected ApplicationConfig config; - protected boolean useAsync = false; + protected long lastState = -1; + + protected RandomAccessFile syncStateFile = null; + protected int syncIntervale = 300; + protected long lastStateSaveDate = -1; + public WikittyServiceSlave(ApplicationConfig config, WikittyService ws) { super(ws); this.config = config; - useAsync = config.getOptionAsBoolean(WikittyConfig.Option. - WIKITTY_SLAVE_ASYNC_STORE.getKey()); + File file = config.getOptionAsFile(WikittyConfig.Option. + WIKITTY_SLAVE_SYNC_STATE_FILE.getKey()); + if (!file.exists()) { + throw new WikittyException(String.format( + "File state %s doesn't exists. You must initialise data" + + " correctly and create state file after that before used" + + " WikittyServiceSlave", file)); + } + try { + syncStateFile = new RandomAccessFile(file, "rwd"); // d to force sync + } catch (FileNotFoundException eee) { + throw new WikittyException("Can't create file to store slave state", eee); + } + syncIntervale = config.getOptionAsInt(WikittyConfig.Option. + WIKITTY_SLAVE_SYNC_STATE_INTERVALE.getKey()); + String masterURL = config.getOption(WikittyConfig.Option. WIKITTY_SLAVE_MASTER_URL.getKey()); @@ -75,8 +106,37 @@ initXMPP(config); } + protected long getLastState() { + if (lastState == -1) { + try { + // read state from file + syncStateFile.seek(0); + lastState = syncStateFile.readLong(); + } catch (IOException eee) { + throw new WikittyException("Can't read state file", eee); + } + } + return lastState; + } + + protected void setLastState(long date) { + lastState = date; + // save state in file if necessary + long now = System.currentTimeMillis(); + if (lastStateSaveDate + syncIntervale < now) { + try { + // write state to file + syncStateFile.seek(0); + syncStateFile.writeLong(lastState); + lastStateSaveDate = now; + } catch (IOException eee) { + log.error("Can't write state file", eee); + } + } + } + /** - * FIXME poussin 20101117 reutilise le transporter plutot que de dupliquer le code. + * TODO poussin 20101117 reutilise le transporter plutot que de dupliquer le code. * Le probleme est de passer de la meilleur facon possible le xmpp server et la room * qui ne sont pas donnes par les memes cles de config. Il y a aussi l'historique * qu'il faut recuperer ici alors que dans le transporter qui est utilise pour les @@ -105,9 +165,9 @@ connection.loginAnonymously(); DiscussionHistory history = new DiscussionHistory(); - // FIXME poussin 20101113 compute amount of log history to retrieve // MUC must be archived - Date date = new Date(); + long lastDate = getLastState(); + Date date = new Date(lastDate); history.setSince(date); // connection to the volatile room @@ -143,15 +203,16 @@ protected void processRemoteEvent(WikittyEvent event) { // rejoue l'event en local - replay(null, Collections.singletonList(event)); + replay(null, Collections.singletonList(event), true); - // FIXME poussin 20101117 marquer cet event comme etant le dernier recu et rejouer + // marque cet event comme etant le dernier recu et rejouer + setLastState(event.getTime()); } ////////////////////////////////////////////////////// // // W I K I T T Y S E R V I C E M E T H O D S - // + // method that must be done on master ////////////////////////////////////////////////////// @Override
participants (1)
-
bpoussin@users.nuiton.org