06 Sep, 2013

3 commits

  • Added ChangelogDB interface to abstract all the remaining code away from JE.
    
    
    
    ChangelogDB.java, ChangelogState.java, Pair.java: ADDED
    
    JEChangelogDB.java: ADDED
    Created from code in ReplicationServer and ReplicationServerDomain.
    
    
    ReplicationServer.java:
    Moved a lot of code to JEChangelogDB.
    Added ChangelogDB field and delegated existing method calls to it.
    Added getChangelogDB().
    Made getChangeNumberIndexDB() package protected for the tests.
    
    ReplicationServerDomain.java:
    Moved a lot of code to JEChangelogDB.
    Replaced sourceDbHandlers field with ChangelogDB field.
    Renamed publishMessage() to publishUpdateMsg().
    FIXME!!!! Bug: generationIdSavedStatus is not protected by synchronized (sourceDbHandlers) !!!!!
    
    ReplicationDbEnv.java:
    Changed void initializeFromChangelogStateDB() to ChangelogState readChangelogState()
    
    
    ExternalChangeLogTest.java:
    Moved from package org.opends.server.replication to org.opends.server.replication.server.
    Extracted method getReplicationDomainStartState()
    
    ChangelogException.java:
    Changed one ctor visibility to public.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9524 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Little code cleanup.
    Extracted a few methods and removed duplicated/unused code.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9518 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Renamed CNIndexData to CNIndexRecord.
    
    
    ChangeNumberIndexDB.java:
    Renamed getCNIndexData(changeNumber),  getFirstCNIndexData(), getLastCNIndexData() to getRecord(changeNumber), getFirstRecord(),  getLastRecord().
    
    ChangeNumberIndexDBCursor.java:
    Renamed getCNIndexData() to getRecord().
    
    
    *.java:
    Consequence of these changes.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9516 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

05 Sep, 2013

3 commits

  • 
    Fixed a few bugs (introduced in the previous commits?):
    - All code must check that the result of calling ChangeNumberIndexDB.getFirstCNIndexData() and ChangeNumberIndexDB.getLastCNIndexData() are not null (if the DB is empty, or closed, etc.).
    - In ReplicationServer.clearGenerationId(), the code could have a side effect if the last entry in the DB was cleared by this method: the lastGeneratedChangeNumber would be allowed to go back!
    
    
    ChangeNumberIndexDB.java:
    Removed getLastChangeNumber().
    
    DraftCNDbHandler.java:
    Inlined getLastChangeNumber() to the only remaining method caller ReplicationServer.getChangeNumberIndexDB().
    Finally changed the implementation of isEmpty() to something less costly.
    
    DraftCNDbHandlerTest.java:
    Inlined getFirstChangeNumber() and getLastChangeNumber().
    
    
    ReplicationServer.java:
    In clearGenerationId(), removed the code changing the value of lastGeneratedChangeNumber: lastGeneratedChangeNumber is not allowed to go backward.
    In getChangeNumberIndexDB(), inlined here the code of DraftCNDbHandler.getLastChangeNumber() + removed useless use of MessageBuilder.
    In getECLChangeNumberLimits(), added a null check for the result of getLastCNIndexData().
    
    replication.properties:
    Added a new error message.
    Changed MILD_ERR_DRAFT_CHANGENUMBER_DATABASE_173 to MILD_ERR_CHANGENUMBER_DATABASE_173.
    
    
    ECLServerHandler.java:
    In findCookie(), replaced the DB empty checks by null checks on the return of getFirstCNIndexData() and getLastCNIndexData() since this is purely equivalent.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9511 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Remainder of r9504: changed changeNumber from int to long.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9509 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • 
    Added CNIndexData class to replace the conjunct use of the (CSN, baseDN, previousCookie) tuple along with the changeNumber.
    It allowed to replace:
    - several parameters list with all theses types
    - several groups of methods returning instances of these types with duplicate code in the implementation.
    
    Remainder of r9504: changed changeNumber from int to long.
    
    
    CNIndexData.java: ADDED
    
    *.java:
    Consequence of introducing CNIndexData class.
    
    
    ECLServerHandler.java:
    Renamed releaseIterator() into releaseCursor().
    In getNextECLUpdate(), aggregated consecutive if statements + added a debugInfo().
    Renamed assignNewDraftCNAndStore() to assignNewChangeNumberAndStore().
    Changed changeNumber from int to long.
    
    ChangeNumberIndexDB.java:
    Replaced getCSN(), getBaseDN() and getPreviousCookie() by getCNIndexData().
    Renamed getFirstChangeNumber() to getFirstCNIndexData().
    Added getLastCNIndexData().
    Changed add() signature.
    
    DraftCNDbHandler.java
    Consequence of the change to implemented interface ChangeNumberIndexDB.
    Changed changeNumber from int to long.
    Added getChangeNumber().
    
    
    ChangeNumberIndexDBCursor.java:
    Replaced getCSN(), getBaseDN() and getPreviousCookie() by getCNIndexData().
    
    DraftCNDbIterator.java
    Consequence of the change to implemented interface ChangeNumberIndexDBCursor.
    
    
    DraftCNData.java:
    Added changeNumber field + getter.
    Replaced fields value, baseDN and csn by cnIndexData + getters.
    Renamed readFirstChangeNumber() and readLastChangeNumber() to readFirstCNIndexData() and readLastCNIndexData().
    Added newCNIndexData().
    In inner class DraftCNDBCursor, Field key is now a ReplicationDraftCNKey (was DatabaseEntry) + DraftCNData field has been replaced with CNIndexData + entry is initialized on construction.
    Replaced currentValue(), currentBaseDN(), currentCSN() and currentKey() by currentData().
    Removed getKey().
    
    ReplicationDraftCNKey.java:
    Added a default ctor.
    In getChangeNumber(), matched the code in DraftCNDB.
    
    DraftCNDbHandlerTest.java:
    Added assertEqualTo(), getFirstChangeNumber(), getLastChangeNumber(), getPreviousCookie().
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9508 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

