/* * Copyright (C) 2012 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.impl.quota; import org.exoplatform.services.jcr.dataflow.ItemDataConsumer; import org.exoplatform.services.jcr.dataflow.ItemDataTraversingVisitor; import org.exoplatform.services.jcr.datamodel.ItemType; import org.exoplatform.services.jcr.datamodel.NodeData; import org.exoplatform.services.jcr.datamodel.PropertyData; import org.exoplatform.services.jcr.datamodel.QPathEntry; import org.exoplatform.services.jcr.impl.Constants; import org.exoplatform.services.jcr.impl.core.JCRPath; import org.exoplatform.services.jcr.impl.core.LocationFactory; import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import javax.jcr.ItemNotFoundException; import javax.jcr.RepositoryException; /** * @author <a href="abazko@exoplatform.com">Anatoliy Bazko</a> * @version $Id: CalculateNodeDataSizeTool.java 34360 2009-07-22 23:58:59Z tolusha $ */ public class CalculateNodeDataSizeTool { /** * Logger. */ private final Log LOG = ExoLogger.getLogger("exo.jcr.component.core.CalculateNodeDataSizeTask"); /** * Workspace name. */ protected final String wsName; /** * Repository name. */ protected final String rName; /** * {@link QuotaPersister} */ protected final QuotaPersister quotaPersister; /** * {@link WorkspacePersistentDataManager}. */ protected final WorkspacePersistentDataManager dataManager; /** * {@link LocationFactory} instance. */ protected final LocationFactory lFactory; /** * CalculateNodeDataSizeTask constructor. */ public CalculateNodeDataSizeTool(WorkspaceQuotaContext context) { this.wsName = context.wsName; this.rName = context.rName; this.quotaPersister = context.quotaPersister; this.dataManager = context.dataManager; this.lFactory = context.lFactory; } /** * Calculates node data size directly and persists value into {@link QuotaPersister}. */ public void getAndSetNodeDataSize(String nodePath) { try { long dataSize = getNodeDataSizeDirectly(nodePath); quotaPersister.setNodeDataSizeIfQuotaExists(rName, wsName, nodePath, dataSize); } catch (QuotaManagerException e) { LOG.warn("Can't calculate node data size " + nodePath + " because: " + e.getCause().getMessage()); } } /** * Calculates node data size by asking directly respective {@link WorkspacePersistentDataManager}. */ public long getNodeDataSizeDirectly(String nodePath) throws QuotaManagerException { try { NodeData node = (NodeData)dataManager.getItemData(Constants.ROOT_UUID); JCRPath path = lFactory.parseRelPath(nodePath.substring(1)); // let ignore root entry '[]:1' for (QPathEntry entry : path.getInternalPath().getEntries()) { node = (NodeData)dataManager.getItemData(node, entry, ItemType.NODE, false); if (node == null) // may be already removed { throw new ItemNotFoundException("Node " + nodePath + " not found in workspace"); } } CalculateNodeDataSizeVisitor visitor = new CalculateNodeDataSizeVisitor(dataManager); node.accept(visitor); return visitor.getSize(); } catch (RepositoryException e) { throw new QuotaManagerException(e.getMessage(), e); } } /** * Traverse over all children nodes and calculate its size. */ private class CalculateNodeDataSizeVisitor extends ItemDataTraversingVisitor { /** * Node data size. */ private long size; /** * CalculateNodeDataSizeVisitor constructor. */ public CalculateNodeDataSizeVisitor(ItemDataConsumer dataManager) { super(dataManager); } /** * {@inheritDoc} */ protected void entering(PropertyData property, int level) throws RepositoryException { } /** * {@inheritDoc} */ protected void entering(NodeData node, int level) throws RepositoryException { size += ((WorkspacePersistentDataManager)dataManager).getNodeDataSize(node.getIdentifier()); } /** * {@inheritDoc} */ protected void leaving(PropertyData property, int level) throws RepositoryException { } /** * {@inheritDoc} */ protected void leaving(NodeData node, int level) throws RepositoryException { } /** * Returns calculated node data size. */ public long getSize() { return size; } } }