<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    BTW,<br>
    <br>
    I reverted #2 because it was causing some test failures. I'll put it
    back when I find the root cause.<br>
    <br>
    Thanks<br>
    <br>
    <div class="moz-cite-prefix">On 09/02/2013 05:34 PM, George Gastaldi
      wrote:<br>
    </div>
    <blockquote cite="mid:5224F649.4070609@redhat.com" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      Ok,<br>
      <br>
      3) First you need to create a class that implements the
      ResourceGenerator interface (Check
      org.jboss.forge.addon.maven.resources.MavenResourceGenerator for
      an example). Forge will automatically find your ResourceGenerator
      class and use it to create the GitIgnoreResource (be sure to
      create tests that assert this behavior)<br>
      <br>
      7) Basically the
      org.jboss.forge.git.gitignore.GitIgnoreTemplateCompleter.candidates(String)

      method is only what you need. Create a class that implements
      UICompleter, and add that behavior to the getCompletionProposals
      method.<br>
      <br>
      2) Right, I moved it to projects-api under a "ui" subpackage and
      removed it from the javaee-impl. That should work.<br>
      <br>
      8) Your getMetadata should be something like: <br>
      <br>
      super.getMetadata().name("GIT: Ignore").description("Add pattern
      to .gitignore").category(Categories.create("Git"));<br>
      <br>
      that will be translated to "git-ignore" in shell.<br>
      <br>
      <br>
      <div class="moz-cite-prefix">On 09/02/2013 04:52 PM, Ivan St.
        Ivanov wrote:<br>
      </div>
      <blockquote
cite="mid:CACYLA9GXX4c8YZgPCkNiKo3bDC-2rmLqJVmURhKi057cvNo0RA@mail.gmail.com"
        type="cite">
        <div dir="ltr">Hey George,
          <div><br>
          </div>
          <div>3) Could you please explain me a little bit, just for my
            curiosity? How would Forge know that when I "cd" to
            .gitignore file it is not merely FileResource but it is
            GitIgnoreResource? Thanks!</div>
          <div><br>
          </div>
          <div>7) I mean the&nbsp;GitIgnoreTemplateCompleter. There in the
            beginning of the complete method you can see some acrobatics
            with the&nbsp;CommandCompleterState parameter. I was wondering
            how that can be done in the new API</div>
          <div><br>
          </div>
          <div>2) At the moment&nbsp;<span
              style="font-family:arial,sans-serif;font-size:13px">AbstractProjectUICommand

              is in the <b>javaee-impl</b> project. I don't want to
              introduce dependency to that just to extend that class in
              order to use the getSelectedProject. That is why I thought
              that maybe we can find a better place for this abstract
              class.</span></div>
          <div><span style="font-family:arial,sans-serif;font-size:13px"><br>
            </span></div>
          <div><span style="font-family:arial,sans-serif;font-size:13px">8)

              OK, so if my getMetadata method declared that the name of
              the command is:</span></div>
          <div><font face="arial, sans-serif"><br>
            </font></div>
          <div><font face="arial, sans-serif">super.getMetadata().name("GIT:

              Add pattern to .gitignore")</font><br>
          </div>
          <div><font face="arial, sans-serif"><br>
            </font></div>
          <div><font face="arial, sans-serif">How would that map to a
              shell command? Should we have some kind of convention for
              these names?</font></div>
          <div><font face="arial, sans-serif"><br>
            </font></div>
          <div><font face="arial, sans-serif">Thanks again!</font></div>
          <div><font face="arial, sans-serif">Ivan</font></div>
          <div><span style="font-family:arial,sans-serif;font-size:13px"><br>
            </span></div>
        </div>
        <div class="gmail_extra"><br>
          <br>
          <div class="gmail_quote">On Mon, Sep 2, 2013 at 5:13 PM,
            George Gastaldi <span dir="ltr">&lt;<a
                moz-do-not-send="true" href="mailto:ggastald@redhat.com"
                target="_blank">ggastald@redhat.com</a>&gt;</span>
            wrote:<br>
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000"> Hi Ivan!<br>
                <br>
                3) You can safely use instanceof. It should work.
                Another option is using the reify method, so it will
                convert your resource to the desired type if it's not
                the expected type or return null if it's not possible.<br>
                <br>
                7) The completer API has completely changed from Forge
                1. Now you just need to return a list of the objects
                that matches the value passed as a parameter. Do you
                need anything specific that it is not covered in the
                UICompleter interface? Which completer are you trying to
                migrate? <br>
                <br>
                2) You no longer need getSelectedProject in
                AbstractGitCommand, use the one from
                AbstractProjectUICommand. I don't think this code fits
                in another place, but we can review that.<br>
                <br>
                8) In Forge 2, the shell no longer has a "sub-command"
                concept (Eg: cdi setup was replaced by cdi-setup). The
                shell addon automatically converts spaces into dashes so
                it's easier to find the command you need from the first
                auto-complete.<br>
                <br>
                Best Regards,<br>
                <br>
                George Gastaldi
                <div>
                  <div class="h5"><br>
                    <br>
                    <br>
                    <div>On 09/02/2013 08:30 AM, Ivan St. Ivanov wrote:<br>
                    </div>
                    <blockquote type="cite">
                      <div dir="ltr">Hey George!
                        <div><br>
                        </div>
                        <div>Thanks a lot for the quick feedback!</div>
                        <div><br>
                        </div>
                        <div>I'm afraid though that I did not get some
                          of the answers I needed:</div>
                        <div><br>
                        </div>
                        <div>3) How do you get the current resource
                          (@Current as of Forge 1)? Is
                          it&nbsp;context.getInitialSelection().get()? <b>How

                            can I check that it is of any particular
                            type (e.g.&nbsp;GitIgnoreResource)</b>?</div>
                        <div><br>
                        </div>
                        <div>[George]:&nbsp;<span
                            style="font-family:arial,sans-serif;font-size:13px">Yes,

                            the current resource is always retrieved
                            using UIContext.getInitialSelection, which
                            can be safely assigned to a
                            UISelection&lt;Resource&lt;?&gt;&gt;
                            variable.</span></div>
                        <div><br>
                        </div>
                        <div>[Ivan]: I did not get how can I check
                          whether a file resource is of
                          GitIgnoreResource type. What I can think of:
                          check whether the current resource is file and
                          that its name is
                          GitIgnoreResource.RESOURCE_NAME. I'm afraid
                          that instanceof will not work. What I am not
                          sure is how Forge knows that a certain
                          resource is of certain type (or more
                          precisely: of certain subtype of FileResource)</div>
                        <div><br>
                        </div>
                        <div><br>
                        </div>
                        <div>7) How did you migrate existing completers?
                          I see that the completer interface has
                          changed. I am afraid I can't figure out how I
                          can rework complete methods from Forge 1, that
                          were <b>using&nbsp;CommandCompleterState parameter</b>.
                          I couldn't find samples</div>
                        <div><br>
                        </div>
                        <div>[George]:&nbsp;<span
                            style="font-family:arial,sans-serif;font-size:13px">In

                            the UICommand.initializeUI method, you call
                            setCompleter for the desired injected input</span></div>
                        <div><br>
                        </div>
                        <div>[Ivan]: Yes, I found how to assign a
                          completer to an input. However I was not sure
                          how to adapt an already existing completer,
                          which received as parameter a
                          CommandCompleterState object. The existing
                          completers used that object and I don't know
                          how to rework them to use the UIContext
                          interface for the same purpose</div>
                        <div><br>
                        </div>
                        <div><br>
                        </div>
                        <div>2) I see that in javaee-impl you have
                          implemented an abstract command class that
                          exposes a class that returns the current
                          project (or null):
                          org.jboss.forge.addon.javaee.ui.AbstractProjectUICommand.
                          I copy-pasted the getSelectedProject method to
                          an abstract Git UI command class that I
                          created just becayse I saw that addon-ui does
                          not have access to the project API (outherwise
                          I would put it in the AbstractUICommand
                          class). <b>Can we find a better place for
                            this code?</b> In Forge 1 we just @Inject-ed
                          a Project instance, but now I am not sure what
                          to do</div>
                        <div><br>
                        </div>
                        <div>[George]:&nbsp;<span
                            style="font-family:arial,sans-serif;font-size:13px">Make


                            your addon depend on the projects addon and
                            you shall access these classes normally</span></div>
                        <div><br>
                        </div>
                        <div>[Ivan]: Actually I did what you proposed.
                          But now we have one and the same "protected
                          Project getSelectedProject(UIContext context)"
                          method
                          in&nbsp;org.jboss.forge.addon.javaee.ui.AbstractProjectUICommand
                          and
                          in&nbsp;org.jboss.forge.addon.git.ui.AbstractGitCommand.
                          Can we find a better place for a class like
                          AbstractProjecUICommand that is accessible
                          from anywhere where we develop commands
                          relying on a context of a project? Maybe in
                          projects-impl? Both javaee and git depend on
                          that.</div>
                        <div><br>
                        </div>
                        <div><br>
                        </div>
                        <div>And one additional question:</div>
                        <div><br>
                        </div>
                        <div>8) In Forge 1 every plugin had a short name
                          that we entered on the command line. Now I see
                          that commands have some long strings as names
                          (e.g. "JPA: New Entity"). What does the user
                          have to enter in the shell if they want to
                          create a new entity?</div>
                        <div><br>
                        </div>
                        <div>Thanks,</div>
                        <div>Ivan</div>
                      </div>
                      <div class="gmail_extra"><br>
                        <br>
                        <div class="gmail_quote">On Mon, Sep 2, 2013 at
                          12:34 AM, George Gastaldi <span dir="ltr">&lt;<a
                              moz-do-not-send="true"
                              href="mailto:ggastald@redhat.com"
                              target="_blank">ggastald@redhat.com</a>&gt;</span>
                          wrote:<br>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex">
                            <div dir="auto">
                              <div>Those are some excellent questions,
                                I'll answer then inline:</div>
                              <div><br>
                                Em 01/09/2013, &agrave;s 17:15, "Ivan St.
                                Ivanov" &lt;<a moz-do-not-send="true"
                                  href="mailto:ivan.st.ivanov@gmail.com"
                                  target="_blank">ivan.st.ivanov@gmail.com</a>&gt;


                                escreveu:<br>
                                <br>
                              </div>
                              <div>
                                <blockquote type="cite">
                                  <div>
                                    <div dir="ltr">Hey folks!
                                      <div><br>
                                      </div>
                                      <div>This weekend I've been
                                        hacking on migrating the
                                        git-tools to Forge 2 (<a
                                          moz-do-not-send="true"
                                          href="https://issues.jboss.org/browse/FORGE-1128"
                                          target="_blank">https://issues.jboss.org/browse/FORGE-1128</a>).


                                        And I can say that I have pretty
                                        much finished the task (although
                                        I haven't started yet with the
                                        git-tools-tests, but I will do
                                        that as well).</div>
                                      <div><br>
                                      </div>
                                      <div>And I have the following
                                        questions and observations:</div>
                                      <div><br>
                                      </div>
                                      <div>1) How do you declare that a
                                        UI command requires to be
                                        executed in the context of a
                                        project or in a context of a
                                        certain resource? In Forge 1 we
                                        had the @RequiresProject and
                                        @RequiresResource annotations,
                                        but now we only have
                                        @RequiresFacet (I hope it works
                                        ;)). What I do here is:
                                        implement isEnabled and work
                                        with the initialSelection method
                                        of the UIContext to check what
                                        is selected. BTW I find quite
                                        more declarative approaches in
                                        Forge 1 than in Forge 2.</div>
                                      <div><br>
                                      </div>
                                    </div>
                                  </div>
                                </blockquote>
                              </div>
                              Exactly, this is the way to do it. We
                              haven't migrated @RequiresProject and
                              @RequiresResources yet, so you're doing
                              the right thing.&nbsp;
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div>
                                      <div dir="ltr">
                                        <div>2) In Forge 1 we had one
                                          plugin class that represented
                                          a command with a lot of
                                          options as methods of that
                                          class. Did I get it right that
                                          in Forge 2 I have to create a
                                          separate UICommand
                                          implementation for every
                                          option (i.e. method) of the
                                          plugin class? I don't say it's
                                          bad, I just want to understand
                                          whether this is the way</div>
                                        <div><br>
                                        </div>
                                      </div>
                                    </div>
                                  </blockquote>
                                </div>
                                Right again. We prototyped in a separate
                                branch the "command-per-method" strategy
                                but we haven't completed it yet.</div>
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>3) How do you get the current
                                        resource (@Current as of Forge
                                        1)? Is
                                        it&nbsp;context.getInitialSelection().get()?
                                        How can I check that it is of
                                        any particular type
                                        (e.g.&nbsp;GitIgnoreResource)?</div>
                                      <div><br>
                                      </div>
                                    </div>
                                  </blockquote>
                                </div>
                                Yes, the current resource is always
                                retrieved using
                                UIContext.getInitialSelection, which can
                                be safely assigned to a
                                UISelection&lt;Resource&lt;?&gt;&gt;
                                variable.</div>
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>4) Is there such a thing as
                                        setup command? I think there's
                                        no need, but still I'd like to
                                        ask</div>
                                    </div>
                                  </blockquote>
                                </div>
                                There is not, but setup commands should
                                be implemented as UICommands as you may
                                have already noticed.</div>
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>5) If a facet has to write a
                                        message to a provider (GUI,
                                        shell), how does it do it?
                                        Commands do that via the Result
                                        object, but I didn't get how
                                        facets can. Or should they at
                                        all write anything?</div>
                                    </div>
                                  </blockquote>
                                </div>
                                Facets can't write messages for now, but
                                we should consider doing it so it if
                                makes sense.</div>
                              <div><br>
                              </div>
                              <div>
                                <div>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>6) I saw that some of the git
                                        commands in Forge 1 fire pickup
                                        events:</div>
                                      <div>Event&lt;PickupResource&gt;::fire(new
PickupResource(gitIgnoreResource()));<br>
                                      </div>
                                      <div>How is this done in Forge 2.
                                        I would appreciate a sample in
                                        existing plugin</div>
                                    </div>
                                  </blockquote>
                                </div>
                                You have to call UIContext.setSelection
                                in your UICommand.execute method.</div>
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>7) How did you migrate
                                        existing completers? I see that
                                        the completer interface has
                                        changed. I am afraid I can't
                                        figure out how I can rework
                                        complete methods from Forge 1,
                                        that were
                                        using&nbsp;CommandCompleterState
                                        parameter. I couldn't find
                                        samples</div>
                                    </div>
                                  </blockquote>
                                </div>
                                In the UICommand.initializeUI method,
                                you call setCompleter for the desired
                                injected input</div>
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>And of course I have some
                                        questions about the git-tools
                                        implementation that have nothing
                                        to do with the migration:</div>
                                      <div><br>
                                      </div>
                                      <div>1) At the moment the GitUtils
                                        class, which I have made an
                                        interface and plan to export as
                                        addon, exposes some JGit classes
                                        as parameters. Do you think it's
                                        a good idea to wrap them in our
                                        own classes like you have done
                                        with the JDT parser API for
                                        example?</div>
                                    </div>
                                  </blockquote>
                                </div>
                                That would be a good idea, so it could
                                be possible to use native git if needed.</div>
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>2) I see that in javaee-impl
                                        you have implemented an abstract
                                        command class that exposes a
                                        class that returns the current
                                        project (or null):
                                        org.jboss.forge.addon.javaee.ui.AbstractProjectUICommand.
                                        I copy-pasted the
                                        getSelectedProject method to an
                                        abstract Git UI command class
                                        that I created just becayse I
                                        saw that addon-ui does not have
                                        access to the project API
                                        (outherwise I would put it in
                                        the AbstractUICommand class).
                                        Can we find a better place for
                                        this code? In Forge 1 we just
                                        @Inject-ed a Project instance,
                                        but now I am not sure what to do</div>
                                    </div>
                                  </blockquote>
                                </div>
                                Make your addon depend on the projects
                                addon and you shall access these classes
                                normally</div>
                              <div>
                                <div><br>
                                  <blockquote type="cite">
                                    <div dir="ltr">
                                      <div>So, that's all from me for
                                        now. Next to come - the
                                        questions about the migration
                                        about the tests ;)</div>
                                      <div><br>
                                      </div>
                                    </div>
                                  </blockquote>
                                </div>
                                Bring'em on! :)</div>
                              <div><br>
                                <blockquote type="cite">
                                  <div dir="ltr">
                                    <div>Cheers,</div>
                                    <div>Ivan</div>
                                  </div>
                                </blockquote>
                                <blockquote type="cite">
                                  <div><span>_______________________________________________</span><br>
                                    <span>forge-dev mailing list</span><br>
                                    <span><a moz-do-not-send="true"
                                        href="mailto:forge-dev@lists.jboss.org"
                                        target="_blank">forge-dev@lists.jboss.org</a></span><br>
                                    <span><a moz-do-not-send="true"
                                        href="https://lists.jboss.org/mailman/listinfo/forge-dev"
                                        target="_blank">https://lists.jboss.org/mailman/listinfo/forge-dev</a></span></div>
                                </blockquote>
                              </div>
                            </div>
                            <br>
