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;
}
}