<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-198474286876113415</id><updated>2012-02-15T23:43:29.424-08:00</updated><category term='open source'/><title type='text'>Farhad Norouzi - Eclipse WTP</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://farhadnorouzi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://farhadnorouzi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Farhad</name><uri>http://www.blogger.com/profile/01991641450247619515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-198474286876113415.post-4610329102265703411</id><published>2009-03-11T19:46:00.000-07:00</published><updated>2009-03-11T21:44:07.132-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><title type='text'>Bug Fixing Part 2</title><content type='html'>In the previous post (Bug Fixing Part 1), I discussed how to fix the bug. However, the bug is not completely fixed because if the user modifies the server configurations in the server editor (which turns isDirty flag to true), the application will NOT prompt the user to save the modifications and discard the changes.&lt;br /&gt;&lt;br /&gt;This issue is caused in the following method, when the closeEditor is called with the flag "false", which indicates "do not save the changes":&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/closeEditor_ServerEditor_false.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/closeEditor_ServerEditor_false.JPG" alt="" width="350" height="104" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are a few flaws with the above fix. I will discuss these flaws in terms of various scenarios:&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Scenario 1&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Fix Introduces a New Bug&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;1. User creates a new server and double click on the server to open the server editor:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_create_server.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_create_server.JPG" alt="" width="350" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. The user make some modification to the server configurations in the server editor. For example, in this scenario they will change the port numbers, which will turn "isDirty" flag of the server to "true":&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_edit_server.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_edit_server.JPG" alt="" width="350" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. The user deletes the server. It will not matter whether the user puts a checkmark to the "delete unused server configurations" or not:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_delete_server.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_delete_server.JPG" alt="" width="350" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. Since the server configurations were modified without saving, the user gets prompted to either save the changes or not:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_user_prompted.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_user_prompted.JPG" alt="" width="350" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4a. If the user selects "NO" to discard the changes, everything will be fine. The server will get deleted and removed from the servers list, and the server editor gets closed.&lt;br /&gt;&lt;br /&gt;4b. If the user selects "Cancel", the server will get deleted and removed from the servers list, but the server editor stays opened. I argue that the existence of the "Cancel" button is unnecessary because it cannot undo the deletion (more on this matter comes shortly), as well as it will introduce the original bug: deletion of a server will not close the editor.&lt;br /&gt;&lt;br /&gt;4c. If the user selects "YES" to save the changes, another bug is introduced: a new server with the same configuration will get created and will be added to the servers list. I believe this behavior is caused because saving the changes will update the server configuration, which in turn will trigger some method(s) in the application to update the server list and creating a new server:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_user_yes.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_user_yes.JPG" alt="" width="350" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Scenario 2&lt;/h1&gt;&lt;br /&gt;&lt;h2&gt; The Fix Has Logical Flaw&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The user creates a new server, and they will make some modifications to the server configurations in the server editor (without saving them).&lt;br /&gt;&lt;br /&gt;Then the user decides to delete the server and will get prompted with the following dialog box:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_delete_unused.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/s1_delete_unused.JPG" alt="" width="350" height="104" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The user puts a checkmark to "delete the unused configurations" , which means they want to delete the actual files on the computer.&lt;br /&gt;&lt;br /&gt;After clicking on OK button to confirm the deletion, the user gets prompted again to whether they want to save or discard the changes in the server editor. Although it might not be a big deal, bug we have a logical flaw in this case. If the user wants to delete the server configuration, they will not care about saving the changes. Therefore, there is no need to prompt the user again.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Reason Behind the Issues in Both Scenarios&lt;/h1&gt;&lt;br /&gt;The main reason is that the server gets deleted and removed from the servers list before the server editor gets closed. Examining the code shows the "server" instance gets de-registered and removed from the "Servers List" before closing the server editor. That's why when the there are unsaved modifications in the server editor, the application behave oddly according to the user's selection as explained in above scenarios.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Initial Fix&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;My initial fix was to close the server editor (and in case of unsaved modifications, asking the user to either save them or discard them) before deleting the server. After examining the code, I realized doing this fix will require modification of many codes, changing many methods signatures, and introducing strong coupling between some classes from different packages. Besides, the logical flaw that I talked about will still exist. For example, if the user decides to delete the server including the configuration files, they still gets prompted to save the modified configurations, which is un-necessary since the user intends to completely deletes the configuration files.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Proposed Solution&lt;/h1&gt;&lt;br /&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;br /&gt;The DeleteServerDialog.Java in the org.eclipse.wst.server.ui.internal package, is the class that gets called when the user tries to delete a server. This class dynamically add checkboxes in the dialog box GUI according to the server's status. For example, if the server is running, and the user tries to delete the server, two checkboxes will be added dynamically at the runtime to the GUI:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_deleteserver_dialog.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_deleteserver_dialog.JPG" alt="" width="350" height="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The code responsible for this dynamic creation of checkboxes is located in the &lt;span style="font-weight:bold;"&gt;protected Control createCustomArea(Composite parent)&lt;/span&gt; method:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_stopserver_code.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_stopserver_code.JPG" alt="" width="350" height="100" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The code responsible for deleting the server is located in the &lt;span style="font-weight:bold;"&gt;protected void buttonPressed(int buttonId)&lt;/span&gt; method:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_delete_code.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_delete_code.JPG" alt="" width="350" height="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Solution&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;I propose that to fix the issues with all above scenarios, dynamically add a checkbox to the delete dialog box seeking the user's decision regarding the modified configurations in the server editor. I say "dynamically" because if there is no modifications in the server editor, there is no need to display that checkbox:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_save_gui.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_save_gui.JPG" alt="" width="350" height="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then the application can either save or discard the changes made to the configurations based on the user's choice.&lt;br /&gt;&lt;br /&gt;To prevent the logic flaw, I recommend that this checkbox will be disabled/enabled based on the selection of "Delete unused server configuration(s)". Again, it is because if the user wants to delete the server configurations, there is no need to save them.&lt;br /&gt;&lt;br /&gt;The main advantage of this solution is that there is no need to make several modifications in the various methods/classes. Another advantage is that we don't need to show 2 dialog boxes to the user: one of deletion confirmation and another one for saving/discarding changes.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Solution Implementation&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The first step is to add a checkbox dynamically to the dialog box GUI. This can be done with the following code in the &lt;span style="font-weight:bold;"&gt;protected Control createCustomArea(Composite parent)&lt;/span&gt; method of DeleteServerDialog.Java:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_addcheckbox_code.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_addcheckbox_code.JPG" alt="" width="350" height="100" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Moreover, the following code currently exist in the &lt;span style="font-weight:bold;"&gt;protected void buttonPressed(int buttonId)&lt;/span&gt; method of DeleteServerDialog.Java that is responsible for deleting the server (and if checked, deleting the server configurations):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_delete_code.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_delete_code.JPG" alt="" width="350" height="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now we can modify this code to determine if we have to either save or delete the configurations based on the user's selection of the checkboxes:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_modifieddelete_code.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug2/solution_modifieddelete_code.JPG" alt="" width="350" height="300" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/198474286876113415-4610329102265703411?l=farhadnorouzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://farhadnorouzi.blogspot.com/feeds/4610329102265703411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/bug-fixing-part-2.html#comment-form' title='39 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/4610329102265703411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/4610329102265703411'/><link rel='alternate' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/bug-fixing-part-2.html' title='Bug Fixing Part 2'/><author><name>Farhad</name><uri>http://www.blogger.com/profile/01991641450247619515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>39</thr:total></entry><entry><id>tag:blogger.com,1999:blog-198474286876113415.post-4555530203031201378</id><published>2009-03-09T21:10:00.001-07:00</published><updated>2009-03-10T20:31:20.015-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><title type='text'>Bug Fixing Part 1 (Updated)</title><content type='html'>I believe I fixed the bug. I will confirm it with the instructor, before releasing the solution.&lt;br /&gt;&lt;br /&gt;I debugged the Eclipse many many times and tried to follow the path (the method calls) that lead to the bug. With the aid of documentation, I could successfully find the method calls that lead to the bug. The Following steps were taken by me to find and fix the bug:&lt;br /&gt;&lt;br /&gt;1. As mentioned in the previous post , the source of the bug is equals method in the Base.java class, which is called in the serverRemoved in the ServerEditor.java:&lt;br /&gt;&lt;br /&gt;public void serverRemoved(IServer oldServer) {&lt;br /&gt;&lt;br /&gt;if (oldServer.equals(server) &amp;amp;&amp;amp; !isDirty())&lt;br /&gt;  closeEditor();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;2. I find calling isDirty() method is unnecessary. Let me explain what this method does. When any information is modified in the server editor window, "dirty" flag of the server editor is set to "true", and isDrity() method returns the value of the flag (either true or false). This is useful since the user will get prompted to save the modified server editor before closing it. &lt;br /&gt;&lt;br /&gt;For now, I decided to remove the call to isDirty() method completely, and I will deal with that later (Updated - Get more information in the next post "Bug Fixing Part 2"). So the modified code is the serverRemoved() method will look like this:&lt;br /&gt;&lt;br /&gt;public void serverRemoved(IServer oldServer) {&lt;br /&gt;&lt;br /&gt;if (oldServer.equals(server))&lt;br /&gt; closeEditor();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;3. The IF statement compares an instance of IServer interface that is passed to the method with the member variable (server) , which represents a working copy of the server. The result of this comparison is always "False". To better understand the reason behind it, let's look at the equals method in the Base.Java:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug/equals_base.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug/equals_base.JPG" alt="" width="350" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you see, this method performs various tests to determine if the two instances are equal or not. In the case of our bug, the following line causes that this method concludes that the two instances of the server are NOT equal:&lt;br /&gt;&lt;br /&gt;if (isWorkingCopy() != base.isWorkingCopy())&lt;br /&gt;return false;&lt;br /&gt;&lt;br /&gt;Each Server instance can have a ServerWorkingCopy instance associated with that.&lt;br /&gt;&lt;br /&gt;isWorkingCopy() returns "False" or "True" based on whether the IServer instance is a working copy of the server (ServerWorkingCopy instance) or the actual "Server" instance.&lt;br /&gt;&lt;br /&gt;The isWorkingCopy() of the actual Server instance always return "false", and the isWorkingCopy() of ServerWorkingCopy instance always return true.&lt;br /&gt;&lt;br /&gt;Based on the above information, and the debugging trace, I observed that "base" object is an instance of ServerWorkingCopy and the current object "this" is the actual Server instance. Therefore, these two instances are never equal.&lt;br /&gt;&lt;br /&gt;4. Therefore, to fix the bug I should pass the working copy of the actual "Server" instance to equals() method instead of passing the "Server" object itself.&lt;br /&gt;&lt;br /&gt;5. Going back to serverRemoved() method: I debugged the bug path many times and examined the following files in details:&lt;br /&gt;&lt;br /&gt;ResourceManager.java&lt;br /&gt;Server.java&lt;br /&gt;IServerLifeCycleList.java&lt;br /&gt;GlobalCommandManager.java&lt;br /&gt;IServer.java&lt;br /&gt;IServerWorkingCopy.java&lt;br /&gt;&lt;br /&gt;My goal was to determine whether the "oldServer" object that is passed to serverRemoved() object is the actual "Server" object or its working copy. I figured out that the "oldServer" is the actual "Server" object not its working copy. Therefore, if I can grab the working copy of the "Server" object, I can pass it to equals() method to fix the bug.&lt;br /&gt;&lt;br /&gt;5. After investigation of the above java filenames and the documentation, I found out that I can get the working copy of the "Server" object from the GlobalCommandManager. Therefore, I changed the code in the serverRemoved() method to the following code:&lt;br /&gt;&lt;br /&gt;public void serverRemoved(IServer oldServer) {&lt;br /&gt;if (commandManager.getServerResource(oldServer.getId()).equals(server))&lt;br /&gt; closeEditor();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug/serverRemoved_serverEditor.JPG" target="_blank"&gt;&lt;img src="http://matrix.senecac.on.ca/%7Efnorouzi/dps909/fixedbug/serverRemoved_serverEditor.JPG" alt="" width="350" height="84" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. commandManager.getServerResource() method gets a resource id (string) and returns the resource. In this case, I passed the id of the received server (oldServer.getId()), and the method returns a working copy of the server. Therefore, the two instances that are passed to equals() method will be equal. As the result, the server editor will be successfully closed upon deletion of the server.&lt;br /&gt;&lt;br /&gt;7. A copy of modified ServerEditor.java can be downloaded from the following link. Just copy this file into your Eclipse Plugin workspace and replace the old file. Then, compile and run the modified code and observe that the bug is fixed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/fixedbug/ServerEditor.java" target="_blank"&gt;Modified Copy of ServerEditor.java fixed by Farhad Norouzi&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/198474286876113415-4555530203031201378?l=farhadnorouzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://farhadnorouzi.blogspot.com/feeds/4555530203031201378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/i-believe-i-fixed-bug.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/4555530203031201378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/4555530203031201378'/><link rel='alternate' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/i-believe-i-fixed-bug.html' title='Bug Fixing Part 1 (Updated)'/><author><name>Farhad</name><uri>http://www.blogger.com/profile/01991641450247619515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-198474286876113415.post-4389907743565871978</id><published>2009-03-04T10:18:00.000-08:00</published><updated>2009-03-04T10:26:36.226-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><title type='text'>Assignment 2 - Bug 0.2 Release</title><content type='html'>As mentioned in the previous post (Code Finding), the code that causes the bug is in the ServerEdit.Java, in the method called serverRemoved.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/locatingCode_ServerEditor.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/locatingCode_ServerEditor.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I examined the body of the serverRemoved method:&lt;br /&gt;&lt;br /&gt; public void serverRemoved(IServer oldServer) {&lt;br /&gt;       if (oldServer.equals(server) &amp;&amp; !isDirty())&lt;br /&gt;    closeEditor();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;The method compares the received IServer parameter (oldServer object) to the the current server object (server), as well as it calls the isDirty() method to determine if anything on the server editor has been changed. If both of these return values are true, it will close the server by calling the closeEditor() method.&lt;br /&gt;&lt;br /&gt;I determined that the problem lies in one or more of these 3 methods:&lt;br /&gt;&lt;br /&gt;1. equals() method of IServer .&lt;br /&gt;2. isDirty() method.&lt;br /&gt;3. closeEditor().&lt;br /&gt;&lt;br /&gt;To further pintpoint the problem, I commented the if statement, so the serverRemoved method will always call closeEditor() method. I did this to find out if the closeEditor() method can successfully close the server editor:&lt;br /&gt;&lt;br /&gt; public void serverRemoved(IServer oldServer) {&lt;br /&gt;     // if (oldServer.equals(server) &amp;&amp; !isDirty())&lt;br /&gt;    closeEditor();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/serverRemoved_commented.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/serverRemoved_commented.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I ran the modified code, and tested the bug. I observed the server editor is closed successfully upon deletion of the server from the server view. Therefore, I understood that the closeEditor() does its job properly.&lt;br /&gt;&lt;br /&gt;Then I started investigating isDity() method to make determine if it is the cause of the bug or not. Therefore, I edited the serverRemoved method like the following:&lt;br /&gt;&lt;br /&gt;  public void serverRemoved(IServer oldServer) {&lt;br /&gt;   &lt;br /&gt;   if (!isDirty())&lt;br /&gt;    closeEditor();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/serverRemoved_only_isDirty.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/serverRemoved_only_isDirty.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I ran the modified code, and observed that the server editor is successfully closed upon deletion of the server from the server view IF AND ONLY IF the server editor is not modified. Otherwise, it will stay open. Therefore, I understood that isDirty method is not the cause of the bug, but more code needs to be added in the serverRemoved method to ask the user to save the changes and close the server editor.&lt;br /&gt;&lt;br /&gt;My next step was testing equals() method. Therefore, I edited the code in the removedServer same as following:&lt;br /&gt;&lt;br /&gt;  public void serverRemoved(IServer oldServer) {&lt;br /&gt;   &lt;br /&gt;   if (oldServer.equals(server))&lt;br /&gt;    closeEditor();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/serverRemoved_only_equals.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/serverRemoved_only_equals.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I ran the modified code, and observed that the server editor is not closed upon deletion of the server. Therefore, I found out the main root of the bug is equals() method.&lt;br /&gt;&lt;br /&gt;Conclusion:&lt;br /&gt;&lt;br /&gt;Based on the above investigation it is determined the main cause of the bug is equals() method that is called in serverRemoved method.&lt;br /&gt;&lt;br /&gt;To fix the bug, one has to fix the equals() method and add more code in serverRemoved method to prompt the user to save the server editor if isDirty method returns true (which means the user has modified the server editor).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/198474286876113415-4389907743565871978?l=farhadnorouzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://farhadnorouzi.blogspot.com/feeds/4389907743565871978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/assignment-2-bug-02-release.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/4389907743565871978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/4389907743565871978'/><link rel='alternate' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/assignment-2-bug-02-release.html' title='Assignment 2 - Bug 0.2 Release'/><author><name>Farhad</name><uri>http://www.blogger.com/profile/01991641450247619515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-198474286876113415.post-7612865337837459579</id><published>2009-03-01T08:20:00.000-08:00</published><updated>2009-03-04T10:25:17.588-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><title type='text'>Code Finding Procedure in Eclipse WTP for Bug# 240167</title><content type='html'>I was able to locate the code for the bug# 240167 based on the demonstration by Jordan in the class, as well as, debugging and using breakpoints in org.eclipse.wst.server.ui -&gt; serverui -&gt; org.eclipse.wst.server.ui.internal.editor package . &lt;br /&gt;&lt;br /&gt;Since the bug is about the application not closing the server editor when deleting the server, I started investigating the org.eclipse.wst.server.ui.internal.editor package. I put several breakpoints in the java files (such as ServerEditor.Java and ServerEditorCore.Java) that I suspect the code related to bug might exist. &lt;br /&gt;&lt;br /&gt;Then I started debugging the code. Upon deletion of the server in the target platform (Eclipse), I noticed the Eclipse Plug-In is stopped in one of my breakpoints in ServerEditor.Java. I started using debugger feature of "Step-Into" to step into the code, and I noticed when the user tries to delete the server, the following method in ServerEditor.Java is called :&lt;br /&gt;&lt;br /&gt;public void serverRemoved(IServer oldServer);&lt;br /&gt;&lt;br /&gt;&lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/locatingCode_ServerEditor.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/findingCode/locatingCode_ServerEditor.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I could successfully located the code that causes the bug. In the next post, I'll explain how to start fixing the bug.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/198474286876113415-7612865337837459579?l=farhadnorouzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://farhadnorouzi.blogspot.com/feeds/7612865337837459579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/code-finding-procedure-in-eclipse-wtp.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/7612865337837459579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/7612865337837459579'/><link rel='alternate' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/code-finding-procedure-in-eclipse-wtp.html' title='Code Finding Procedure in Eclipse WTP for Bug# 240167'/><author><name>Farhad</name><uri>http://www.blogger.com/profile/01991641450247619515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-198474286876113415.post-8912269618535064180</id><published>2009-03-01T06:27:00.000-08:00</published><updated>2009-03-01T08:19:30.402-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><title type='text'>Project Deliverable Version 0.1 - Reproduce Bug# 240167, Normal, P3</title><content type='html'>I could successfully be able to reproduce the &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240167" target="_blank"&gt;Bug# 240167&lt;/a&gt; and observed that the deleting a Tomcat 5.5 server from the server view will NOT close the server editor.&lt;br /&gt;&lt;h2&gt;Bug Description&lt;/h2&gt;When the user deletes a Tomcat 5.5 server from the server view, the editor will not be closed.&lt;h2&gt;Bug Cause&lt;/h2&gt;The editor will never be closed when the server is deleted, because the method equals() in Base.java returns always false.&lt;br /&gt;&lt;br /&gt;The method serverRemoved() from ServerEditor.java invoks equals() for IServer and IServerWorkingCopy objects. While in ServerWorkingCopy.java the method isWorkingCopy() returns always true in Server.java isWorkingCopy()returns always false.&lt;br /&gt;&lt;br /&gt;That is why equals() in Base returns false and serverRemoved() cannot reach closeEditor() [&lt;a href="mailto:jordan.anastasiade@gmail.com"&gt;Jordan Anastasiade&lt;/a&gt;].&lt;br /&gt;&lt;h2&gt;Possible Solution&lt;/h2&gt;Fix the method equals() in Base to return the correct value [&lt;a href="mailto:jordan.anastasiade@gmail.com"&gt;Jordan Anastasiade&lt;/a&gt;].&lt;h2&gt;&lt;br /&gt;Steps to Reproduce the Bug&lt;/h2&gt;Following steps demonstrate how to reproduce the &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240167" target="_blank"&gt;Bug# 240167&lt;/a&gt;:&lt;h3&gt;Step 1&lt;/h3&gt;&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;        &lt;li&gt;Open Eclipse WTP &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/open_eclipse.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/open_eclipse.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Create a new Tomcat 5.5 server by selecting New from the File menu (File &amp;gt; New &amp;gt; Other). &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/new_wizard.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/new_wizard.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;The New Wizard is opened. Type in server in the textbox and select Server. Click on Next. &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/select_server.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/select_server.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Select Tomcat v5.5 server (Apache &amp;gt; Tomcat v5.5 Server). Click on Next. &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/select_tomcat_55.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/select_tomcat_55.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Click on Browse to select Tomcat 5.5 server installation location.&lt;br /&gt;            &lt;br /&gt;&lt;br /&gt;            If you do not have an installed Tomcat 5.5 server on your computer, click on &lt;em&gt;Download and Install&lt;/em&gt; button to download and install the server. Click on Next. &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/browse_tomcat_folder.JPG" target="_blank"&gt;&lt;br /&gt;                &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/browse_tomcat_folder.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Click on Finish. The wizard is closed and the server is added to the Servers view. &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/tomcat_added_to_server_view.JPG" target="_blank"&gt;&lt;br /&gt;            &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/tomcat_added_to_server_view.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;   &lt;h3&gt;&lt;br /&gt;        Step 2&lt;/h3&gt;&lt;br /&gt;    Double click on &lt;em&gt;Tomcat v5.5 Server at localhost&lt;/em&gt; from the Servers view to open the server editor. &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/open_server_editor.JPG" target="_blank"&gt;&lt;br /&gt;        &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/open_server_editor.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;    &lt;h3&gt;&lt;br /&gt;        Step 3&lt;/h3&gt;&lt;br /&gt;    Right click on &lt;em&gt;Tomcat v5.5 Server at localhost&lt;/em&gt; from the Servers view and select Delete to delete the server from the Servers view.&lt;br /&gt;&lt;br /&gt;Click on OK button on the Delete Server dialog box (it will NOT make a difference whether you put a check-mark to &lt;em&gt;Delete unused server configuration(s)&lt;/em&gt; or not).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Observe that the server is deleted from the Servers view, but the server editor is still open.&lt;/strong&gt; &lt;a href="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/delete_server.JPG" target="_blank"&gt;&lt;br /&gt;        &lt;img src="http://matrix.senecac.on.ca/~fnorouzi/dps909/deliver01/delete_server.JPG" width="350px" height="300px" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/198474286876113415-8912269618535064180?l=farhadnorouzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://farhadnorouzi.blogspot.com/feeds/8912269618535064180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/project-deliverable-version-01.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/8912269618535064180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/8912269618535064180'/><link rel='alternate' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/03/project-deliverable-version-01.html' title='Project Deliverable Version 0.1 - Reproduce Bug# 240167, Normal, P3'/><author><name>Farhad</name><uri>http://www.blogger.com/profile/01991641450247619515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-198474286876113415.post-1091016583552006187</id><published>2009-01-21T19:20:00.001-08:00</published><updated>2009-01-23T10:31:33.907-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><title type='text'>Reactions to "Cathedral and Bazaar" and "Revolution OS"</title><content type='html'>&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 12"&gt;&lt;meta name="Originator" content="Microsoft Word 12"&gt;&lt;link rel="File-List" href="file:///C:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;&lt;link rel="themeData" href="file:///C:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;&lt;link rel="colorSchemeMapping" href="file:///C:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:10.0pt; 	margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.0in 1.0in 1.0in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin-top:0in; 	mso-para-margin-right:0in; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal"&gt;His motivation for coding started from cathedrals. He grew up with the early video game consoles. He thought the games were very good and they always had something new to discover. Then, he decided to create the best cathedral in the world and impress many people.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I enrolled in DPS909 course as my first step into "Open Source" realm. After reading Eric Raymond's "The Cathedral and the Bazaar", I believe I have understood what the “Open Source” means, and it’s inspired me. Open source software is similar to a bazaar where the programmers create most of its existence. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Open Source is a well-organized method to gather programmers without organization overhead. It is also efficient to make sure that the produced software will satisfy the public. The Bazaar model has produced a solid operating system (Linux) and a popular browser (Firefox), which convinces me that the Bazaar model truly works. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/198474286876113415-1091016583552006187?l=farhadnorouzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://farhadnorouzi.blogspot.com/feeds/1091016583552006187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/01/ddeed.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/1091016583552006187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/198474286876113415/posts/default/1091016583552006187'/><link rel='alternate' type='text/html' href='http://farhadnorouzi.blogspot.com/2009/01/ddeed.html' title='Reactions to &quot;Cathedral and Bazaar&quot; and &quot;Revolution OS&quot;'/><author><name>Farhad</name><uri>http://www.blogger.com/profile/01991641450247619515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