_______________________________________________<br>
                            forge-dev mailing list<br>
                            <a moz-do-not-send="true"
                              href="mailto:forge-dev@lists.jboss.org"
                              target="_blank">forge-dev@lists.jboss.org</a><br>
                            <a moz-do-not-send="true"
                              href="https://lists.jboss.org/mailman/listinfo/forge-dev"
                              target="_blank">https://lists.jboss.org/mailman/listinfo/forge-dev</a><br>
                          </blockquote>
                        </div>
                        <br>
                      </div>
                      <br>
                      <fieldset></fieldset>
                      <br>
                      <pre>_______________________________________________
forge-dev mailing list
<a moz-do-not-send="true" href="mailto:forge-dev@lists.jboss.org" target="_blank">forge-dev@lists.jboss.org</a>
<a moz-do-not-send="true" href="https://lists.jboss.org/mailman/listinfo/forge-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/forge-dev</a></pre>
                    </blockquote>
                    <br>
                  </div>
                </div>
              </div>
              <br>
              _______________________________________________<br>
              forge-dev mailing list<br>
              <a moz-do-not-send="true"
                href="mailto:forge-dev@lists.jboss.org">forge-dev@lists.jboss.org</a><br>
              <a moz-do-not-send="true"
                href="https://lists.jboss.org/mailman/listinfo/forge-dev"
                target="_blank">https://lists.jboss.org/mailman/listinfo/forge-dev</a><br>
            </blockquote>
          </div>
          <br>
        </div>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">_______________________________________________
forge-dev mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:forge-dev@lists.jboss.org">forge-dev@lists.jboss.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/forge-dev">https://lists.jboss.org/mailman/listinfo/forge-dev</a></pre>
      </blockquote>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
forge-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:forge-dev@lists.jboss.org">forge-dev@lists.jboss.org</a>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/forge-dev">https://lists.jboss.org/mailman/listinfo/forge-dev</a></pre>
    </blockquote>
    <br>
  </body>
</html>