04 Sep, 2013

6 commits

  • Change one field from Long to long.
    
    SearchOperationBasis*.java:
    Extracted method getSizeLimit() and getTimeLimit().
    
    ExternalChangeLogTest.java:
    Simplified the code.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9506 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • 
    After talking Matthew's over the phone review, did a few changes described down below.
    
    *.java:
    Changed changeNumber from int to long throughout the replication code base.
    
    ECLUpdateMsg.java:
    In getBytes(), did not complete the change to long because it would require a protocol version change.
    
    
    ReplicaDBCursor.java:
    Now extends Comparable.
    
    ReplicaDBCursorComparator.java: REMOVED
    Code has been moved to JEReplicaDBCursor.compareTo().
    
    
    ChangeNumberIndexDB.java:
    Does not extend Runnable anymore (mistake from earlier refactorings).
    
    DraftCNDbHandler.java:
    Now extends Runnable.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9504 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • * all impacted tests pass.
    
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9503 41b1ffd8-f28e-4786-ab96-9950f0a78031
    matthew
     
  • - "draft change number" to "change number"
    - "draftCN" to "change number"
    - "sn" to "cn" in tests.
    Fixed wrong usage of seqnum (only defined for CSNs - see the various IETF draft)
    
    Now remains to rename a few classes.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9501 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Fixed a small bug that I introduced in the previous commit by removing ENTRYUUID from the Set of attributes. Also, apparently "*" encodes for user attributes (and not operational).
    
    ExternalChangeLogTest.java:
    In ALL_ATTRIBUTES, changed the order of the attributes to match the order mentioned in the javadoc.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9499 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • - ChangelogDB to ChangeNumberIndexDB
    - ChangelogDBIterator to ChangeNumberIndexDBCursor
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9498 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

03 Sep, 2013

1 commit

  • Reverted if statement conditions to do early exit in loops or methods.
    Reduced variable scopes.
    Moved clearJEBackend() to TestCaseUtils and renamed it clearJEBackend2().
    Extracted method allOperationalAttributes.
    Increased vertical density.
    
    ReplicationServerDomain.java:
    Fixed javadocs.
    
    *Test*.java:
    Used TestCaseUtils.clearJEBackend2().
    Various refactorings.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9494 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

02 Sep, 2013

4 commits


30 Aug, 2013

