diff --git a/ccm-core/sql/ccm-core/default/upgrade/6.5.3-6.5.4/insert-application-container-group-columns.sql b/ccm-core/sql/ccm-core/default/upgrade/6.5.3-6.5.4/insert-application-container-group-columns.sql index fbac1b88f..aecb98de5 100755 --- a/ccm-core/sql/ccm-core/default/upgrade/6.5.3-6.5.4/insert-application-container-group-columns.sql +++ b/ccm-core/sql/ccm-core/default/upgrade/6.5.3-6.5.4/insert-application-container-group-columns.sql @@ -14,10 +14,10 @@ -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- alter table application_types -add (container_group_id NUMBER); +add container_group_id integer; alter table applications -add (container_group_id NUMBER); +add container_group_id integer; alter table application_types add constraint applic_typ_cont_gro_id_f_lszuh foreign key (container_group_id) diff --git a/ccm-core/src/ccm-core.config b/ccm-core/src/ccm-core.config index f50485673..45961ee4d 100755 --- a/ccm-core/src/ccm-core.config +++ b/ccm-core/src/ccm-core.config @@ -34,4 +34,6 @@ storage="ccm-core/core-xml.properties"/> + diff --git a/ccm-core/src/com/arsdigita/domain/Domain.java b/ccm-core/src/com/arsdigita/domain/Domain.java new file mode 100644 index 000000000..75f43a7e2 --- /dev/null +++ b/ccm-core/src/com/arsdigita/domain/Domain.java @@ -0,0 +1,21 @@ +package com.arsdigita.domain; + + +public class Domain { + + + private static DomainConfig s_config; + + /** + * Gets the DomainConfig object. + */ + public static final DomainConfig getConfig() { + if (s_config == null) { + s_config = new DomainConfig(); + s_config.load("ccm-core/domain.properties"); + } + return s_config; + + } + +} diff --git a/ccm-core/src/com/arsdigita/domain/DomainConfig.java b/ccm-core/src/com/arsdigita/domain/DomainConfig.java new file mode 100644 index 000000000..051983e7f --- /dev/null +++ b/ccm-core/src/com/arsdigita/domain/DomainConfig.java @@ -0,0 +1,25 @@ +package com.arsdigita.domain; + +import com.arsdigita.runtime.AbstractConfig; +import com.arsdigita.util.parameter.BooleanParameter; +import com.arsdigita.util.parameter.Parameter; + +public final class DomainConfig extends AbstractConfig { + + private final BooleanParameter m_queryBlobContent; + + public DomainConfig() { + + m_queryBlobContent = new BooleanParameter( + "waf.domain.query_file_attachment_blob", Parameter.OPTIONAL, + Boolean.TRUE); + + register(m_queryBlobContent); + loadInfo(); + } + + public boolean queryBlobContentForFileAttachments() { + return ((Boolean) get(m_queryBlobContent)).booleanValue(); + } + +} diff --git a/ccm-core/src/com/arsdigita/domain/DomainConfig_parameter.properties b/ccm-core/src/com/arsdigita/domain/DomainConfig_parameter.properties new file mode 100644 index 000000000..64bcb2c83 --- /dev/null +++ b/ccm-core/src/com/arsdigita/domain/DomainConfig_parameter.properties @@ -0,0 +1,4 @@ +waf.domain.query_file_attachment_blob.title=Unnecessarily Query Blobs? +waf.domain.query_file_attachment_blob.purpose=Allows you to prevent an unnecessary and expensive query on cms_files.content. For legacy reasons the defualt is true - go on set it to false.. (assuming that you have ccm-cms-assets-fileattachment loaded) +waf.domain.query_file_attachment_blob.example=true|false +waf.domain.query_file_attachment_blob.format=[boolean] \ No newline at end of file diff --git a/ccm-core/src/com/arsdigita/domain/DomainObjectTraversal.java b/ccm-core/src/com/arsdigita/domain/DomainObjectTraversal.java index 1926739ec..d840b9dc7 100755 --- a/ccm-core/src/com/arsdigita/domain/DomainObjectTraversal.java +++ b/ccm-core/src/com/arsdigita/domain/DomainObjectTraversal.java @@ -22,9 +22,12 @@ import com.arsdigita.util.Assert; import com.arsdigita.persistence.metadata.ObjectType; import com.arsdigita.persistence.metadata.Property; +import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.DataAssociation; import com.arsdigita.persistence.DataAssociationCursor; +import com.arsdigita.persistence.DataQuery; +import com.arsdigita.persistence.DataQueryDataCollectionAdapter; import com.arsdigita.persistence.OID; import com.arsdigita.persistence.SessionManager; @@ -323,15 +326,38 @@ public abstract class DomainObjectTraversal { endRole(obj, path, prop); } else if (propValue instanceof DataAssociation) { + + + // see #25808 - this hack prevents the content field of cms_files + // (which is a blob) from being queried when all we need is a list + // of the files on an item.. + if (prop.getName().equals("fileAttachments") && !Domain.getConfig().queryBlobContentForFileAttachments()) { // make true a config + DataQuery fileAttachmentsQuery = SessionManager.getSession().retrieveQuery("com.arsdigita.cms.contentassets.fileAttachmentsQuery"); + + fileAttachmentsQuery.setParameter("item_id", obj.getOID().get("id")); + + DataCollection files = new DataQueryDataCollectionAdapter(fileAttachmentsQuery, "file"); + + while(files.next()) { + DataObject file = files.getDataObject(); + walk(adapter, + DomainObjectFactory.newInstance + (file), + appendToPath(path, propName), + context, + null); + } + + } else { + if( s_log.isDebugEnabled() ) { s_log.debug( prop.getName() + " is a DataAssociation" ); } - beginAssociation(obj, path, prop); - + DataAssociationCursor daCursor = ((DataAssociation)propValue).getDataAssociationCursor(); - + while (daCursor.next()) { DataObject link = daCursor.getLink(); DomainObject linkObj = null; @@ -345,8 +371,8 @@ public abstract class DomainObjectTraversal { context, linkObj); } - endAssociation(obj, path, prop); + } } else { // Unknown property value type - do nothing }