[ http://issues.apache.org/jira/browse/JS2-473?page=all ] Randy Watler resolved JS2-473: ------------------------------
Fix Version: 2.1-dev Resolution: Fixed Assign To: Randy Watler This problem has been resolved with a lighter footprint fix that is compatible with the 2.0.1 release by preserving the getFragments() API, (i.e. by supportting a mutable collection in all cases). The PageManager API has been ripe for a major refactoring for some time. Elimination of mutable collections should be considered then as an API design goal. > Many uses of Fragment.getFragments() assume access to the underlying list, > not a copy: this is invalid > ------------------------------------------------------------------------------------------------------ > > Key: JS2-473 > URL: http://issues.apache.org/jira/browse/JS2-473 > Project: Jetspeed 2 > Type: Bug > Versions: 2.1-dev > Reporter: David Jencks > Assignee: Randy Watler > Fix For: 2.1-dev > Attachments: permissions-fragment2.diff, permissions-fragment2.jar > > While trying to see if my proposed solution to JS2-472 would break anything, > I noticed that many uses of Fragment.getFragments() assume they are getting > the original mutable list, and proceed to modify it. Since they may get a > copy, any modifications would be discarded. Here's a usage search from > intellij with some annotations: I've marked obviously dangerous uses with > >>>>. There is no reason to suppose the other uses are safe without looking > into them further. I don't think I'm qualified to fix this without at least > some guidance. > Method > getFragments():List of interface org.apache.jetspeed.om.page.Fragment > Found usages (70 usages) > Unclassified usage (70 usages) > jetspeed-layouts (5 usages) > org.apache.jetspeed.portlets.layout (5 usages) > LayoutPortlet (2 usages) > addPortletToPage(String, String) (1 usage) > >>>> (279, 18) root.getFragments().add(fragment); > removeFragment(String, String) (1 usage) > >>>> (257, 18) root.getFragments().remove(f); > MultiColumnPortlet (2 usages) > doView(RenderRequest, RenderResponse) (1 usage) > (94, 65) layout = new ColumnLayout(numColumns, > layoutType, f.getFragments(), this.colSizes.split("\\,") ); > processAction(ActionRequest, ActionResponse) (1 usage) > (242, 80) layout = new ColumnLayout(numColumns, > layoutType, rootFragment.getFragments(), this.colSizes.split("\\,") ); > PageManagerLayoutEventListener (1 usage) > handleEvent(LayoutEvent) (1 usage) > >>>> (28, 40) > >>>> page.getRootFragment().getFragments().add(event.getFragment()); > jetspeed-page-manager (60 usages) > org.apache.jetspeed.om.page (15 usages) > ContentFragmentImpl.ContentFragmentList (1 usage) > (441, 42) private List baseList = fragment.getFragments(); > TestPageObjectModel (14 usages) > testFragmentManipulation() (14 usages) > (108, 28) assertNotNull(root.getFragments()); > >>>> (114, 14) root.getFragments().add(frag1); > >>>> (128, 15) frag2.getFragments().add(frag3); > >>>> (129, 14) root.getFragments().add(frag2); > (132, 25) assertTrue(root.getFragments().size()==2); > (133, 27) Iterator i = root.getFragments().iterator(); > (142, 22) assertTrue(f.getFragments().size()==0); > (147, 22) assertTrue(f.getFragments().size()==1); > (149, 22) assertTrue(f.getFragments().size()==1); > (150, 15) i = f.getFragments().iterator(); > >>>> (164, 11) f.getFragments().remove(frag3); > >>>> (167, 11) f.getFragments().add(frag2); > (168, 22) assertTrue(f.getFragments().size()==1); > (169, 29) f = (FragmentImpl)f.getFragments().get(0); > org.apache.jetspeed.om.page.psml (4 usages) > PageImpl (4 usages) > getFragmentById(String) (1 usage) > (177, 28) Iterator i = f.getFragments().iterator(); > getFragmentsByName(String) (1 usage) > (276, 28) Iterator i = f.getFragments().iterator(); > removeFragmentById(String) (2 usages) > (209, 28) Iterator i = f.getFragments().iterator(); > >>>> (234, 28) if (parent.getFragments().remove(f)) > org.apache.jetspeed.page (41 usages) > AbstractPageManager (2 usages) > copyFragment(Fragment, String) (2 usages) > (889, 37) Iterator fragments = > source.getFragments().iterator(); > >>>> (894, 18) copy.getFragments().add(copiedFragment); > PageManagerTestShared.Shared (15 usages) > testSecurePageManager(TestCase, PageManager) (15 usages) > >>>> (281, 34) root.getFragments().add(portlet); > >>>> (287, 34) root.getFragments().add(portlet); > (290, 71) > test.assertNotNull(page.getRootFragment().getFragments()); > (291, 73) test.assertEquals(2, > page.getRootFragment().getFragments().size()); > (292, 106) test.assertEquals("some-app::SomePortlet", > ((Fragment)page.getRootFragment().getFragments().get(1)).getName()); > (293, 91) > test.assertFalse("0".equals(((Fragment)page.getRootFragment().getFragments().get(1)).getId())); > (294, 82) somePortletId[0] = > ((Fragment)page.getRootFragment().getFragments().get(1)).getId(); > (348, 72) > test.assertNotNull(page0.getRootFragment().getFragments()); > (349, 74) test.assertEquals(2, > page0.getRootFragment().getFragments().size()); > (389, 72) > test.assertNotNull(page0.getRootFragment().getFragments()); > (390, 74) test.assertEquals(2, > page0.getRootFragment().getFragments().size()); > (458, 72) > test.assertNotNull(page0.getRootFragment().getFragments()); > (459, 74) test.assertEquals(1, > page0.getRootFragment().getFragments().size()); > (518, 72) > test.assertNotNull(page0.getRootFragment().getFragments()); > (519, 74) test.assertEquals(1, > page0.getRootFragment().getFragments().size()); > TestCastorXmlPageManager (15 usages) > testClonePage() (4 usages) > (861, 30) List children = root.getFragments(); > (862, 40) List cloneChildren = > cloneRoot.getFragments(); > (905, 26) assertNotNull(cf.getFragments()); > (906, 23) assertTrue(cf.getFragments().size() == 2); > testCreatePage() (3 usages) > >>>> (266, 14) root.getFragments().add(f); > (302, 43) > assertTrue(page.getRootFragment().getFragments().size() == 1); > (304, 47) f = (Fragment) > page.getRootFragment().getFragments().get(0); > testGetPage() (3 usages) > (190, 30) List children = root.getFragments(); > (237, 25) assertNotNull(f.getFragments()); > (238, 22) assertTrue(f.getFragments().size() == 2); > testUpdatePage() (5 usages) > (373, 28) assertNotNull(root.getFragments()); > (374, 30) assertEquals(1, root.getFragments().size()); > (375, 41) String testId = > ((Fragment)root.getFragments().get(0)).getId(); > (394, 28) assertNotNull(root.getFragments()); > (395, 25) assertTrue(root.getFragments().isEmpty()); > TestDatabasePageManager (9 usages) > testCreates() (2 usages) > >>>> (317, 14) root.getFragments().add(portlet); > >>>> (328, 14) root.getFragments().add(portlet); > testGets() (4 usages) > (620, 51) > assertNotNull(check.getRootFragment().getFragments()); > (621, 53) assertEquals(2, > check.getRootFragment().getFragments().size()); > (622, 65) Fragment check0 = > (Fragment)check.getRootFragment().getFragments().get(0); > (643, 65) Fragment check1 = > (Fragment)check.getRootFragment().getFragments().get(1); > testUpdates() (3 usages) > (814, 46) > assertNotNull(page.getRootFragment().getFragments()); > (815, 48) assertEquals(2, > page.getRootFragment().getFragments().size()); > (816, 61) String removeId = > ((Fragment)page.getRootFragment().getFragments().get(1)).getId(); > jetspeed-portal (4 usages) > org.apache.jetspeed.aggregator.impl (1 usage) > BasicAggregator (1 usage) > build(RequestContext) (1 usage) > (97, 34) for (Iterator fit = > root.getFragments().iterator(); fit.hasNext();) > org.apache.jetspeed.decoration (1 usage) > PageTheme (1 usage) > PageTheme(Page, DecorationFactory, RequestContext) (1 > usage) > (57, 43) Iterator fragments = > rootFragment.getFragments().iterator(); > org.apache.jetspeed.layout.impl (2 usages) > AddPortletAction (1 usage) > run(RequestContext, Map) (1 usage) > >>>> (126, 18) root.getFragments().add(fragment); > >>>> > PortletPlacementContextImpl (1 usage) > processFragment(Fragment) (1 usage) > (145, 29) List children = fragment.getFragments(); > jetspeed-registry (1 usage) > org.apache.jetspeed.components.portletentity (1 usage) > TestPortletEntityDAO.ContentFragmentImpl (1 usage) > getFragments() (1 usage) > (145, 22) return f.getFragments(); -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]