3 commits

  • Renamed:
    - ReplicationDBCursor to ReplicaDBCursor
    - ReplicationDBCursorComparator to ReplicaDBCursorComparator
    - JEReplicationDBCursor to JEReplicaDBCursor
    
    Fixed javadocs, variable names, method names, etc.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9482 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Renamed:
    - ReplicationIterator to ReplicationDBCursor
    - ReplicationIteratorComparator to ReplicationDBCursorComparator
    - JEReplicationIterator to JEReplicationDBCursor
    
    Fixed javadocs, variable names, method names, etc.
    
    ReplicationServerDomain.java:
    Renamed getChangelogIterator() to getCursorFrom().
    
    DbHandler.java:
    Renamed generateIterator() to generateCursorFrom().
    
    MessageHandler.java:
    Extracted nextOldestUpdateMsg() and findOldestChangeNumberFromReplicationDBs() to increase code expressiveness.
    
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9478 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Added compareToEquivalentToEquals(), hashCodesEqualWhenChangeNumbersEqual(), hashCodesEqualWhenCompareToEqual() to verify basic properties are covered.
    Code cleanup.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9477 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

27 Aug, 2013

3 commits

  • git-svn-id: https://svn.forgerock.org/opendj/trunk@9464 41b1ffd8-f28e-4786-ab96-9950f0a78031
    csovant
     
  • Removed parameters obscuring the code.
    
    
    ReplicationServerDomain.java:
    Renamed getServers() to getServerIds().
    
    MessageHandler.java:
    In getDomain(), removed createIfNotExist which was always true in calling code + called ReplicationServer.waitConnections() here.
    In getRcvMsgQueueSize(), used early exit.
    
    ReplicationServer.java:
    In getReplicationServerDomain() methods, removed the create parameter.
    Also extracted the waitConnections() method and called it higher up in the call hierarchy.
    Created initDomainGenerationID() and addServerIdToDomain() methods here from code in ReplicationDbEnv.java
    In runConnect(), collapsed if statements.
    
    
    *.java
    Consequence of the changes to:
    - ReplicationServerDomain.getServers()
    - ReplicationServer.getReplicationServerDomain()
    - ReplicationServer.initDomainGenerationID() and addServerIdToDomain()
    
    GenerationIdTest.java:
    Extracted method isDegradedDueToGenerationId().
    
    InitOnLineTest.java:
    Extracted method getConnectedDSServerIds().
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9461 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Assigned serverIdToChangeNumber field in the declaration.
    In reload(), called update().
    In cover(ServerState), cover(ChangeNumber).
    In duplicate(), called Map.putAll().
    
    DraftCNDbHandler.java:
    In clear(String), removed useless code.
    
    ExternalChangeLogTest.java:
    Renamed createDomain() to startNewDomain().
    In initializeTestBackend(), removed one parameter.
    Renamed removeTestBackend2() to removeTestBackend() + Removed useless null checks around the calls to it.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9460 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

26 Aug, 2013

