2012-05-12 31 views
5

Tło: Chciałbym stworzyć podobną do notatnika aplikację, w której wiele osób może edytować jeden dokument/notatnik. Stworzyłem już interfejs graficzny, a teraz chcę rozpocząć badanie jego części dotyczącej współpracy z wieloma użytkownikami.Tworzenie notatnika do współpracy w czasie rzeczywistym w Javie

Pytania: Jak uzyskać tekst z pola tekstowego jednego klienta, aby przejść do pola tekstowego innego klienta. Czy używałbym gniazdek? Gdzie powinienem przechowywać tekst, który będzie udostępniany wszystkim klientom? Co powinienem/powinienem użyć/zrobić, aby stworzyć działający w czasie rzeczywistym tekstowy tekst współpracy. Jaki jest dobry punkt wyjścia, z którego mogę badać?

Przykłady: Etherpad.com/Titanpad.com/Piratepad.com lub Docs.Google.com (z wyjątkiem chcę utworzyć aplikację na pulpicie, a nie na stronie internetowej)

Adresowanie kilka pytań, które powstały w odpowiedzi:

jaki sposób użytkownicy odebrać dokument chcą edycji: Tak

Jak zrobić użytkownikom tworzyć nowe dokumenty: po wybraniu opcji nowy plik w menu głównym

Co się stanie, jeśli wielu użytkowników próbować edytować ten sam dokument na pewnego razu? : Wszystkie są uprawnione do edycji dokumentu.

Czy użytkownik musi kliknąć przycisk "zapisz", zanim zmiany zostaną odzwierciedlone? : Nie, zmiany powinny być odzwierciedlone jednocześnie

Czy użytkownicy muszą się logować? : Tak

Czy każdy może edytować dowolny dokument lub czy istnieją ograniczenia dostępu? : Istnieją ograniczenia, tj. Twórca dokumentu może uniemożliwić użytkownikowi edytowanie dokumentów.

Odpowiedz

2

Pierwszy krok w poszukiwaniu rozwiązania to zdefiniować pożądany efekt końcowy w wystarczającej liczbie szczegółów. Zamiast brać pod uwagę tylko część dotyczącą współpracy dla wielu użytkowników, spróbuj opisać całą wygodę użytkownika:

  • W jaki sposób użytkownicy wybierają dokument, który chcą edytować?
  • W jaki sposób użytkownicy tworzą nowe dokumenty?
  • Co się dzieje, gdy wielu użytkowników próbuje jednocześnie edytować ten sam dokument?
  • Czy użytkownik musi kliknąć przycisk "zapisz", zanim zmiany zostaną odzwierciedlone?
  • Czy użytkownicy muszą się logować?
  • Czy ktoś może edytować dowolny dokument lub czy istnieją ograniczenia dostępu?

Myśląc przez te decyzje projektowe, ostatecznie otrzymasz kilka konkretnych pytań dotyczących implementacji, na które następnie możesz odpowiedzieć.

+0

Napisałem bardzo konkretny "Arkusz planowania programu" odpowiadający na wszystkie te pytania. Pierwszym krokiem jest uzyskanie prostego wspólnego pola tekstowego, z którego mogę się rozbudować. – Singh

+0

Pytanie edytowane odpowiadając na te konkretne pytania, – Singh

0

pewno trzeba zajrzeć do kodu źródłowego etherpad.Especially Collab_server.js Płyty te to główny plik, który robi dużo functionalists.One głównej metody tego pliku jest następujący może warto sprawdzić:

function applyUserChanges(pad, baseRev, changeset, optSocketId, optAuthor) { 
    // changeset must be already adapted to the server's apool 

    var apool = pad.pool(); 
    var r = baseRev; 
    while (r < pad.getHeadRevisionNumber()) { 
    r++; 
    var c = pad.getRevisionChangeset(r); 
    changeset = Changeset.follow(c, changeset, false, apool); 
    } 

    var prevText = pad.text(); 
    if (Changeset.oldLen(changeset) != prevText.length) { 
    _doWarn("Can't apply USER_CHANGES "+changeset+" to document of length "+ 
      prevText.length); 
    return; 
    } 

    var thisAuthor = ''; 
    if (optSocketId) { 
    var connectionId = getSocketConnectionId(optSocketId); 
    if (connectionId) { 
     var connection = getConnection(connectionId); 
     if (connection) { 
     thisAuthor = connection.data.userInfo.userId; 
     } 
    } 
    } 
    if (optAuthor) { 
    thisAuthor = optAuthor; 
    } 

    pad.appendRevision(changeset, thisAuthor); 
    var newRev = pad.getHeadRevisionNumber(); 
    if (optSocketId) { 
    _getPadRevisionSockets(pad)[newRev] = optSocketId; 
    } 

    var correctionChangeset = _correctMarkersInPad(pad.atext(), pad.pool()); 
    if (correctionChangeset) { 
    pad.appendRevision(correctionChangeset); 
    } 

    ///// make document end in blank line if it doesn't: 
    if (pad.text().lastIndexOf("\n\n") != pad.text().length-2) { 
    var nlChangeset = Changeset.makeSplice(
     pad.text(), pad.text().length-1, 0, "\n"); 
    pad.appendRevision(nlChangeset); 
    } 

    updatePadClients(pad); 

    activepads.touch(pad.getId()); 
    padevents.onEditPad(pad, thisAuthor); 
} 

Może to pomoże ci zacząć.

+0

Dziękuję za poinformowanie mnie, gdzie szukać. Pobrałem źródło wiele tygodni temu, ale nie wiedziałem, od czego zacząć. – Singh

Powiązane problemy