Как перехватить и авторизовать ввод данных пользователем с помощью сервера

Краткое введение:

У меня есть [физический] каркас моделирования, который раньше был однопользовательской настольной версией. Фреймворк служит набором инструментов для включения, например, учителя для создания различных видов симуляторов без глубоких знаний программирования на Java и / или специальной математики. В конце концов пришла идея применить парадигму клиент-сервер к фреймворку, чтобы позволить нескольким клиентам сотрудничать при работе с одной и той же симуляцией (= для синхронизации симуляции для всех клиентов).

Некоторые дополнительные технические факты:

фреймворк / моделирование разработаны на основе шаблона MVC.

Если клиент выполняет изменения в моделировании - например, через графический интерфейс Swing путем перемещения ползунка или перетаскивания элементов моделирования с помощью мыши - эти изменения должны быть санкционированы сервером до того, как они будут применены к моделированию (+ сервер должен позаботиться о распространении изменений среди всех других клиентов, которые также должны их применить).

Сама авторизация очень проста и в основном определяет только временные метки, является ли изменение должно быть принято (чтобы избежать проблем, вызванных клиентами с разными задержками, вызывающими изменения одного и того же объекта в [почти] одно и то же время).

Проблема, соответственно, вопрос:

Теперь мне интересно, что это за элегантный способ обнаруживать (и перехватывать) вводимые пользователем данные (передавать их в базовую систему обмена сообщениями, отвечающую за связь клиент-сервер)? Есть ли какой-то шаблон или передовой опыт, который обычно используется для описанного сценария?

Одна из моих основных проблем - избежать введения новых ограничений, которые должны быть приняты во внимание людьми, использующими структуру для создания нового контента ( = моделирование). В этом смысле я хотел бы, чтобы существующие симуляции работали с минимально возможным количеством необходимых изменений.

Одно решение, которое, как я думал, могло сработать:

Я думал о введении нового интерфейса, например:

public interface Synchronizable {
  public boolean appliesChanges();
}

Ограничение в этом случае будет то, что слушатели изменений любого типа должны будут дополнительно реализовать этот интерфейс, если они хотят, чтобы события изменения, которые они прослушивают, были синхронизированы. Таким образом, базовая структура могла бы заменить все объекты, реализующие Synchronizable, прокси-объектами, отвечающими за проверку изменения [события] на сервере (и при успешной пересылке события реальному слушателю изменений).

Идея, лежащая в основе 'applyChanges 'метод заключается в том, что не все вызовы слушателя изменений действительно приводят к изменению, которое требует синхронизации. Например, Swing JSlider может генерировать события всякий раз, когда ручка перемещается, но конкретная реализация слушателя изменений может применить реальное изменение только после того, как ручка будет отпущена (то есть «значение больше не регулируется»). События изменения, происходящие между ними, не нужно отправлять на сервер, поскольку они в любом случае не имеют никакого эффекта. Такой подход не был бы ни удобным, ни особенно красивым, но я не мог придумать другой возможности решить проблему другим способом?!

Помимо проблемы, конечные пользователи должны будут явно думать о том, какие события они хотели бы синхронизировать (и поэтому объявить и реализовать упомянутый интерфейс для всех конкретных слушателей), осталась одна проблема - как автоматически определить, какой конкретный метод отвечает за обработку событий произвольного типа (чтобы избежать необходимости реализовывать конкретные прокси для каждого возможного изменения слушатель).

Пример, описывающий эту проблему:

public interface SynchronizedChangeListener extends ChangeListener, Synchronizable {}
public interface SynchronizedPropertyChangeListener extends PropertyChangeListener, Synchronizable {}

public static void main(String[] args) {

  SynchronizedChangeListener scl = new SynchronizedChangeListener() {
    public void stateChanged(ChangeEvent e) {
      System.out.println("Hello world - SynchronizedChangeListener");
    }
    public boolean appliesChanges() {
      return true;
    }
  };
  SynchronizedPropertyChangeListener spcl = new SynchronizedPropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent evt) {
      System.out.println("Hello world - SynchronizedPropertyChangeListener");
    }
    public boolean appliesChanges() {
      return true;
    }
  };
}

Как прокси-прослушиватель узнает, что для PropertyChangeEvents он должен вызвать метод propertyChange, тогда как для ChangeEvents он должен вызвать метод stateChanged? Способна ли рефлексия решить эту проблему?

С нетерпением жду ваших отзывов - я был бы рад любым мыслям, которые у вас могут возникнуть, или любым перенаправлениям литературы по этой теме.

7
задан ChristianS 15 August 2011 в 20:22
поделиться