4 commits

  • Also made the code more explicit.
    
    
    DraftCNBDHandler.java, ChangelogDB.java:
    Renamed firstkey and lastkey to firstDraftCN and lastDraftCN + renamed getters too.
    In clear() added very a important comment about unreliable method call + renamed currentkey local variable to currentDraftCN + used final keyword.
    
    ECLServerHandler.java:
    Renamed all the *Key local variables to *DraftCN where possible.
    
    ReplicationServer.java:
    Renamed field replicationServers to replicationServerUrls.
    Changed excludedBaseDNs from Collection to Set.
    Did some renaming here and there.
    Extracted method contains().
    In getECLDraftCNLimits(), used primitive variables. There was some code that worked by chance more than by design: see in the old code "if (newestDate == 0L)"
    
    DraftCNDbHandlerTest.java:
    Renamed firstkey to firstDraftCN.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9458 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • git-svn-id: https://svn.forgerock.org/opendj/trunk@9457 41b1ffd8-f28e-4786-ab96-9950f0a78031
    csovant
     
  • git-svn-id: https://svn.forgerock.org/opendj/trunk@9456 41b1ffd8-f28e-4786-ab96-9950f0a78031
    violette
     
  • Introduced interfaces ChangelogDB and ChangelogDBIterator to remove direct dependencies to org.opends.server.replication.server.changelog.je .
    The interfaces remain similar to the old classes DraftCNDbHandler and DraftCNDbIterator, but:
    - I plan to introduce more changes to rework a bit these interfaces
    - They reduce the number of accessible methods for client code
    
    
    ChangelogDB.java: ADDED
    Renamed getValue() to getPreviousCookie().
    
    ChangelogDBIterator.java: ADDED
    Renamed releaseCursor() to close().
    
    
    *.java:
    Consequence of the use of the new interfaces.
    Renamed instance variables, local variables and method parameters to accommodate the new classes.
    Also renamed variables and methods to better explicit their role.	
    Also reworked javadocs and comments.
    
    
    ReplicationServer.java:
    Extracted method contains().
    In getEligibleCN(), reworked the code to avoid computing debug information if debug is off.
    Renamed local variables.
    Removed useless comments.
    
    DraftCNDB.java:
    Removed unused instance member ReplicationServer.
    
    DraftCNDbHandler.java:
    Now implements ChangelogDB.
    Consequence of change to DraftCNDB.
    Extracted method debugException().
    Removed releaseReadCursor() (Replaced by StaticUtils.close()).
    
    DraftCNDbIterator.java:
    Now implements ChangelogDBIterator.
    
    TestCaseUtils.java:
    In deleteDirectory(), added a null check and an exists check.
    
    DbHandlerTest.java, DraftCNDbHandlerTest.java:
    Extracted method createCleanDir().
    Removed now useless checks before calling TestCaseUtils.deleteDirectory().
    Called StaticUtils.close().
    Extracted method assertIteratorReadsInOrder().
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9455 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

23 Aug, 2013

2 commits

  • Removed test on number of entries returned:
    Eclipse gives me 33, command line run gives me 34, while Jenkins run gives me 32!!!
    What a deterministic test!
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9453 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Fixed a bug introduced in r9449.
    
    ReplicationServerTest.java:
    Extracted several methods to simplify this test.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9452 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

22 Aug, 2013

2 commits

  • Renamed releaseCursor() to close().
    Now extends Closeable.
    
    *.java:
    Consequence of the change to ReplicationIterator.
    
    MessageHandler.java:
    Removed releaseAllIterators() in favour of StaticUtils.close().
    
    ReplicationBackend.java:
    In getEntry(), used early exit.
    Used StaticUtils.close().
    Removed useless comments / code.
    Used interfaces rather than concrete classes.
    Extracted methods computeDN() and writeChangeRecord().
    
    ReplicationServerDomain.java:
    Removed sleep() replaced with StaticUtils.sleep().
    
    StaticUtils.java:
    Made close(Collection) more generic + now log exceptions happening when closing.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9446 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Code cleanup.
    
    
    MonitoringPublisher.java:
    Removed one call to a setter.
    
    ReplicationDomainMonitor.java:
    Renamed computeDomainMonitorData() to recomputeMonitorData().
    
    ReplicationServerDomain.java:
    Renamed replyWithMonitorMsg() to replyWithTopologyMonitorMsg().
    
    ReplicationDomainTest.java:
    Extracted methods createReplicationServer(), assertExpectedServerStatuses(), disable(), remove().
    Replaced assertTrue() with assertEquals().
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9439 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

20 Aug, 2013

2 commits

  • Fixed off-by-one error.
    
    FractionalReplicationTest.java:
    Removed try / catch / fail test anti pattern.
    Removed useless comments.
    Extracted method waitTillEntryHasSynchroAttribute().
    Made attributes private.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9432 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • It was due to a side effect of the last commit as well as several locations where cleanup wasn't properly done after a test.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9429 41b1ffd8-f28e-4786-ab96-9950f0a78031
    ludo
     

19 Aug, 2013

1 commit


14 Aug, 2013

