diff --git a/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLink.java b/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLink.java index dbb6edf07..3c84423e0 100755 --- a/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLink.java +++ b/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLink.java @@ -39,26 +39,24 @@ import org.apache.log4j.Logger; * @version $Revision: #4 $ $Date: 2004/03/30 $ * @author Scott Seago (sseago@redhat.com) */ -public class RelatedLink extends Link { +public class RelatedLink extends Link { private static final Logger s_log = Logger.getLogger(RelatedLink.class); - /** PDL properties */ public static final String LINK_LIST_NAME = "linkListName"; public static final String RESOURCE_SIZE = "resourceSize"; public static final String RESOURCE_TYPE = "resourceType"; public static final String LINK_OWNER = "linkOwner"; - public static final String RELATED_LINKS = "links"; - + public static final String RELATED_LINKS = "links"; /** Data object type for this domain object */ - public static final String BASE_DATA_OBJECT_TYPE - = "com.arsdigita.cms.contentassets.RelatedLink"; + public static final String BASE_DATA_OBJECT_TYPE = + "com.arsdigita.cms.contentassets.RelatedLink"; /** * Default constructor. This creates a new RelatedLink. */ public RelatedLink() { - this( BASE_DATA_OBJECT_TYPE ); + this(BASE_DATA_OBJECT_TYPE); } /** @@ -69,9 +67,9 @@ public class RelatedLink extends Link { * @param id The id for the retrieved * DataObject */ - public RelatedLink( BigDecimal id ) - throws DataObjectNotFoundException { - this( new OID( BASE_DATA_OBJECT_TYPE, id ) ); + public RelatedLink(BigDecimal id) + throws DataObjectNotFoundException { + this(new OID(BASE_DATA_OBJECT_TYPE, id)); } /** @@ -82,9 +80,9 @@ public class RelatedLink extends Link { * @param oid The OID for the retrieved * DataObject */ - public RelatedLink( OID oid ) - throws DataObjectNotFoundException { - super( oid ); + public RelatedLink(OID oid) + throws DataObjectNotFoundException { + super(oid); } /** @@ -94,8 +92,8 @@ public class RelatedLink extends Link { * @param obj The DataObject with which to create or * load a content item */ - public RelatedLink( DataObject obj ) { - super( obj ); + public RelatedLink(DataObject obj) { + super(obj); } /** @@ -105,18 +103,18 @@ public class RelatedLink extends Link { * @param type The String data object type of the * item to create */ - public RelatedLink( String type ) { - super( type ); + public RelatedLink(String type) { + super(type); } /** get the name of the named link list. */ - public String getLinkListName(){ - return (String) get(LINK_LIST_NAME); + public String getLinkListName() { + return (String) get(LINK_LIST_NAME); } /** Set the name of the named link list. */ - public void setLinkListName(String name){ - set(LINK_LIST_NAME , name); + public void setLinkListName(String name) { + set(LINK_LIST_NAME, name); } /** @@ -124,12 +122,12 @@ public class RelatedLink extends Link { * * @return MimeType of target resource. */ - public MimeType getResourceType(){ - DataObject obj = (DataObject) get ( RESOURCE_TYPE ); - if(obj != null){ - return new MimeType(obj); - } - return null; + public MimeType getResourceType() { + DataObject obj = (DataObject) get(RESOURCE_TYPE); + if (obj != null) { + return new MimeType(obj); + } + return null; } /** @@ -137,18 +135,18 @@ public class RelatedLink extends Link { * * @param type , MimeType of target resource. */ - public void setResourceType(MimeType type){ - setAssociation(RESOURCE_TYPE , type); + public void setResourceType(MimeType type) { + setAssociation(RESOURCE_TYPE, type); } /** get the size of the target resource. */ - public String getResourceSize(){ - return (String) get(RESOURCE_SIZE); + public String getResourceSize() { + return (String) get(RESOURCE_SIZE); } /** Set the size of the target resource. */ - public void setResourceSize(String size){ - set(RESOURCE_SIZE , size); + public void setResourceSize(String size) { + set(RESOURCE_SIZE, size); } /** @@ -172,7 +170,7 @@ public class RelatedLink extends Link { if (dobj == null) { return null; } else { - return (ContentItem)DomainObjectFactory.newInstance(dobj); + return (ContentItem) DomainObjectFactory.newInstance(dobj); } } @@ -185,12 +183,20 @@ public class RelatedLink extends Link { * @return */ public static DataCollection getRelatedLinks(ContentItem item, String name) { - s_log.debug("Getting related links for a content item"); + s_log.debug(String.format("Getting related links for content item %s", + item.getID())); + long now = System.currentTimeMillis(); + s_log.debug(String.format("Started at %d", now)); Session session = SessionManager.getSession(); DataCollection links = session.retrieve(BASE_DATA_OBJECT_TYPE); links.addEqualsFilter(LINK_OWNER + ".id", item.getID()); links.addEqualsFilter(LINK_LIST_NAME, name); links.addOrder(ORDER); + s_log.debug(String.format( + "Got all related links for content item %s in %d ms. (time finished: %d)", + item.getID().toString(), + System.currentTimeMillis() - now, + System.currentTimeMillis())); return links; } @@ -205,22 +211,24 @@ public class RelatedLink extends Link { public static DataCollection getReferringRelatedLinks(ContentItem item) { Session session = SessionManager.getSession(); DataCollection links = session.retrieve(BASE_DATA_OBJECT_TYPE); - Filter filter = links.addInSubqueryFilter("id", "com.arsdigita.cms.contentassets.getReferringRelatedLinks"); + Filter filter = + links.addInSubqueryFilter("id", + "com.arsdigita.cms.contentassets.getReferringRelatedLinks"); filter.set("itemID", item.getID()); - + return links; } - /** * Swaps this RelatedLink with the next one, * according to the linkOrder */ @Override public void swapWithNext() { - swapWithNext("com.arsdigita.cms.contentassets.allRelatedLinkOrderForItem", - "com.arsdigita.cms.contentassets.swapRelatedLinkWithNextInGroup", - this.getLinkListName()); + swapWithNext( + "com.arsdigita.cms.contentassets.allRelatedLinkOrderForItem", + "com.arsdigita.cms.contentassets.swapRelatedLinkWithNextInGroup", + this.getLinkListName()); } /** @@ -229,9 +237,10 @@ public class RelatedLink extends Link { */ @Override public void swapWithPrevious() { - swapWithPrevious("com.arsdigita.cms.contentassets.allRelatedLinkOrderForItem", - "com.arsdigita.cms.contentassets.swapRelatedLinkWithNextInGroup", - this.getLinkListName()); + swapWithPrevious( + "com.arsdigita.cms.contentassets.allRelatedLinkOrderForItem", + "com.arsdigita.cms.contentassets.swapRelatedLinkWithNextInGroup", + this.getLinkListName()); } /** @@ -268,8 +277,6 @@ public class RelatedLink extends Link { return operation; } - - /** * This method is only used for setting initial sort keys for * links which exist without them. This is called by swapKeys @@ -291,7 +298,7 @@ public class RelatedLink extends Link { link.setOrder(sortKey); link.save(); } - + } /** @@ -306,27 +313,27 @@ public class RelatedLink extends Link { return 0; } int returnOrder = 0; - DataQuery query = SessionManager.getSession().retrieveQuery - ("com.arsdigita.cms.contentassets.allRelatedLinkOrderForItem"); + DataQuery query = SessionManager.getSession().retrieveQuery( + "com.arsdigita.cms.contentassets.allRelatedLinkOrderForItem"); query.setParameter("ownerID", getLinkOwner().getID()); query.setParameter("linkListName", getLinkListName()); query.addOrder("linkOrder DESC"); if (query.next()) { - Integer linkOrder = ((Integer)query.get("linkOrder")); + Integer linkOrder = ((Integer) query.get("linkOrder")); query.close(); if (linkOrder != null) { returnOrder = linkOrder.intValue(); } } return returnOrder; - + } @Override public void beforeSave() { super.beforeSave(); if (getOrder() == null) { - setOrder(maxOrder()+1); + setOrder(maxOrder() + 1); } } } diff --git a/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/ui/RelatedLinkPropertyForm.java b/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/ui/RelatedLinkPropertyForm.java index 6b9609b51..5fa1fa497 100755 --- a/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/ui/RelatedLinkPropertyForm.java +++ b/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/ui/RelatedLinkPropertyForm.java @@ -35,6 +35,7 @@ import com.arsdigita.cms.contentassets.RelatedLink; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.mimetypes.MimeType; import com.arsdigita.mimetypes.MimeTypeCollection; +import com.arsdigita.persistence.DataCollection; import com.arsdigita.util.Assert; import org.apache.log4j.Logger; @@ -190,6 +191,10 @@ public class RelatedLinkPropertyForm extends LinkPropertyForm { rl.setResourceType(mType); } rl.setLinkListName((String) data.get(RelatedLink.LINK_LIST_NAME)); + + DataCollection links = RelatedLink.getRelatedLinks(getContentItem(fse.getPageState()), m_linkListName); + rl.setOrder((int) links.size() + 1); + super.setLinkProperties(link, fse); } } diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java index 869cf0e02..f9451ba97 100755 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java @@ -74,7 +74,7 @@ public class Link extends ACSObject { public static final String ORDER = "linkOrder"; /** Data object type for this domain object */ public static final String BASE_DATA_OBJECT_TYPE = - "com.arsdigita.cms.contenttypes.Link"; + "com.arsdigita.cms.contenttypes.Link"; /** * Default constructor. This creates a new Link. @@ -165,8 +165,9 @@ public class Link extends ACSObject { * Link.INTERNAL_LINK */ public void setTargetType(String type) { - Assert.isTrue(type != null && (type.equals(EXTERNAL_LINK) || type.equals( - INTERNAL_LINK))); + Assert.isTrue(type != null && (type.equals(EXTERNAL_LINK) + || type.equals( + INTERNAL_LINK))); set(TARGET_TYPE, type); } @@ -196,7 +197,7 @@ public class Link extends ACSObject { public ContentItem getTargetItem() { DataObject object = (DataObject) get(TARGET_ITEM); ACSObject acsObject = - (ACSObject) DomainObjectFactory.newInstance(object); + (ACSObject) DomainObjectFactory.newInstance(object); // Quasimodo: BEGIN // This is part of the patch to make RelatedLink (and Link) multilanguage compatible @@ -207,7 +208,8 @@ public class Link extends ACSObject { // If acsObject is instance of ContentBundle if (acsObject instanceof ContentBundle) { // get the negotiated language version of this ContentBundle - ci = ((ContentBundle) acsObject).negotiate(DispatcherHelper.getRequest().getLocales()); + ci = ((ContentBundle) acsObject).negotiate(DispatcherHelper. + getRequest().getLocales()); } else { // else there are no language versions so just use the acsObject ci = (ContentItem) acsObject; @@ -299,6 +301,7 @@ public class Link extends ACSObject { * @return the Link URI */ public String getInternalOrExternalURI(PageState state) { + if (EXTERNAL_LINK.equals(getTargetType())) { return getTargetURI(); } else { @@ -306,7 +309,7 @@ public class Link extends ACSObject { if (item == null) { s_log.error(getOID() - + " is internal link, but has null target item"); + + " is internal link, but has null target item"); return ""; } @@ -314,7 +317,7 @@ public class Link extends ACSObject { ItemResolver resolver = section.getItemResolver(); String url = resolver.generateItemURL( state, item, section, item.getVersion()); - + if ((getTargetURI() != null) && getTargetURI().startsWith("&")) { ParameterMap parameters; StringTokenizer tokenizer; @@ -333,12 +336,12 @@ public class Link extends ACSObject { String.format( "Internal link with parameters found. Generated URL is: %s", URL.there(state.getRequest(), url, - parameters). + parameters). toString())); return URL.there(state.getRequest(), url, parameters). toString(); - } else { - return URL.there(state.getRequest(), url).toString(); + } else { + return URL.there(state.getRequest(), url).toString(); } } } @@ -356,8 +359,8 @@ public class Link extends ACSObject { Session session = SessionManager.getSession(); DataCollection links = session.retrieve(BASE_DATA_OBJECT_TYPE); Filter filter = - links.addInSubqueryFilter("id", - "com.arsdigita.cms.contenttypes.getReferringLinks"); + links.addInSubqueryFilter("id", + "com.arsdigita.cms.contenttypes.getReferringLinks"); filter.set("itemID", item.getID()); return links; @@ -400,7 +403,8 @@ public class Link extends ACSObject { swapKeys(true, queryName, operationName, ""); } - public void swapWithNext(String queryName, String operationName, String linkListName) { + public void swapWithNext(String queryName, String operationName, + String linkListName) { swapKeys(true, queryName, operationName, linkListName); } @@ -417,7 +421,8 @@ public class Link extends ACSObject { swapKeys(false, queryName, operationName, ""); } - public void swapWithPrevious(String queryName, String operationName, String linkListName) { + public void swapWithPrevious(String queryName, String operationName, + String linkListName) { swapKeys(false, queryName, operationName, linkListName); } @@ -457,12 +462,12 @@ public class Link extends ACSObject { * @param queryName This is used to find the key with which to swap */ protected void swapKeys(boolean swapNext, String queryName, - String operationName) { + String operationName) { this.swapKeys(swapNext, queryName, operationName, ""); } protected void swapKeys(boolean swapNext, String queryName, - String operationName, String linkListName) { + String operationName, String linkListName) { String methodName = null; if (swapNext) { @@ -472,7 +477,7 @@ public class Link extends ACSObject { } Assert.isTrue(!isNew(), methodName + " cannot be called on an " - + "object that is new"); + + "object that is new"); Integer currentKey = (Integer) get(ORDER); // if the current item is not already ordered, alphabetize @@ -483,8 +488,8 @@ public class Link extends ACSObject { return; } Assert.isTrue(currentKey != null, methodName + " cannot be " - + "called on an object that is not currently in the " - + "list"); + + "called on an object that is not currently in the " + + "list"); int key = currentKey.intValue(); @@ -493,24 +498,26 @@ public class Link extends ACSObject { int otherKey = key; + + if (swapNext) { otherKey = key + 1; query.addOrder("linkOrder ASC"); query.addFilter(query.getFilterFactory().greaterThan("linkOrder", - currentKey, - true)); + currentKey, + true)); } else { otherKey = key - 1; query.addOrder("linkOrder DESC"); query.addFilter(query.getFilterFactory().lessThan("linkOrder", - currentKey, true)); + currentKey, true)); } if (query.next()) { otherKey = ((Integer) query.get("linkOrder")).intValue(); query.close(); - } - + } + DataOperation operation = getSwapOperation(operationName); operation.setParameter("linkOrder", new Integer(key)); operation.setParameter("nextLinkOrder", new Integer(otherKey)); diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTable.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTable.java index 1d9a39a1d..0badaf710 100755 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTable.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTable.java @@ -50,9 +50,8 @@ import com.arsdigita.cms.dispatcher.Utilities; * @version $Revision: #6 $ $Date: 2004/08/17 $ * @author Nobuko Asakai (nasakai@redhat.com) */ - public class LinkTable extends Table { - + private static final Logger s_log = Logger.getLogger(LinkTable.class); private LinkSelectionModel m_linkModel; private ItemSelectionModel m_itemModel; @@ -62,11 +61,8 @@ public class LinkTable extends Table { private TableColumn m_moveDownCol; private TableColumn m_editCol; private TableColumn m_delCol; - private RequestLocal m_size; private RequestLocal m_editor; - - protected static final String EDIT_EVENT = "Edit"; protected static final String DELETE_EVENT = "Delete"; protected static final String UP_EVENT = "up"; @@ -90,18 +86,18 @@ public class LinkTable extends Table { m_size = new RequestLocal(); m_editor = new RequestLocal() { - public Object initialValue(PageState state) { - SecurityManager sm = Utilities.getSecurityManager(state); - ContentItem item = (ContentItem)m_itemModel - .getSelectedObject(state); - Boolean val = new Boolean(sm.canAccess( - state.getRequest(), - SecurityManager.EDIT_ITEM, - item - )); - return val; - } - }; + + public Object initialValue(PageState state) { + SecurityManager sm = Utilities.getSecurityManager(state); + ContentItem item = (ContentItem) m_itemModel.getSelectedObject( + state); + Boolean val = new Boolean(sm.canAccess( + state.getRequest(), + SecurityManager.EDIT_ITEM, + item)); + return val; + } + }; Label empty = new Label("There are no links for this content item"); setEmptyView(empty); @@ -117,9 +113,9 @@ public class LinkTable extends Table { TableColumnModel model = getColumnModel(); int i = 0; m_titleCol = new TableColumn(i, "Link"); - m_descCol = new TableColumn(++i, "Description"); - m_editCol = new TableColumn(++i, "Edit"); - m_delCol = new TableColumn(++i, "Delete"); + m_descCol = new TableColumn(++i, "Description"); + m_editCol = new TableColumn(++i, "Edit"); + m_delCol = new TableColumn(++i, "Delete"); m_moveUpCol = new TableColumn(++i, ""); m_moveDownCol = new TableColumn(++i, ""); model.add(m_titleCol); @@ -135,36 +131,38 @@ public class LinkTable extends Table { * TableCellRenderer class for LinkTable */ private class LinkTableRenderer implements TableCellRenderer { + public Component getComponent(Table table, PageState state, Object value, boolean isSelected, Object key, int row, - int column) { - Link link = (Link)value; - boolean isFirst = (row == 0); - if (m_size.get(state) == null) { - m_size.set(state, - new Long(((LinkTableModelBuilder.LinkTableModel) - table.getTableModel(state)).size())); - } - boolean isLast = (row == ((Long)m_size.get(state)).intValue() - 1); - - String url = link.getInternalOrExternalURI(state); - if (column == m_titleCol.getModelIndex()) { - ExternalLink extLink = new ExternalLink(link.getTitle(), url); - extLink.setTargetFrame("_blank"); + int column) { + Link link = (Link) value; + boolean isFirst = (row == 0); + if (m_size.get(state) == null) { + m_size.set(state, + new Long(((LinkTableModelBuilder.LinkTableModel) table. + getTableModel(state)).size())); + } + boolean isLast = (row == ((Long) m_size.get(state)).intValue() - 1); + + + if (column == m_titleCol.getModelIndex()) { + String url = link.getInternalOrExternalURI(state); + ExternalLink extLink = new ExternalLink(link.getTitle(), url); + extLink.setTargetFrame("_blank"); return extLink; - } else if ( column == m_descCol.getModelIndex()) { - if ( isSelected ) { + } else if (column == m_descCol.getModelIndex()) { + if (isSelected) { return new Label(link.getDescription(), Label.BOLD); } else { return new Label(link.getDescription()); } - } else if ( column == m_editCol.getModelIndex()) { + } else if (column == m_editCol.getModelIndex()) { if (Boolean.TRUE.equals(m_editor.get(state))) { - if (isSelected ) { + if (isSelected) { return new Label(EDIT_EVENT, Label.BOLD); } else { return new ControlLink(EDIT_EVENT); @@ -172,7 +170,7 @@ public class LinkTable extends Table { } else { return new Label(EDIT_EVENT); } - } else if ( column == m_delCol.getModelIndex()) { + } else if (column == m_delCol.getModelIndex()) { if (Boolean.TRUE.equals(m_editor.get(state))) { return new ControlLink(DELETE_EVENT); } else { @@ -180,20 +178,20 @@ public class LinkTable extends Table { } } else if (column == m_moveUpCol.getModelIndex()) { if (Boolean.TRUE.equals(m_editor.get(state)) && !isFirst) { - Label upLabel = new Label(UP_EVENT); - upLabel.setClassAttr("linkSort"); - return new ControlLink(upLabel); + Label upLabel = new Label(UP_EVENT); + upLabel.setClassAttr("linkSort"); + return new ControlLink(upLabel); } else { - return new Label(""); - } + return new Label(""); + } } else if (column == m_moveDownCol.getModelIndex()) { if (Boolean.TRUE.equals(m_editor.get(state)) && !isLast) { - Label downLabel = new Label(DOWN_EVENT); - downLabel.setClassAttr("linkSort"); - return new ControlLink(downLabel); + Label downLabel = new Label(DOWN_EVENT); + downLabel.setClassAttr("linkSort"); + return new ControlLink(downLabel); } else { - return new Label(""); - } + return new Label(""); + } } else { throw new UncheckedWrapperException("column out of bounds"); } @@ -204,20 +202,22 @@ public class LinkTable extends Table { * TableActionListener class for LinkTable */ private class LinkTableActionListener implements TableActionListener { + private Link getLink(TableActionEvent e) { Object o = e.getRowKey(); BigDecimal id; if (o instanceof String) { s_log.debug("row key is a string : " + o); - id = new BigDecimal((String)o); + id = new BigDecimal((String) o); } else { - id = (BigDecimal)e.getRowKey(); + id = (BigDecimal) e.getRowKey(); } Assert.exists(id); Link link; try { - link = (Link)DomainObjectFactory.newInstance(new OID(Link.BASE_DATA_OBJECT_TYPE,id)); + link = (Link) DomainObjectFactory.newInstance(new OID( + Link.BASE_DATA_OBJECT_TYPE, id)); } catch (DataObjectNotFoundException de) { throw new UncheckedWrapperException(de); } @@ -225,40 +225,41 @@ public class LinkTable extends Table { } public void cellSelected(TableActionEvent e) { - int col = e.getColumn().intValue(); - PageState state = e.getPageState(); - Link link = getLink(e); - Assert.exists(link); + int col = e.getColumn().intValue(); + PageState state = e.getPageState(); + Link link = getLink(e); + Assert.exists(link); - if (col== m_titleCol.getModelIndex()) { - // do nothing - } else if (col == m_editCol.getModelIndex()) { + if (col == m_titleCol.getModelIndex()) { + // do nothing + } else if (col == m_editCol.getModelIndex()) { if (Boolean.TRUE.equals(m_editor.get(state))) { // This selection is passed to the LinkPropertyForm s_log.debug("setting linkModel to :" + link.getTitle()); m_linkModel.setSelectedObject(state, link); } - } else if (col == m_delCol.getModelIndex()) { - if (Boolean.TRUE.equals(m_editor.get(state))) { - try { - s_log.debug("About to delete"); - m_linkModel.clearSelection(state); - link.delete(); - } catch ( PersistenceException pe) { - throw new UncheckedWrapperException(pe); - } - } - } else if (col == m_moveUpCol.getModelIndex() ) { - // move the link up - m_linkModel.clearSelection(state); - link.swapWithPrevious(); - } else if ( col == m_moveDownCol.getModelIndex() ) { - // move the link down - m_linkModel.clearSelection(state); - link.swapWithNext(); - } - } + } else if (col == m_delCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state))) { + try { + s_log.debug("About to delete"); + m_linkModel.clearSelection(state); + link.delete(); + } catch (PersistenceException pe) { + throw new UncheckedWrapperException(pe); + } + } + } else if (col == m_moveUpCol.getModelIndex()) { + // move the link up + m_linkModel.clearSelection(state); + link.swapWithPrevious(); + } else if (col == m_moveDownCol.getModelIndex()) { + // move the link down + m_linkModel.clearSelection(state); + link.swapWithNext(); + } + } - public void headSelected(TableActionEvent e) {} + public void headSelected(TableActionEvent e) { + } } } diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTableModelBuilder.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTableModelBuilder.java index a259ec25a..e973c9ef1 100755 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTableModelBuilder.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/LinkTableModelBuilder.java @@ -36,12 +36,11 @@ import org.apache.log4j.Logger; * @version $Revision: #4 $ $Date: 2004/08/17 $ * @author Nobuko Asakai (nasakai@redhat.com) */ +public abstract class LinkTableModelBuilder + extends LockableImpl implements TableModelBuilder { -public abstract class LinkTableModelBuilder - extends LockableImpl implements TableModelBuilder { - private static final Logger s_log = - Logger.getLogger(LinkTableModelBuilder.class); - + private static final Logger s_log = + Logger.getLogger(LinkTableModelBuilder.class); /** * Creates the LinKTableModel based on the current table and pagestate @@ -55,7 +54,7 @@ public abstract class LinkTableModelBuilder DataCollection links = getLinks(s); - if ( links.isEmpty() ) { + if (links.isEmpty()) { return Table.EMPTY_MODEL; } else { return new LinkTableModel(links); @@ -75,18 +74,25 @@ public abstract class LinkTableModelBuilder * TableModel implementation for Links */ public static class LinkTableModel implements TableModel { - + Link m_link; DataCollection m_links; + public LinkTableModel(DataCollection links) { m_links = links; m_link = null; } public boolean nextRow() { + s_log.debug(String.format("m_links.size() = %d", m_links.size())); + if (m_links.next()) { + s_log.debug("Getting domain object for link..."); + long now = System.currentTimeMillis(); DataObject object = m_links.getDataObject(); - m_link = (Link)DomainObjectFactory.newInstance(object); + m_link = (Link) DomainObjectFactory.newInstance(object); + s_log.debug(String.format("Got domain object in %d ms", System. + currentTimeMillis() - now)); return true; } else { return false; @@ -94,7 +100,7 @@ public abstract class LinkTableModelBuilder } public int getColumnCount() { - return (int)m_links.size(); + return (int) m_links.size(); } @@ -105,8 +111,9 @@ public abstract class LinkTableModelBuilder public Object getKeyAt(int columnIndex) { return m_link.getID(); } + public long size() { - return m_links.size(); - } + return m_links.size(); + } } } diff --git a/ccm-core/src/com/arsdigita/bebop/Table.java b/ccm-core/src/com/arsdigita/bebop/Table.java index 2f8635e98..ff39ad789 100755 --- a/ccm-core/src/com/arsdigita/bebop/Table.java +++ b/ccm-core/src/com/arsdigita/bebop/Table.java @@ -38,6 +38,7 @@ import com.arsdigita.util.Assert; import com.arsdigita.xml.Element; import java.util.Iterator; import javax.servlet.ServletException; +import org.apache.log4j.Logger; /** * Displays statically or @@ -92,45 +93,33 @@ import javax.servlet.ServletException; */ public class Table extends BlockStylable implements BebopConstants { + private static final Logger logger = Logger.getLogger(Table.class); // Names for HTML Attributes private static final String WIDTH = "width"; private static final String CELL_SPACING = "cellspacing"; private static final String CELL_PADDING = "cellpadding"; private static final String BORDER = "border"; - - private static final String SELECTED_ROW="row"; - + private static final String SELECTED_ROW = "row"; /** * The control event when the user selects one table cell. * This control event will only be used when */ protected static final String CELL_EVENT = "cell"; - protected static final char SEP = ' '; - private TableModelBuilder m_modelBuilder; - private TableColumnModel m_columnModel; - private TableHeader m_header; - private RequestLocal m_tableModel; - private SingleSelectionModel m_rowSelectionModel; - /** * A listener to forward headSelected events originating from the * TableHeader. This will be null until somebody actually registers a * TableActionListener from the outside. */ private TableActionListener m_headerForward; - private EventListenerList m_listeners; - private TableCellRenderer m_defaultCellRenderer; - private Component m_emptyView; - private boolean m_striped = false; /** @@ -184,14 +173,13 @@ public class Table extends BlockStylable implements BebopConstants { m_columnModel = c; setHeader(new TableHeader(m_columnModel)); m_rowSelectionModel = - new ParameterSingleSelectionModel(new StringParameter(SELECTED_ROW)); + new ParameterSingleSelectionModel(new StringParameter(SELECTED_ROW)); m_listeners = new EventListenerList(); m_defaultCellRenderer = new DefaultTableCellRenderer(); initTableModel(); } // Events and listeners - /** * Adds a {@link TableActionListener} to the table. The listener is * fired whenever a table cell is clicked. @@ -200,16 +188,15 @@ public class Table extends BlockStylable implements BebopConstants { */ public void addTableActionListener(TableActionListener l) { Assert.isUnlocked(this); - if ( m_headerForward == null ) { + if (m_headerForward == null) { m_headerForward = createTableActionListener(); - if ( m_header != null ) { + if (m_header != null) { m_header.addTableActionListener(m_headerForward); } } m_listeners.add(TableActionListener.class, l); } - /** * Removes a {@link TableActionListener} from the table. * @@ -230,12 +217,11 @@ public class Table extends BlockStylable implements BebopConstants { */ protected void fireCellSelected(PageState state, Object rowKey, Integer column) { - Iterator - i=m_listeners.getListenerIterator(TableActionListener.class); + Iterator i = m_listeners.getListenerIterator(TableActionListener.class); TableActionEvent e = null; while (i.hasNext()) { - if ( e == null ) { + if (e == null) { e = new TableActionEvent(this, state, rowKey, column); } ((TableActionListener) i.next()).cellSelected(e); @@ -252,19 +238,17 @@ public class Table extends BlockStylable implements BebopConstants { */ protected void fireHeadSelected(PageState state, Object rowKey, Integer column) { - Iterator - i=m_listeners.getListenerIterator(TableActionListener.class); + Iterator i = m_listeners.getListenerIterator(TableActionListener.class); TableActionEvent e = null; while (i.hasNext()) { - if ( e == null ) { + if (e == null) { e = new TableActionEvent(this, state, rowKey, column); } ((TableActionListener) i.next()).headSelected(e); } } - /** * Instantiates a new {@link TableActionListener} for this table. * @@ -274,12 +258,12 @@ public class Table extends BlockStylable implements BebopConstants { */ protected TableActionListener createTableActionListener() { return new TableActionAdapter() { - public void headSelected(TableActionEvent e) { - fireHeadSelected(e.getPageState(), e.getRowKey(), e.getColumn()); - } - }; - } + public void headSelected(TableActionEvent e) { + fireHeadSelected(e.getPageState(), e.getRowKey(), e.getColumn()); + } + }; + } /** * @return the {@link TableColumnModel} for this table. @@ -310,7 +294,7 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v the new {@link TableModelBuilder} */ - public void setModelBuilder(TableModelBuilder v) { + public void setModelBuilder(TableModelBuilder v) { Assert.isUnlocked(this); m_modelBuilder = v; } @@ -329,18 +313,18 @@ public class Table extends BlockStylable implements BebopConstants { * @param v the new header for this table. If null, the header will be * hidden. */ - public void setHeader(TableHeader v) { + public void setHeader(TableHeader v) { Assert.isUnlocked(this); - if ( m_headerForward != null ) { - if ( m_header != null ) { + if (m_headerForward != null) { + if (m_header != null) { m_header.removeTableActionListener(m_headerForward); } - if ( v != null ) { + if (v != null) { v.addTableActionListener(m_headerForward); } } m_header = v; - if ( m_header != null ) { + if (m_header != null) { m_header.setTable(this); } } @@ -361,7 +345,7 @@ public class Table extends BlockStylable implements BebopConstants { * @param i the numerical index of the column * @param v the column that is to be mapped at i */ - public void setColumn(int i, TableColumn v) { + public void setColumn(int i, TableColumn v) { getColumnModel().set(i, v); } @@ -379,7 +363,7 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v a {@link SingleSelectionModel} */ - public void setRowSelectionModel(SingleSelectionModel v) { + public void setRowSelectionModel(SingleSelectionModel v) { Assert.isUnlocked(this); m_rowSelectionModel = v; } @@ -389,8 +373,8 @@ public class Table extends BlockStylable implements BebopConstants { * for selecting the current column. */ public SingleSelectionModel getColumnSelectionModel() { - return ( getColumnModel() == null ) ? null : - getColumnModel().getSelectionModel(); + return (getColumnModel() == null) ? null : getColumnModel(). + getSelectionModel(); } /** @@ -399,7 +383,7 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v a {@link SingleSelectionModel} */ - public void setColumnSelectionModel(SingleSelectionModel v) { + public void setColumnSelectionModel(SingleSelectionModel v) { Assert.isUnlocked(this); // TODO: make sure table gets notified of changes getColumnModel().setSelectionModel(v); @@ -431,7 +415,7 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v the default {@link TableCellRenderer} */ - public final void setDefaultCellRenderer(TableCellRenderer v) { + public final void setDefaultCellRenderer(TableCellRenderer v) { m_defaultCellRenderer = v; } @@ -443,7 +427,6 @@ public class Table extends BlockStylable implements BebopConstants { return m_emptyView; } - /** * Sets the empty view. The empty view is the component that * is shown if the table is empty. Usually, the component @@ -451,12 +434,11 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v a Bebop component */ - public final void setEmptyView(Component v) { + public final void setEmptyView(Component v) { m_emptyView = v; } // Set HTML table attributes - /** * * @return the HTML width of the table. @@ -469,7 +451,7 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v the HTML width of the table */ - public void setWidth(String v) { + public void setWidth(String v) { setAttribute(WIDTH, v); } @@ -485,11 +467,10 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v the HTML border of the table */ - public void setBorder(String v) { + public void setBorder(String v) { setAttribute(BORDER, v); } - public String getCellSpacing() { return getAttribute(CELL_SPACING); } @@ -498,7 +479,7 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v the HTML width of the table */ - public void setCellSpacing(String v) { + public void setCellSpacing(String v) { setAttribute(CELL_SPACING, v); } @@ -514,7 +495,7 @@ public class Table extends BlockStylable implements BebopConstants { * * @param v the HTML cell padding of the table */ - public void setCellPadding(String v) { + public void setCellPadding(String v) { setAttribute(CELL_PADDING, v); } @@ -529,13 +510,13 @@ public class Table extends BlockStylable implements BebopConstants { String rowKey = null; Integer column = null; - if ( CELL_EVENT.equals(event) ) { + if (CELL_EVENT.equals(event)) { String value = s.getControlEventValue(); SingleSelectionModel rowSel = getRowSelectionModel(); SingleSelectionModel colSel = getColumnSelectionModel(); int split = value.indexOf(SEP); rowKey = value.substring(0, split); - column = new Integer(value.substring(split+1)); + column = new Integer(value.substring(split + 1)); colSel.setSelectedKey(s, column); rowSel.setSelectedKey(s, rowKey); fireCellSelected(s, rowKey, column); @@ -552,12 +533,14 @@ public class Table extends BlockStylable implements BebopConstants { * @param p the page that contains this table */ public void register(Page p) { - ParameterModel m = getRowSelectionModel() == null ? null : getRowSelectionModel().getStateParameter(); - if ( m != null ) { + ParameterModel m = getRowSelectionModel() == null ? null + : getRowSelectionModel().getStateParameter(); + if (m != null) { p.addComponentStateParam(this, m); } - m = getColumnSelectionModel() == null ? null : getColumnSelectionModel().getStateParameter(); - if ( m != null ) { + m = getColumnSelectionModel() == null ? null : getColumnSelectionModel(). + getStateParameter(); + if (m != null) { p.addComponentStateParam(this, m); } return; @@ -571,25 +554,26 @@ public class Table extends BlockStylable implements BebopConstants { */ public Iterator children() { return new Iterator() { - int pos = (getHeader()==null) ? -1 : -2; - public boolean hasNext() { - return pos < getColumnModel().size() -1; - } + int pos = (getHeader() == null) ? -1 : -2; - public Object next() { - pos += 1; - if ( pos == -1 ) { - return getHeader(); - } else { - return getColumn(pos); - } - } + public boolean hasNext() { + return pos < getColumnModel().size() - 1; + } - public void remove() { - throw new UnsupportedOperationException("Read-only iterator."); + public Object next() { + pos += 1; + if (pos == -1) { + return getHeader(); + } else { + return getColumn(pos); } - }; + } + + public void remove() { + throw new UnsupportedOperationException("Read-only iterator."); + } + }; } /** @@ -601,12 +585,12 @@ public class Table extends BlockStylable implements BebopConstants { * false otherwise. */ public boolean isSelectedRow(PageState s, Object rowKey) { - if ( rowKey == null || getRowSelectionModel() == null) { + if (rowKey == null || getRowSelectionModel() == null) { return false; } return getRowSelectionModel().isSelected(s) - && rowKey.toString().equals( - getRowSelectionModel().getSelectedKey(s).toString()); + && rowKey.toString().equals( + getRowSelectionModel().getSelectedKey(s).toString()); } /** @@ -619,12 +603,12 @@ public class Table extends BlockStylable implements BebopConstants { * false otherwise. */ public boolean isSelectedColumn(PageState s, Object column) { - if ( column == null || getColumnSelectionModel() == null) { + if (column == null || getColumnSelectionModel() == null) { return false; } return getColumnSelectionModel().isSelected(s) - && column.toString().equals( - getColumnSelectionModel().getSelectedKey(s).toString()); + && column.toString().equals( + getColumnSelectionModel().getSelectedKey(s).toString()); } /** @@ -644,7 +628,6 @@ public class Table extends BlockStylable implements BebopConstants { return isSelectedRow(s, rowKey) && isSelectedColumn(s, column); } - public void setStriped(boolean striped) { m_striped = striped; } @@ -695,13 +678,13 @@ public class Table extends BlockStylable implements BebopConstants { final boolean tableIsRegisteredWithPage = - s.getPage().stateContains(getControler()); + s.getPage().stateContains(getControler()); if (model.nextRow()) { Element table = p.newChildElement(BEBOP_TABLE, BEBOP_XML_NS); exportAttributes(table); generateExtraXMLAttributes(s, table); - if ( getHeader() != null ) { + if (getHeader() != null) { getHeader().generateXML(s, table); } Element tbody = table.newChildElement(BEBOP_TABLEBODY, BEBOP_XML_NS); @@ -711,37 +694,63 @@ public class Table extends BlockStylable implements BebopConstants { final int modelSize = getColumnModel().size(); int row = 0; - do { - Element trow = tbody.newChildElement(BEBOP_TABLEROW, BEBOP_XML_NS); - for (int i=0; i< modelSize; i++) { + logger.debug("Creating table rows..."); + long start = System.currentTimeMillis(); + do { + long rowStart = System.currentTimeMillis(); + Element trow = tbody.newChildElement(BEBOP_TABLEROW, + BEBOP_XML_NS); + + for (int i = 0; i < modelSize; i++) { TableColumn tc = getColumn(i); - if ( tc.isVisible(s) ) { + if (tc.isVisible(s)) { TableCellRenderer r = tc.getCellRenderer(); - if ( r == null ) { + if (r == null) { r = m_defaultCellRenderer; } final int modelIndex = tc.getModelIndex(); Object key = model.getKeyAt(modelIndex); Object value = model.getElementAt(modelIndex); - boolean selected = isSelectedCell(s, key, new Integer(i)); + boolean selected = + isSelectedCell(s, key, new Integer(i)); if (tableIsRegisteredWithPage) { - StringBuffer coords = new StringBuffer(40); - coords.append(model.getKeyAt(modelIndex)) - .append(SEP).append(i); + /*StringBuffer coords = new StringBuffer(40); + coords.append(model.getKeyAt(modelIndex)).append(SEP). + append(i); s.setControlEvent(getControler(), CELL_EVENT, - coords.toString()); + coords.toString());*/ + + s.setControlEvent(getControler(), + CELL_EVENT, + String.format("%s%s%d", + model.getKeyAt( + modelIndex), + SEP, + i)); } - Element cell = trow.newChildElement(BEBOP_CELL, BEBOP_XML_NS); + + Element cell = trow.newChildElement(BEBOP_CELL, + BEBOP_XML_NS); + tc.exportCellAttributes(cell); - r.getComponent(this, s, value, selected, key, row, i) - .generateXML(s, cell); + long begin = System.currentTimeMillis(); + r.getComponent(this, s, value, selected, key, row, i). + generateXML(s, cell); + logger.debug(String.format("until here i needed %d ms", + System.currentTimeMillis() + - begin)); } } row += 1; + logger.debug( + String.format("Created row in %d ms", + System.currentTimeMillis() - rowStart)); } while (model.nextRow()); - } else if ( m_emptyView != null ) { + logger.debug(String.format("Build table rows in %d ms", + System.currentTimeMillis() - start)); + } else if (m_emptyView != null) { m_emptyView.generateXML(s, p); } if (tableIsRegisteredWithPage) { @@ -771,10 +780,11 @@ public class Table extends BlockStylable implements BebopConstants { */ private void initTableModel() { m_tableModel = new RequestLocal() { - protected Object initialValue(PageState s) { - return m_modelBuilder.makeModel(Table.this, s); - } - }; + + protected Object initialValue(PageState s) { + return m_modelBuilder.makeModel(Table.this, s); + } + }; } /** @@ -799,7 +809,7 @@ public class Table extends BlockStylable implements BebopConstants { * builder use row numbers, converted to strings, as the key for * each column of a row. */ public static class MatrixTableModelBuilder - extends AbstractTableModelBuilder { + extends AbstractTableModelBuilder { private Object[][] m_data; @@ -809,48 +819,46 @@ public class Table extends BlockStylable implements BebopConstants { public TableModel makeModel(Table t, PageState s) { return new TableModel() { - private int row = -1; - public int getColumnCount() { - return m_data[0].length; - } + private int row = -1; - public boolean nextRow() { - return ( ++row < m_data.length ); - } + public int getColumnCount() { + return m_data[0].length; + } - public Object getElementAt(int j) { - return m_data[row][j]; - } + public boolean nextRow() { + return (++row < m_data.length); + } - public Object getKeyAt(int j) { - return String.valueOf(row); - } - }; + public Object getElementAt(int j) { + return m_data[row][j]; + } + + public Object getKeyAt(int j) { + return String.valueOf(row); + } + }; } } - - /** * A {@link TableModel} that has no rows. */ public static final TableModel EMPTY_MODEL = new TableModel() { - public int getColumnCount() { - return 0; - } + public int getColumnCount() { + return 0; + } - public boolean nextRow() { - return false; - } + public boolean nextRow() { + return false; + } - public Object getKeyAt(int column) { - throw new IllegalStateException("TableModel is empty"); - } - - public Object getElementAt(int column) { - throw new IllegalStateException("TableModel is empty"); - } - }; + public Object getKeyAt(int column) { + throw new IllegalStateException("TableModel is empty"); + } + public Object getElementAt(int column) { + throw new IllegalStateException("TableModel is empty"); + } + }; } diff --git a/ccm-core/src/com/arsdigita/web/URL.java b/ccm-core/src/com/arsdigita/web/URL.java index 6a407c78e..03df5fb94 100755 --- a/ccm-core/src/com/arsdigita/web/URL.java +++ b/ccm-core/src/com/arsdigita/web/URL.java @@ -854,8 +854,8 @@ public class URL { } public static URL excursion(final HttpServletRequest sreq, - final String path, - final ParameterMap params) { + final String path, + final ParameterMap params) { if (s_log.isDebugEnabled()) { s_log.debug("Creating excursion URL to " + path); } @@ -868,7 +868,7 @@ public class URL { } public static URL excursion(final HttpServletRequest sreq, - final String path) { + final String path) { return URL.excursion(sreq, path, new ParameterMap()); } @@ -889,15 +889,15 @@ public class URL { * @return a String URL */ @Override - public final String toString() { - if (m_params == null) { + public final String toString() { + if (m_params == null) { return m_url.substring(m_serverPortEnd); } else { String str = m_url.substring(m_serverPortEnd); - if (str.contains("?")) { + if (str.contains("?")) { return String.format("%s%s", m_url.substring(m_serverPortEnd), m_params.toString().replace('?', '&')); - } else { + } else { return m_url.substring(m_serverPortEnd) + m_params; } }