(1027);
+ ContentUrlHandler handler = new ContentUrlHandler()
+ {
+ public void handle(String contentUrl)
+ {
+ urls.add(contentUrl);
+ }
+ };
+ store.getUrls(handler);
assertTrue("URL of new content not present in store", urls.contains(contentUrl) == mustExist);
}
}
diff --git a/source/java/org/alfresco/repo/domain/ContentUrl.java b/source/java/org/alfresco/repo/domain/ContentUrl.java
new file mode 100644
index 0000000000..949e3a4b0a
--- /dev/null
+++ b/source/java/org/alfresco/repo/domain/ContentUrl.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2005-2007 Alfresco Software Limited.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ * As a special exception to the terms and conditions of version 2.0 of
+ * the GPL, you may redistribute this Program in connection with Free/Libre
+ * and Open Source Software ("FLOSS") applications as described in Alfresco's
+ * FLOSS exception. You should have recieved a copy of the text describing
+ * the FLOSS exception, and it is also available here:
+ * http://www.alfresco.com/legal/licensing
+ */
+package org.alfresco.repo.domain;
+
+/**
+ * Interface for persistent Content URL objects.
+ *
+ * Instances represent physically stored content.
+ *
+ * @author Derek Hulley
+ * @since 2.0
+ */
+public interface ContentUrl
+{
+ /**
+ * @return Returns the auto-generated ID
+ */
+ Long getId();
+
+ String getContentUrl();
+
+ void setContentUrl(String contentUrl);
+//
+// boolean isOrphaned();
+//
+// void setOrphaned(boolean orphaned);
+}
diff --git a/source/java/org/alfresco/repo/domain/ContentUrlDAO.java b/source/java/org/alfresco/repo/domain/ContentUrlDAO.java
new file mode 100644
index 0000000000..b881238d3a
--- /dev/null
+++ b/source/java/org/alfresco/repo/domain/ContentUrlDAO.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2005-2007 Alfresco Software Limited.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * As a special exception to the terms and conditions of version 2.0 of
+ * the GPL, you may redistribute this Program in connection with Free/Libre
+ * and Open Source Software ("FLOSS") applications as described in Alfresco's
+ * FLOSS exception. You should have recieved a copy of the text describing
+ * the FLOSS exception, and it is also available here:
+ * http://www.alfresco.com/legal/licensing */
+
+package org.alfresco.repo.domain;
+
+import java.util.Set;
+
+/**
+ * Abstraction for manipulating Content URL entities.
+ *
+ * @author Derek Hulley
+ * @since 2.0
+ */
+public interface ContentUrlDAO
+{
+ /**
+ * Create a new Content URL or get an existing instance.
+ */
+ ContentUrl createContentUrl(String contentUrl);
+
+ /**
+ * Enumerate all the available Content URLs, calling back to the given handler.
+ *
+ * @param handler the component that will be called with each URL
+ */
+ void getAllContentUrls(ContentUrlHandler handler);
+
+ /**
+ * Delete the Content URL.
+ */
+ void deleteContentUrl(String contentUrl);
+
+ /**
+ * Delete a set of Content URL.
+ */
+ void deleteContentUrls(Set contentUrls);
+
+ /**
+ * Delete all Content URL entities.
+ */
+ void deleteAllContentUrls();
+
+ /**
+ * A callback interface to handle Content URLS produced by iteration.
+ *
+ * @author Derek Hulley
+ * @since 2.0
+ */
+ public interface ContentUrlHandler
+ {
+ void handle(String contentUrl);
+ };
+}
diff --git a/source/java/org/alfresco/repo/domain/ContentUrlDAOTest.java b/source/java/org/alfresco/repo/domain/ContentUrlDAOTest.java
new file mode 100644
index 0000000000..2913a20148
--- /dev/null
+++ b/source/java/org/alfresco/repo/domain/ContentUrlDAOTest.java
@@ -0,0 +1,212 @@
+package org.alfresco.repo.domain;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.transaction.UserTransaction;
+
+import junit.framework.TestCase;
+
+import org.alfresco.repo.content.filestore.FileContentStore;
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
+import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.cmr.repository.ContentService;
+import org.alfresco.service.transaction.TransactionService;
+import org.alfresco.util.ApplicationContextHelper;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * @see org.alfresco.repo.domain.ContentUrlDAO
+ *
+ * @author Derek Hulley
+ * @since 2.1
+ */
+public class ContentUrlDAOTest extends TestCase
+{
+ private static ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
+
+ private ContentUrlDAO dao;
+ private TransactionService transactionService;
+ private ContentService contentService;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ ServiceRegistry serviceRegistry = (ServiceRegistry) ctx.getBean(ServiceRegistry.SERVICE_REGISTRY);
+ dao = (ContentUrlDAO) ctx.getBean("contentUrlDAO");
+ contentService = serviceRegistry.getContentService();
+ transactionService = serviceRegistry.getTransactionService();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ }
+
+ public void testCreateContentUrl() throws Throwable
+ {
+ UserTransaction txn = transactionService.getUserTransaction();
+ try
+ {
+ txn.begin();
+
+ RunAsWork getTempWriterWork = new RunAsWork()
+ {
+ public String doWork() throws Exception
+ {
+ return contentService.getTempWriter().getContentUrl();
+ }
+ };
+ String contentUrl = AuthenticationUtil.runAs(getTempWriterWork, AuthenticationUtil.SYSTEM_USER_NAME);
+ // Make sure that it can be written in duplicate
+ ContentUrl entity1 = dao.createContentUrl(contentUrl);
+ ContentUrl entity2 = dao.createContentUrl(contentUrl);
+ assertNotSame("Assigned IDs must be new", entity1.getId(), entity2.getId());
+
+ txn.commit();
+ }
+ catch (Throwable e)
+ {
+ try { txn.rollback(); } catch (Throwable ee) {}
+ throw e;
+ }
+ }
+
+ private Set makeUrls(int count) throws Throwable
+ {
+ final Set urls = new HashSet(count);
+ for (int i = 0; i < count; i++)
+ {
+ String contentUrl = String.format("%s%s/%04d", FileContentStore.STORE_PROTOCOL, getName(), i);
+ dao.createContentUrl(contentUrl);
+ urls.add(contentUrl);
+ }
+ return urls;
+ }
+
+ public void testGetAllContentUrls() throws Throwable
+ {
+ UserTransaction txn = transactionService.getUserTransaction();
+ try
+ {
+ txn.begin();
+
+ final Set urls = makeUrls(1000);
+
+ // Now iterate over them in the same transaction
+ ContentUrlDAO.ContentUrlHandler handler = new ContentUrlDAO.ContentUrlHandler()
+ {
+ public void handle(String contentUrl)
+ {
+ urls.remove(contentUrl);
+ }
+ };
+ dao.getAllContentUrls(handler);
+ assertEquals("Not all content URLs were enumerated", 0, urls.size());
+
+ txn.commit();
+ }
+ catch (Throwable e)
+ {
+ try { txn.rollback(); } catch (Throwable ee) {}
+ throw e;
+ }
+ }
+
+ public void testDeleteContentUrl() throws Throwable
+ {
+ UserTransaction txn = transactionService.getUserTransaction();
+ try
+ {
+ txn.begin();
+
+ final Set urls = makeUrls(1000);
+ // Delete them
+ for (String url : urls)
+ {
+ dao.deleteContentUrl(url);
+ }
+ // Now iterate over them in the same transaction
+ ContentUrlDAO.ContentUrlHandler handler = new ContentUrlDAO.ContentUrlHandler()
+ {
+ public void handle(String contentUrl)
+ {
+ urls.remove(contentUrl);
+ }
+ };
+ dao.getAllContentUrls(handler);
+ // All the URLs previously deleted will not have been removed from the Set
+ assertEquals("Specific content URLs were not deleted", 1000, urls.size());
+
+ txn.commit();
+ }
+ catch (Throwable e)
+ {
+ try { txn.rollback(); } catch (Throwable ee) {}
+ throw e;
+ }
+ }
+
+ public void testDeleteContentUrls() throws Throwable
+ {
+ UserTransaction txn = transactionService.getUserTransaction();
+ try
+ {
+ txn.begin();
+
+ final Set urls = makeUrls(1000);
+ // Delete them
+ dao.deleteContentUrls(urls);
+ // Now iterate over them in the same transaction
+ ContentUrlDAO.ContentUrlHandler handler = new ContentUrlDAO.ContentUrlHandler()
+ {
+ public void handle(String contentUrl)
+ {
+ urls.remove(contentUrl);
+ }
+ };
+ dao.getAllContentUrls(handler);
+ // All the URLs previously deleted will not have been removed from the Set
+ assertEquals("Specific content URLs were not deleted", 1000, urls.size());
+
+ txn.commit();
+ }
+ catch (Throwable e)
+ {
+ try { txn.rollback(); } catch (Throwable ee) {}
+ throw e;
+ }
+ }
+
+ public void testDeleteAllContentUrls() throws Throwable
+ {
+ UserTransaction txn = transactionService.getUserTransaction();
+ try
+ {
+ txn.begin();
+
+ makeUrls(1000);
+ // Delete them
+ dao.deleteAllContentUrls();
+ // Check that there are none left
+
+ // Now iterate over them in the same transaction
+ ContentUrlDAO.ContentUrlHandler handler = new ContentUrlDAO.ContentUrlHandler()
+ {
+ public void handle(String contentUrl)
+ {
+ fail("There should not be any URLs remaining.");
+ }
+ };
+ dao.getAllContentUrls(handler);
+
+ txn.commit();
+ }
+ catch (Throwable e)
+ {
+ try { txn.rollback(); } catch (Throwable ee) {}
+ throw e;
+ }
+ }
+}
diff --git a/source/java/org/alfresco/repo/domain/hibernate/ContentUrl.hbm.xml b/source/java/org/alfresco/repo/domain/hibernate/ContentUrl.hbm.xml
new file mode 100644
index 0000000000..5325aaaaa0
--- /dev/null
+++ b/source/java/org/alfresco/repo/domain/hibernate/ContentUrl.hbm.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select
+ entity.contentUrl
+ from
+ org.alfresco.repo.domain.hibernate.ContentUrlImpl entity
+
+
+
+ delete
+ from
+ org.alfresco.repo.domain.hibernate.ContentUrlImpl entity
+ where
+ entity.contentUrl in (:contentUrls)
+
+
+
+ delete
+ from
+ org.alfresco.repo.domain.hibernate.ContentUrlImpl entity
+ where
+ entity.contentUrl = :contentUrl
+
+
+
+ delete
+ from
+ org.alfresco.repo.domain.hibernate.ContentUrlImpl entity
+
+
+
diff --git a/source/java/org/alfresco/repo/domain/hibernate/ContentUrlImpl.java b/source/java/org/alfresco/repo/domain/hibernate/ContentUrlImpl.java
new file mode 100644
index 0000000000..5335b3cc8e
--- /dev/null
+++ b/source/java/org/alfresco/repo/domain/hibernate/ContentUrlImpl.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2005-2007 Alfresco Software Limited.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ * As a special exception to the terms and conditions of version 2.0 of
+ * the GPL, you may redistribute this Program in connection with Free/Libre
+ * and Open Source Software ("FLOSS") applications as described in Alfresco's
+ * FLOSS exception. You should have recieved a copy of the text describing
+ * the FLOSS exception, and it is also available here:
+ * http://www.alfresco.com/legal/licensing
+ */
+package org.alfresco.repo.domain.hibernate;
+
+import java.io.Serializable;
+
+import org.alfresco.repo.domain.ContentUrl;
+
+/**
+ * Bean containing all the persistence data representing a Content Url.
+ *
+ * This implementation of the {@link org.alfresco.repo.domain.Node Node} interface is
+ * Hibernate specific.
+ *
+ * @author Derek Hulley
+ * @since 2.0
+ */
+public class ContentUrlImpl extends LifecycleAdapter implements ContentUrl, Serializable
+{
+ private static final long serialVersionUID = -7368859912728834288L;
+
+ private Long id;
+ private String contentUrl;
+// private boolean isOrphaned;
+
+ public ContentUrlImpl()
+ {
+// isOrphaned = false;
+ }
+
+ public Long getId()
+ {
+ return id;
+ }
+
+ /**
+ * For Hibernate Use
+ */
+ @SuppressWarnings("unused")
+ private void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public String getContentUrl()
+ {
+ return contentUrl;
+ }
+
+ public void setContentUrl(String contentUrl)
+ {
+ this.contentUrl = contentUrl;
+ }
+//
+// public boolean isOrphaned()
+// {
+// return isOrphaned;
+// }
+//
+// public void setOrphaned(boolean isOrphaned)
+// {
+// this.isOrphaned = isOrphaned;
+// }
+}
diff --git a/source/java/org/alfresco/repo/domain/hibernate/HibernateContentUrlDAOImpl.java b/source/java/org/alfresco/repo/domain/hibernate/HibernateContentUrlDAOImpl.java
new file mode 100644
index 0000000000..fb977aff38
--- /dev/null
+++ b/source/java/org/alfresco/repo/domain/hibernate/HibernateContentUrlDAOImpl.java
@@ -0,0 +1,123 @@
+package org.alfresco.repo.domain.hibernate;
+
+import java.util.Set;
+
+import org.alfresco.repo.domain.ContentUrl;
+import org.alfresco.repo.domain.ContentUrlDAO;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.CacheMode;
+import org.hibernate.Query;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.type.TypeFactory;
+import org.springframework.orm.hibernate3.HibernateCallback;
+import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
+
+/**
+ * Hibernate-specific implementation of the DAO layer for Content URLs.
+ *
+ * @author Derek Hulley
+ * @since 2.0
+ */
+public class HibernateContentUrlDAOImpl extends HibernateDaoSupport implements ContentUrlDAO
+{
+ private static final String QUERY_GET_ALL = "contentUrl.GetAll";
+ private static final String UPDATE_DELETE_BY_URL = "contentUrl.DeleteByUrl";
+ private static final String UPDATE_DELETE_IN_LIST = "contentUrl.DeleteInList";
+ private static final String UPDATE_DELETE_ALL = "contentUrl.DeleteAll";
+
+ private static Log logger = LogFactory.getLog(HibernateContentUrlDAOImpl.class);
+
+ public ContentUrl createContentUrl(String contentUrl)
+ {
+ ContentUrl entity = new ContentUrlImpl();
+ entity.setContentUrl(contentUrl);
+ getSession().save(entity);
+ return entity;
+ }
+
+ public void getAllContentUrls(final ContentUrlHandler handler)
+ {
+ HibernateCallback callback = new HibernateCallback()
+ {
+ public Object doInHibernate(Session session)
+ {
+ Query query = session
+ .getNamedQuery(HibernateContentUrlDAOImpl.QUERY_GET_ALL)
+ .setCacheMode(CacheMode.IGNORE);
+ return query.scroll(ScrollMode.FORWARD_ONLY);
+ }
+ };
+ ScrollableResults results = (ScrollableResults) getHibernateTemplate().execute(callback);
+ while (results.next())
+ {
+ String contentUrl = results.getText(0);
+ handler.handle(contentUrl);
+ }
+ }
+
+ public void deleteContentUrl(final String contentUrl)
+ {
+ HibernateCallback callback = new HibernateCallback()
+ {
+ public Object doInHibernate(Session session)
+ {
+ session.flush();
+ Query query = session
+ .getNamedQuery(HibernateContentUrlDAOImpl.UPDATE_DELETE_BY_URL)
+ .setCacheMode(CacheMode.IGNORE)
+ .setString("contentUrl", contentUrl);
+ return (Integer) query.executeUpdate();
+ }
+ };
+ Integer deletedCount = (Integer) getHibernateTemplate().execute(callback);
+ int entityCount = getSession().getStatistics().getEntityCount();
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Deleted " + deletedCount + " ContentUrl entities.");
+ }
+ }
+
+ public void deleteContentUrls(final Set contentUrls)
+ {
+ HibernateCallback callback = new HibernateCallback()
+ {
+ public Object doInHibernate(Session session)
+ {
+ session.flush();
+ Query query = session
+ .getNamedQuery(HibernateContentUrlDAOImpl.UPDATE_DELETE_IN_LIST)
+ .setCacheMode(CacheMode.IGNORE)
+ .setParameterList("contentUrls", contentUrls, TypeFactory.basic("string"));
+ return (Integer) query.executeUpdate();
+ }
+ };
+ Integer deletedCount = (Integer) getHibernateTemplate().execute(callback);
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Deleted " + deletedCount + " ContentUrl entities.");
+ }
+ }
+
+ public void deleteAllContentUrls()
+ {
+ HibernateCallback callback = new HibernateCallback()
+ {
+ public Object doInHibernate(Session session)
+ {
+ session.flush();
+ Query query = session
+ .getNamedQuery(HibernateContentUrlDAOImpl.UPDATE_DELETE_ALL)
+ .setCacheMode(CacheMode.IGNORE);
+ return (Integer) query.executeUpdate();
+ }
+ };
+ Integer deletedCount = (Integer) getHibernateTemplate().execute(callback);
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Deleted " + deletedCount + " ContentUrl entities.");
+ }
+ }
+}
diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImplTest.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImplTest.java
index d373d4b3a3..e9755a4747 100644
--- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImplTest.java
+++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImplTest.java
@@ -39,6 +39,7 @@ import org.alfresco.repo.domain.ChildAssoc;
import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.NodeStatus;
import org.alfresco.repo.node.BaseNodeServiceTest;
+import org.alfresco.repo.node.db.NodeDaoService.NodePropertyHandler;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
@@ -297,7 +298,15 @@ public class DbNodeServiceImplTest extends BaseNodeServiceTest
collection);
// get a list of all content values
- List allContentDatas = nodeDaoService.getPropertyValuesByActualType(contentDataType);
+ final List allContentDatas = new ArrayList(500);
+ NodePropertyHandler handler = new NodePropertyHandler()
+ {
+ public void handle(Node node, Serializable value)
+ {
+ allContentDatas.add(value);
+ }
+ };
+ nodeDaoService.getPropertyValuesByActualType(contentDataType, handler);
assertTrue("At least two instances expected", allContentDatas.size() >= 2);
assertTrue("Single content data not present in results",
allContentDatas.contains(contentDataSingle));
diff --git a/source/java/org/alfresco/repo/node/db/NodeDaoService.java b/source/java/org/alfresco/repo/node/db/NodeDaoService.java
index ad15290081..30f75ec3c7 100644
--- a/source/java/org/alfresco/repo/node/db/NodeDaoService.java
+++ b/source/java/org/alfresco/repo/node/db/NodeDaoService.java
@@ -277,12 +277,20 @@ public interface NodeDaoService
public void deleteNodeAssoc(NodeAssoc assoc);
/**
- * Fetch all property values for the given type definition. This will also dig out values that
+ * Iterate over all property values for the given type definition. This will also dig out values that
* were persisted as type d:any.
*
+ * @param actualDataTypeDefinition the persisted type to retrieve
+ * @param handler the callback to use while iterating over the URLs
* @return Returns the values for the given type definition
*/
- public List getPropertyValuesByActualType(DataTypeDefinition actualDataTypeDefinition);
+ public void getPropertyValuesByActualType(DataTypeDefinition actualDataTypeDefinition, NodePropertyHandler handler);
+
+ /**
+ * Get properties with the given type and string value.
+ * TODO: Refactor as in getPropertyValuesByActualType
+ */
+ public Collection getNodesWithPropertyStringValueForStore(StoreRef storeRef, QName propQName, String propStringValue);
/**
* @return Returns the total number of nodes in the ADM repository
@@ -293,7 +301,16 @@ public interface NodeDaoService
*/
public int getNodeCount(final StoreRef storeRef);
- public Collection getNodesWithPropertyStringValueForStore(final StoreRef storeRef, final QName propQName, final String propStringValue);
+ /**
+ * Iterface to handle callbacks when iterating over properties
+ *
+ * @author Derek Hulley
+ * @since 2.0
+ */
+ public interface NodePropertyHandler
+ {
+ void handle(Node node, Serializable value);
+ }
public Transaction getTxnById(long txnId);
/**
diff --git a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java
index 7fea90d079..c96257291a 100644
--- a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java
@@ -1376,7 +1376,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
getHibernateTemplate().delete(assoc);
}
- public List getPropertyValuesByActualType(DataTypeDefinition actualDataTypeDefinition)
+ public void getPropertyValuesByActualType(DataTypeDefinition actualDataTypeDefinition, NodePropertyHandler handler)
{
// get the in-database string representation of the actual type
QName typeQName = actualDataTypeDefinition.getName();
@@ -1393,7 +1393,6 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
};
ScrollableResults results = (ScrollableResults) getHibernateTemplate().execute(callback);
// Loop through, extracting content URLs
- List convertedValues = new ArrayList(1000);
TypeConverter converter = DefaultTypeConverter.INSTANCE;
int unflushedCount = 0;
while(results.next())
@@ -1418,16 +1417,19 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
continue;
}
+ Serializable convertedValue = null;
try
{
- Serializable convertedValue = (Serializable) converter.convert(actualDataTypeDefinition, value);
- // it converted, so add it
- convertedValues.add(convertedValue);
+ convertedValue = (Serializable) converter.convert(actualDataTypeDefinition, value);
}
catch (Throwable e)
{
// The value can't be converted - forget it
}
+ if (convertedValue != null)
+ {
+ handler.handle(node, convertedValue);
+ }
}
}
unflushedCount++;
@@ -1438,7 +1440,6 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
unflushedCount = 0;
}
}
- return convertedValues;
}
/**