3 commits

  • Renamed directoryServers to connectedDSs.
    Renamed replicationServers to connectedRSs.
    Removed the useless getConnectedLDAPservers(), replaced with getConnectedDSs().
    Renamed a few local variables.
    
    DataServerHandler.java:
    Consequence of removing to ReplicationServerDomain.getConnectedLDAPservers()
    Extracted method changeStatus() from changeStatusFromStatusAnalyzer() and changeStatusForResetGenId().
    Extracted method getStatusMachineEvent() from changeStatusForResetGenId().
    
    InitOnLineTest.java
    Consequence of removing to ReplicationServerDomain.getConnectedLDAPservers().
    Removed useless try / catch / fail.
    Extracted methods getCompletionTime(), assertAttributeValue().
    Used Assertions.assertThat().
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9418 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • - Updated i18n/datacomparison reference file
     
    
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9417 41b1ffd8-f28e-4786-ab96-9950f0a78031
    csovant
     
  • Removed ReplicationServerDomain.getReplicationServer() to follow the Law of Demeter: "Only talk to your immediate friends." to promote loose coupling.
    Changed approxFirstMissingDate from Long object to long primitive.
    
    
    ReplicationServerDomain.java:
    Removed getReplicationServer().
    Added getLocalRSMonitorInstanceName() and getLocalRSServerId().
    
    *.java:
    Used the newly added ReplicationServerDomain.getLocalRSMonitorInstanceName() and ReplicationServerDomain.getLocalRSServerId().
    
    LightweightServerHandler.java:
    Removed getLocalRSMonitorInstanceName().
    
    
    MonitorMsg.java, MonitorData.java:
    Changed firstMissingDate from Long object to long primitive.
    Used StringBuilder in toString().
    
    SynchronizationMsgTest.java
    Changed approxFirstMissingDate from Long object to long primitive.
    Extracted methods newList(), newSet(), getEntryAttributes(), assertAttributesEqual().
    Used assertEquals() instead of assertTrue().
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9415 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     

13 Aug, 2013

3 commits

  • Moved all JE changelog related classes to the new package org.opends.server.replication.server.changelog.je
    
    
    
    DbHandler.java, DraftCNData.java, DraftCNDB.java, DraftCNDbHandler.java, DraftCNDbIterator.java, JEReplicationIterator.java, package-info.java, ReplicationData.java, ReplicationDB.java, ReplicationDbEnv.java, ReplicationDraftCNKey.java, DbHandlerTest.java, DraftCNDbHandlerTest.java:
    Moved to package org.opends.server.replication.server.changelog.je
    
    ReplicationServer.java:
    Updated the imports.
    Made getTrimAge() public.
    Removed use of "this" from method invocation.
    Moved handleUnexpectedChangelogException() to ReplicationDbEnv.
    
    DraftCNDB.java, ReplicationDB.java:
    Moved handleUnexpectedDatabaseException() to ReplicationDbEnv.
    
    ReplicationDbEnv.java:
    Moved handleUnexpectedChangelogException() here from ReplicationServer, and renamed it to shutdownOnException().
    Moved handleUnexpectedDatabaseException() here from DraftCNDB and ReplicationDB, and renamed it to shutdownOnException().
    
    ECLServerHandler.java, ReplicationServerDomain.java, ExternalChangeLogTest.java:
    Updated the imports.
    
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9411 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Extracted interface org.opends.server.replication.server.changelog.api.ReplicationIterator from org.opends.server.replication.server.ReplicationIterator and used it in all the places where the class was used.
    Renamed ReplicationIterator class to JEReplicationIterator.
    Moved ReplicationIteratorComparator from package org.opends.server.replication.server to org.opends.server.replication.server.changelog.api.
    
    MessageHandler.java:
    Minimal code cleanup.
    
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9409 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac
     
  • Extracted constants SERVER_ID_1 and SERVER_ID_2.
    Renamed getAttributeValue() to getAttributeValueOrNull().
    Extracted new getAttributeValue() from getAttributeValueOrNull(), checkValue() and checkPossibleValues().
    In ECLGetEligibleCountTest(), extracted constants to better explicit the code + removed the count local variable + extracted method now()
    Removed useless code blocks.
    
    ReplicationServerDomain.java:
    In getEligibleCount(), removed a useless if statement.
    
    git-svn-id: https://svn.forgerock.org/opendj/trunk@9406 41b1ffd8-f28e-4786-ab96-9950f0a78031
    JnRouvignac