Hi Benjamin,

It will take me some times to read carefully your proposals and test your contributions.

I see many good ideas.
We have just to be careful because we are a small team with limited experience, and OJ is quite a big project with a long history and much legacy code hosted by the project or by other projects.

That said, I don't know how much you can contribute, and what's your vision for OJ. If you have time for important contributions, maybe it's worthwhile creating a branch in the svn, to be able to test more innovative changes while keeping and updating a stable release.

Let's see what Stefan and Ede say.

Michaël

PS : Having a very quick look at your examples, I thought that the required refactoring could help making plugins scriptables (currently, it's quite difficult to use plugins from beanshell), and maybe later to implement a macro recorder (though, I may have extrapolated a bit too far ;o)).

Le 04/01/2012 23:25, Benjamin Gudehus a écrit :
Sorry, the last post became badly formatted, so I post it again. Hope this looks better.

Here is an update:

I've finished point 2. Now it's possible to run unittests for the UnionByAttributePlugIn.

Project page: https://github.com/hastebrot/openjump-tools-sandbox
Zip file: https://github.com/hastebrot/openjump-tools-sandbox/zipball/master

Please grab the zip file and try it out. I've included all openjump libraries and added junit4 in the lib directory, so everyone has nothing to do but import the project into eclipse.

You may start with executing the junit tests in src/org/openjump/tools/tests/TestToolsTest.java. I'm happy about any suggestion and feedback. You'll see that the tests work, but that there are some refactorings needed on the OpenJump source code. You'll also see that I've tried to write it BDD style (given-when-then).

This is just a sandbox for concepts. Eventually I will copy the sources into openjump's subversion repository, when everything went fine.

Here is what I have to write about (C) formulate a guideline to refactor existing legacy plugins:

1. Create an empty Java.project for experiments
2. Copy jar depenndecies to lib
3. Copy single PlugIn source to src (downside: out of main repository version control)
4. Try to run plugin
5. Refactor PlugIn (maybe) to execute simple test with a shapefile fixture (chance no behaviour)
6. Write Tests for bounded context and edge cases
7. Refactor mercilessly

See also: Manuel Küblböck: "How to make changes to rotten legacy code", http://qualityswdev.com/2011/02/09/how-to-make-changes-to-rotten-legacy-code/

So we are now at point 6. I've changed nothing in UnionByAttributePlugIn. Next thing is to write all tests / interactions for it.

--Benjamin

2012/1/4 Benjamin Gudehus <hasteb...@googlemail.com <mailto:hasteb...@googlemail.com>>:
> Here is an update:
> I've finished point 2. Now it's possible to run unittests for
> theUnionByAttributePlugIn.
> Project page: https://github.com/hastebrot/openjump-tools-sandboxZip
> file: https://github.com/hastebrot/openjump-tools-sandbox/zipball/master
> Please grab the zip file and try it out. I've included all
> openjumplibraries and added junit4 in the lib directory, so everyone
> hasnothing to do but import the project into eclipse.
> You may start with executing the junit tests
> insrc/org/openjump/tools/tests/TestToolsTest.java. I'm happy about
> anysuggestion and feedback. You'll see that the tests work, but
> thatthere are some refactorings needed on the OpenJump source code.
> You'llalso see that I've tried to write it BDD style
> (given-when-then).
> This is just a sandbox for concepts. Eventually I will copy thesources
> into openjump's subversion repository, when everything wentfine.
> Here is what I have to write about (C) formulate a guideline
> torefactor existing legacy plugins:
> 1. Create an empty Java.project for experiments2. Copy jar
> depenndecies to lib3. Copy single PlugIn source to src (downside: out
> of main repositoryversion control)4. Try to run plugin5. Refactor
> PlugIn (maybe) to execute simple test with a shapefilefixture (chance
> no behaviour)6. Write Tests for bounded context and edge cases7.
> Refactor mercilessly
> So we are now at point 6. I've changed nothing
> inUnionByAttributePlugIn. Next thing is towrite all tests /
> interactions for it.
> --Benjamin
> 2012/1/4 Benjamin Gudehus <hasteb...@googlemail.com <mailto:hasteb...@googlemail.com>>:
>> 2. Legacy code and testing
>>
>> How to test plugins (from the tools menu)?
>>
>> (1) Create and setup a JUMPWorkbench with WorkbenchFrame and
>> WorkbenchContext. The method JUMPWorkbench.main() has all needed
>> instructions. In order to run the plugins we need to set
>> WorkbenchFrame visible. This is only required because
>> WorkbenchFrame.position() wants to relocate internal frames, but
>> shouldn't be a requirement. However to show the WorkbenchFrame could
>> be helpful when developing test cases.
>>
>> (2) Initialize and call (execute and/or run) PlugIns. The method
>> AbstractPlugIn.toActionListener() has all needed instructions. We need
>> to wait until the plugin finished until assertions can be made. We
>> should test plugins with different dialog values handled to the plugin
>> and all private methods directly.
>>
>> I finished point (1) and am working in point (2). After that I will
>> but some source code online, so everyone can experiment a bit with
>> tests.
>>
>> -----
>>
>> Now let's look at (A) the structure of the source code of an example
>> plugin and then (B) formulate the layout of a test class. After that
>> we can (C) formulate a guideline to refactor existing legacy plugins.
>>
>> Concerning (A): I'll use UnionByAttributePlugIn (sourcecode: [1]) as a
>> showcase and later as a object-under-test. Michaël recently made some
>> nice refactorings (sourcecode: [2]) on this plugin that also improved
>> cohesion on the source code. I think [1] has the following structure:
>>
>> [1] https://gist.github.com/1554708#file_union_by_attribute_plug_in.java >> [2] https://gist.github.com/1554708#file_union_by_attribute_plug_in.r2519.java
>>
>> 1. PlugIn installation (JUMPWorkbench/Setup)
>>   - Constructor (empty)
>>     public UnionByAttributePlugIn() {}
>>   - Method: initialize() / FeatureInstaller
>> 2. Input dialog (PlugIn.execute())
>>   - Fields: Translation Strings
>>     private final static String LAYER = I18N.get("...PlugIn.layer");
>>   - Field: Dialog
>>     private MultiInputDialog dialog;
>>   - Method: initDialog()
>>   - Method: execute() to initialize and show the dialog
>> 3. Execution/Result/Report (Ok button)
>>   - Method: run() to run the tool asynchronously
>>     privateMethods
>>
>> It consists of three parts. 1. provides an initialize() method for
>> JUMPWorkbench/Setup which installs a menu entry. 2. provides a multi
>> input dialog which provides a key store with different values (I
>> really like this key/value concept). The dialog is shown to the user
>> with execute(). 3. is the run() method which creates a result layer
>> and makes use of private methods.
>>
>> We should refactor the plugins later, so calling them is possible in
>> two different ways. Firstly by showing the user a multi input dialog
>> and secondly by provide key-values directly to the plugins. The
>> changes by Michaël in [2] resemble exactly what I'm thinking of: He
>> introduced some field to the plugin class analogue to the fields in
>> the dialog. For now I'll try to subclass MultiInputDialog for tests to
>> provide custom values to the plugin, without setting the dialog
>> visible. Then I'll set it as the private field dialog.
>>
>> Concerning (B): Layout of a test class
>>
>> @BeforeClass: Create a WorkbenchFrame (and optionally set it visible).
>>    @Before: Create a new TaskFrame.
>>        @Test: Multible test cases.
>>            - Load a Shapefile.
>>            - Call the PlugIn with arguments.
>>            - do assertions
>>    @After: Close all internal frames (projects)
>> @AfterClass: Close the WorkbenchFrame
>>
>> For all tests cases (@Tests) we need a single
>> WorkbenchFrame/WorkbenchContext which is initialized in @BeforeClass.
>> A single test case loads a shapefile and calls the plugin with
>> arguments (my custom MultiInputDialog). Then multiple assertions
>> follow. After that we will close all internal frames in @After.
>>
>> I'll write about (C) later.
>>
>> --Benjamin



------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual
desktops for less than the cost of PCs and save 60% on VDI infrastructure
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox


_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to