ICEpush
  1. ICEpush
  2. PUSH-16

Create a GWT Integration Bundle

    Details

    • Type: New Feature New Feature
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 2.0.0
    • Component/s: Push Library
    • Labels:
      None
    • Environment:
      Google Web Toolkit on all Browser platforms.

      Description

      This is a JIRA feature request that will capture all the design decisions for the GWT integration bundle. Issues with the GWT Chat application should go to PUSH-7

        Activity

        Patrick Wilson created issue -
        Patrick Wilson made changes -
        Field Original Value New Value
        Assignee Patrick Wilson [ patrick.wilson ]
        Patrick Wilson made changes -
        Status Open [ 1 ] In Progress [ 3 ]
        Patrick Wilson made changes -
        Description This is a JIRA feature request that will capture all the design decisions for the GWT integration bundle. Issues with the Chat application should go to PUSH-7 This is a JIRA feature request that will capture all the design decisions for the GWT integration bundle. Issues with the GWT Chat application should go to PUSH-7
        Hide
        Patrick Wilson added a comment -

        It was decided early in the design cycle that the ICEpush integration for GWT should be an wrapping of the ICEpush Javascript API. However, the exposed GWT push API must look more like Java style operations rather than Javascript ones. In this spirit, a GWT application will be able to register Java Listeners to push groups. I expect the have an interface called PushEventListener that will provide a single callback method onPushEvent(). The implementing class can then provide the application logic that should be executed when a push event is received.

        Show
        Patrick Wilson added a comment - It was decided early in the design cycle that the ICEpush integration for GWT should be an wrapping of the ICEpush Javascript API. However, the exposed GWT push API must look more like Java style operations rather than Javascript ones. In this spirit, a GWT application will be able to register Java Listeners to push groups. I expect the have an interface called PushEventListener that will provide a single callback method onPushEvent(). The implementing class can then provide the application logic that should be executed when a push event is received.
        Hide
        Patrick Wilson added a comment -

        It seems that wrapping the provided Javascript API into a LIstener pattern is not as easy as at first anticipated. It is desirable to abstract the notion of a PushId from the end user of the API. Thus the Listener must hold some state to keep the push id from the developer. As such I changed PushEventListener from an interface into an abstract class that store the push id and groups. This will allow the integration controller to maintain the list of registered groups and also make it possible for listeners to be removed from the context.

        Show
        Patrick Wilson added a comment - It seems that wrapping the provided Javascript API into a LIstener pattern is not as easy as at first anticipated. It is desirable to abstract the notion of a PushId from the end user of the API. Thus the Listener must hold some state to keep the push id from the developer. As such I changed PushEventListener from an interface into an abstract class that store the push id and groups. This will allow the integration controller to maintain the list of registered groups and also make it possible for listeners to be removed from the context.
        Hide
        Patrick Wilson added a comment -

        The suggested method for calling native javascript from GWT is to declare methods as 'native' and then write javascript code in the method body. The first step of the integration is to wrap each of the push javascript api calls into GWT native calls. Specifically the following methods will be wrapped:

        ice.push.createPushId()
        ice.push.addGroupMember()
        ice.push.removeGroupMember()
        ice.push.register() [this method will take different paramters - push id and a GWT pushEventListener]

        I decided not to wrap the ice.push.notify() method until the security issues had been sorted out.

        The high level GWt integration methods GWTPushContext.addPushListener() and GWTPushContext.removePushListener() will be compositions of the previously mentioned native calls.

        Show
        Patrick Wilson added a comment - The suggested method for calling native javascript from GWT is to declare methods as 'native' and then write javascript code in the method body. The first step of the integration is to wrap each of the push javascript api calls into GWT native calls. Specifically the following methods will be wrapped: ice.push.createPushId() ice.push.addGroupMember() ice.push.removeGroupMember() ice.push.register() [this method will take different paramters - push id and a GWT pushEventListener] I decided not to wrap the ice.push.notify() method until the security issues had been sorted out. The high level GWt integration methods GWTPushContext.addPushListener() and GWTPushContext.removePushListener() will be compositions of the previously mentioned native calls.
        Hide
        Patrick Wilson added a comment -

        In an effort to make the integration testable, I am extracting the native methods out of the class GWTPushContext and placing them in a new class which extends the interface IcePushClientLibrary. That way the IcePushClientLibrary methods can be mocked by JMock and the GWTPushContext class can be tested.

        Show
        Patrick Wilson added a comment - In an effort to make the integration testable, I am extracting the native methods out of the class GWTPushContext and placing them in a new class which extends the interface IcePushClientLibrary. That way the IcePushClientLibrary methods can be mocked by JMock and the GWTPushContext class can be tested.
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #20146 Thu Jan 07 14:49:15 MST 2010 patrick.wilson PUSH-16: added junit and jmock libraries to gwt project lib dir (will probably need to migrate these libs to a common folder for other integrations to use. Added JMock tests for the GWTPushContext.java class.
        Files Changed
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/src/org/icepush/samples/icechat/gwt/client/NativePushLibraryImpl.java
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/objenesis-1.0.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/junit/junit-4.8.1.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/cglib-nodep-2.1_3.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/junit
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/jmock-junit4-2.5.1.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/hamcrest-library-1.1.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/jmock-script-2.5.1.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/jmock-legacy-2.5.1.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/hamcrest-core-1.1.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/test/org/icepush/samples/icechat/gwt/client/GWTPushContextTests.java
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/bsh-core-2.0b4.jar
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/cglib-2.1_3-src.jar
        Commit graph MODIFY /scratchpads/snowplow/samples/icechat/web/gwt/src/org/icepush/samples/icechat/gwt/client/GWTPushContext.java
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/jmock-junit3-2.5.1.jar
        Commit graph MODIFY /scratchpads/snowplow/samples/icechat/web/gwt/test/org/icepush/samples/icechat/gwt/client
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests/jmock/jmock-2.5.1.jar
        Commit graph MODIFY /scratchpads/snowplow/samples/icechat/web/gwt/build.xml
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/src/org/icepush/samples/icechat/gwt/client/IcePushClientLibrary.java
        Commit graph ADD /scratchpads/snowplow/samples/icechat/web/gwt/lib/tests
        Hide
        Patrick Wilson added a comment -

        Started to extract the Push Integration code from the Chat application into the integrations project. The 4 integration classes are now being bundled as a jar with a GWT module descriptor file included. This jar can then be added to a project and used. (requires a single line entry in the end user's gwt module descriptor to inherit the client side code.).

        Show
        Patrick Wilson added a comment - Started to extract the Push Integration code from the Chat application into the integrations project. The 4 integration classes are now being bundled as a jar with a GWT module descriptor file included. This jar can then be added to a project and used. (requires a single line entry in the end user's gwt module descriptor to inherit the client side code.).
        Hide
        Patrick Wilson added a comment -

        After some issues involving complexities with the low level API provided in the GWT integration thus far it became apparent that a higher level API using a command queue might be useful to provide to developers. The reasoning for this is as follows:

        1.) Several of the low level optimizations in the Push framework are hidden from the developer - how ever they have side effects which the developers must be aware of. A noteworthy example is how ICEpush buffers notifications. If more than one notification is triggered in a short period of time, the JS callback may not actually be executed on a one to one basis. This behavior is actually desirable for performance but can be unpredictable if the application developer is not aware of it.

        2.) A command pattern is a robust design pattern for receiving and handling different types of updates.

        More details to come

        Show
        Patrick Wilson added a comment - After some issues involving complexities with the low level API provided in the GWT integration thus far it became apparent that a higher level API using a command queue might be useful to provide to developers. The reasoning for this is as follows: 1.) Several of the low level optimizations in the Push framework are hidden from the developer - how ever they have side effects which the developers must be aware of. A noteworthy example is how ICEpush buffers notifications. If more than one notification is triggered in a short period of time, the JS callback may not actually be executed on a one to one basis. This behavior is actually desirable for performance but can be unpredictable if the application developer is not aware of it. 2.) A command pattern is a robust design pattern for receiving and handling different types of updates. More details to come
        Hide
        Patrick Wilson added a comment -

        Added a simple sample application that is an extension of the greeting application that the GWT webAppCreator utility creates.

        Show
        Patrick Wilson added a comment - Added a simple sample application that is an extension of the greeting application that the GWT webAppCreator utility creates.
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #20443 Mon Feb 01 15:25:13 MST 2010 patrick.wilson Push-16: created a context listener to setup the GWT push command queue. finished first cut at the command queue API for GWT and ICEpush
        Files Changed
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/lib/gwt/gwt-servlet.jar
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/server/gwt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/ICEpush.gwt.xml
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/NativePushLibraryImpl.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/command/ClientPushCommandContext.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/server
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/IcePushClientLibrary.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/server/gwt/integration/PushCommandServiceImpl.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/command
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/GWTPushContext.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/server/gwt/integration/ClientManager.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/test/org
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/test/org/icepush/integration/gwt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/PushEventListener.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/server/gwt/integration/ServerPushCommandContext.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/test/org/icepush/integration/gwt/GWTPushContextTests.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/command/CommandFrameworkException.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/test/org/icepush/integration
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/test/org/icepush
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/server/gwt/integration
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/command/ICommandExecuter.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/command/PushCommandService.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/test
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/lib/gwt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/server/gwt/integration/PushCommandContextListener.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/lib/gwt/gwt-user.jar
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/command/ICommand.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main
        Commit graph ADD /scratchpads/snowplow/integration/gwt/core/src/main/java/org/icepush/integration/gwt/command/PushCommandServiceAsync.java
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #20444 Mon Feb 01 15:29:16 MST 2010 patrick.wilson PUSH-16: added basic sample application to demonstrate the command API.
        Files Changed
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/ParticipantEntryCommand.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/PushCommandSample.gwt.xml
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/test/org/icepush
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/ie6/vborder_gray_shadow.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/hborder.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/ParticipantEntryCommandHandler.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/PushCommandSample.html
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/WEB-INF
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/GreetingService.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/ie6/vborder_blue_shadow.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/corner.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/vborder.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/PushCommandSample.launch
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/server/GreetingServiceImpl.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/server
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/.settings
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/.project
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/.settings/com.google.gwt.eclipse.core.prefs
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/test/org
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/7CFC8ADD56E256A31E102008FAA7BAD4.gwt.rpc
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/GreetingServiceAsync.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/.settings/org.eclipse.jdt.core.prefs
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/WEB-INF/web.xml
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/WEB-INF/lib/icepush.jar
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/ie6/corner_dialog_topleft.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/pushcommandsample.nocache.js
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/hborder_ie6.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/.classpath
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/ie6/hborder_gray_shadow.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/standard.css
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/WEB-INF/lib/icepush-gwt.jar
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/test
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/F4A54A0F7CA5960AFFEBF176039A675A.gwt.rpc
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/WEB-INF/lib/gwt-servlet.jar
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/WEB-INF/lib
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/FBA0F6B4D0994D9EA44641D459BA30C5.gwt.rpc
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/build.xml
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/standard_rtl.css
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/PushCommandSample.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/test/org/icepush/samples
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/clear.cache.gif
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/test/org/icepush/samples/gwt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/hosted.html
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/README.txt
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/ie6
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/ie6/hborder_blue_shadow.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/ie6/corner_dialog_topright.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/corner_ie6.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/test/org/icepush/samples/gwt/client
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/gwt/standard/images/vborder_ie6.png
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/PushCommandSample.css
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #20445 Mon Feb 01 15:54:38 MST 2010 patrick.wilson PUSH-16: finished the command API sample application. The sample now echo's the user input to all screens
        Files Changed
        Commit graph MODIFY /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/ParticipantEntryCommand.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/MessagesPopup.java
        Commit graph ADD /scratchpads/snowplow/integration/gwt/samples/commands/war/pushcommandsample/83AD7D7889938444C8511F017F7802F7.gwt.rpc
        Commit graph MODIFY /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/server/GreetingServiceImpl.java
        Commit graph MODIFY /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/PushCommandSample.java
        Commit graph MODIFY /scratchpads/snowplow/integration/gwt/samples/commands/war/PushCommandSample.html
        Commit graph MODIFY /scratchpads/snowplow/integration/gwt/samples/commands/src/org/icepush/samples/gwt/client/ParticipantEntryCommandHandler.java
        Philip Breau made changes -
        Status In Progress [ 3 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Ken Fyten made changes -
        Fix Version/s 2.0.0 [ 10233 ]
        Ken Fyten made changes -
        Status Resolved [ 5 ] Closed [ 6 ]

          People

          • Assignee:
            Patrick Wilson
            Reporter:
            Patrick Wilson
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: