/* * Copyright (C) 2009 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.dataflow.persistent; import org.exoplatform.services.jcr.datamodel.ItemType; import org.exoplatform.services.jcr.datamodel.QPath; import org.exoplatform.services.jcr.datamodel.QPathEntry; import org.exoplatform.services.jcr.impl.Constants; /** * Created by The eXo Platform SAS. <br> * * Store QPath as key in cache. * * 15.06.07 * * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a> * @version $Id: CacheQPath.java 13869 2008-05-05 08:40:10Z pnedonosko $ */ class CacheQPath extends CacheKey { // private static final String BASE = String.valueOf(UUID.randomUUID().hashCode()) + "-"; // static { // UUID rnd = UUID.randomUUID(); // // byte[] rb = new byte[16]; // rb[0] = (byte) (rnd.getMostSignificantBits() >>> 56 & 0x0f); // rb[1] = (byte) (rnd.getMostSignificantBits() >>> 48 & 0x0f); // rb[2] = (byte) (rnd.getMostSignificantBits() >>> 40 & 0x0f); // rb[3] = (byte) (rnd.getMostSignificantBits() >>> 32 & 0xff); // rb[4] = (byte) (rnd.getMostSignificantBits() >>> 24 & 0xff); // rb[5] = (byte) (rnd.getMostSignificantBits() >>> 16 & 0xff); // rb[6] = (byte) (rnd.getMostSignificantBits() >>> 8 & 0xff); // rb[7] = (byte) (rnd.getMostSignificantBits() & 0xff); // // rb[8] = (byte) (rnd.getLeastSignificantBits() >>> 56 & 0x0f); // rb[9] = (byte) (rnd.getLeastSignificantBits() >>> 48 & 0xff); // rb[10] = (byte) (rnd.getLeastSignificantBits() >>> 40 & 0xff); // rb[11] = (byte) (rnd.getLeastSignificantBits() >>> 32 & 0xff); // rb[12] = (byte) (rnd.getLeastSignificantBits() >>> 24 & 0xff); // rb[13] = (byte) (rnd.getLeastSignificantBits() >>> 16 & 0xff); // rb[14] = (byte) (rnd.getLeastSignificantBits() >>> 8 & 0xff); // rb[15] = (byte) (rnd.getLeastSignificantBits() & 0xff); // // //BASE = new String(rb); // } private final String parentId; private final QPath path; private final String key; private final ItemType itemType; /** * For CPath will be stored in cache C */ CacheQPath(String parentId, QPath path, ItemType itemType) { this.parentId = parentId; this.path = path; this.itemType = itemType; this.key = key(this.parentId, this.path.getEntries(), this.itemType); } /** * For CPath will be searched in cache C */ CacheQPath(String parentId, QPathEntry name, ItemType itemType) { this.parentId = parentId; this.path = null; this.itemType = itemType; this.key = key(this.parentId, name, this.itemType); } protected String key(final String parentId, final QPathEntry[] pathEntries, ItemType itemType) { return key(parentId, pathEntries[pathEntries.length - 1], itemType); } protected String key(final String parentId, final QPathEntry name, ItemType itemType) { StringBuilder sk = new StringBuilder(); // sk.append(BASE); for strong hash code, skip it when equals uses String.equals sk.append(parentId != null ? parentId : Constants.ROOT_PARENT_UUID); sk.append(name.getAsString(true)); sk.append(itemType.toString()); return sk.toString(); } @Override public boolean equals(Object obj) { if (key.hashCode() == obj.hashCode() && obj instanceof CacheQPath) return key.equals(((CacheQPath)obj).key); return false; } @Override public int hashCode() { return key.hashCode(); } @Override public String toString() { final StringBuilder s = new StringBuilder(); s.append((this.parentId != null ? this.parentId : Constants.ROOT_PARENT_UUID)); s.append((path != null ? path.getEntries()[path.getEntries().length - 1] : "null")); s.append(", "); s.append(key); return s.toString(); } QPath getQPath() { return path; } @Override boolean isDescendantOf(QPath path) { return this.path.isDescendantOf(path); } }