2012-05-12 11 views
5

Antecedentes: me gustaría crear una aplicación parecida al bloc de notas en la que varias personas puedan editar un documento/bloc de notas. Ya he creado la interfaz gráfica y ahora quiero comenzar a investigar la parte de colaboración multi usuario.Creación de un Bloc de notas de colaboración en tiempo real en Java

Preguntas: ¿Cómo puedo obtener el texto del cuadro de texto de un cliente para ir al cuadro de texto de otro cliente. ¿Estaré usando enchufes? ¿Dónde almacenaré el texto que se va a compartir con todos los clientes? ¿Qué tendría que usar/hacer para crear un cuadro de texto colaborativo en tiempo real que funcione? ¿Cuál es un buen punto de partida desde el cual puedo investigar?

Ejemplos: Etherpad.com/Titanpad.com/o Piratepad.com Docs.Google.com (Excepto Quiero crear una aplicación de escritorio, no un sitio web)

Dirigiéndose a algunas de las preguntas que han surgido en las respuestas:

¿Cómo los usuarios elegir un documento que desea editar: Sí

¿de qué manera los usuarios crear nuevos documentos: al seleccionar la opción Nuevo archivo en el menú principal

¿Qué pasa si muchos usuarios intentan editar el mismo documento en una vez? : Todos pueden editar el documento.

¿Es necesario que un usuario haga clic en el botón "Guardar" antes de que se reflejen los cambios? : No, los cambios deben reflejarse simultáneamente

¿Los usuarios deben iniciar sesión? : Sí

¿Alguien puede editar cualquier documento, o hay restricciones de acceso? : Hay restricciones, es decir. creador del documento podría evitar que un usuario edite documentos ...

Respuesta

2

El primer paso para buscar una solución es definir el resultado final deseado con suficiente detalle. En lugar de considerar solo la parte de colaboración multiusuario, intente describir la experiencia de usuario completa:

  • ¿Cómo eligen los usuarios el documento que desean editar?
  • ¿Cómo crean los usuarios nuevos documentos?
  • ¿Qué sucede si muchos usuarios intentan editar el mismo documento a la vez?
  • ¿Necesita un usuario hacer clic en un botón "guardar" antes de que se reflejen los cambios?
  • ¿Los usuarios deben iniciar sesión?
  • ¿Alguien puede editar cualquier documento, o hay restricciones de acceso?

Al pensar en estas decisiones de diseño, eventualmente terminará con algunas preguntas de implementación específicas que luego puede intentar responder.

+0

He escrito una "Hoja de planificación de programas" muy específica que responde a todas esas preguntas. Mi primer paso es obtener un simple cuadro de texto colaborativo del cual pueda construir. – Singh

+0

Pregunta editada respondiendo esas preguntas específicas, – Singh

0

definitivamente hay que buscar en el código fuente de etherpad.Especially Collab_server.js .Eso es el archivo principal, que hace mucho functionalists.One del método principal de este archivo es la siguiente puede ser digno de la comprobación:

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); 
} 

Puede ser que esto te ayude a empezar.

+0

Gracias por decirme dónde buscar. Descargué la fuente hace muchas semanas, pero no sabía por dónde empezar a buscar. – Singh

0

Eche un vistazo a Operational transformation, que es lo que Google estaba usando para su producto Wave (discontinuado). Consulte here para ver los enlaces relevantes a sus bibliotecas.

Cuestiones relacionadas