/* * 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.datamodel; /** * QPathEntry it's a QPath element entry. Extends InternalQName and contains index value. * * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a> * @version $Id: QPathEntry.java 34801 2009-07-31 15:44:50Z dkatayev $ */ public class QPathEntry extends InternalQName implements Comparable<QPathEntry> { /** * QPath index. */ private final int index; private String cachedToString; private String cachedToStringShowIndex; private String id; /** * QPathEntry constructor. * * @param qName * - InternalQName (full qualified name) * @param index * - Item index */ public QPathEntry(InternalQName qName, int index) { this(qName, index, null); } /** * QPathEntry constructor. * * @param qName * - InternalQName (full qualified name) * @param index * - Item index * @param id * - Item id */ public QPathEntry(InternalQName qName, int index, String id) { super(qName.getNamespace(), qName.getName()); this.index = index > 0 ? index : 1; this.id = id; } /** * QPathEntry constructor. * * @param namespace * - namespace URI * @param name * - Item name * @param index * - Item index */ public QPathEntry(String namespace, String name, int index) { this(namespace, name, index, null); } /** * QPathEntry constructor. * * @param namespace * - namespace URI * @param name * - Item name * @param index * - Item index * @param id * - Item id */ public QPathEntry(String namespace, String name, int index, String id) { super(namespace, name); this.index = index > 0 ? index : 1; this.id = id; } /** * Parse QPath entry in form of eXo-JCR names conversion string * <br><code>[name_space]item_name:item_index</code>. * * <br> E.g. <code>[http://www.jcp.org/jcr/nt/1.0]system:1</code>. * * @param qEntry * - String to be parsed * @return InternalQName instance * @throws IllegalNameException * if String contains invalid QName * @throws NumberFormatException * if String contains invalid index */ public static QPathEntry parse(String qEntry) throws IllegalNameException, NumberFormatException { int delimIndex = qEntry.lastIndexOf(QPath.PREFIX_DELIMITER); String qnameString = qEntry.substring(0, delimIndex); String indexString = qEntry.substring(delimIndex + 1); InternalQName qname = InternalQName.parse(qnameString); return new QPathEntry(qname, Integer.valueOf(indexString)); } /** * Return Item id, can be null since it could not be set * * @return the id of the item */ public String getId() { return id; } /** * Return Item path index. * * @return item index */ public int getIndex() { return index; } /** * Tells if the given entry is same. * * @param obj * - another QPathEntry * @return - boolean, true if is same */ public boolean isSame(QPathEntry obj) { if (super.equals(obj)) return index == obj.getIndex(); return false; } /** * {@inheritDoc} */ @Override public String getAsString() { return getAsString(false); } /** * Return entry textual representation. * * @return - if showIndex=false it's a string without index */ public String getAsString(boolean showIndex) { if (showIndex) { if (cachedToStringShowIndex != null) { return cachedToStringShowIndex; } } else { if (cachedToString != null) { return cachedToString; } } // String res; if (showIndex) { res = super.getAsString() + QPath.PREFIX_DELIMITER + getIndex(); } else { res = super.getAsString(); } // if (showIndex) { cachedToStringShowIndex = res; } else { cachedToString = res; } // return res; } /** * {@inheritDoc} */ public int compareTo(QPathEntry compare) { int result = 0; if (this.isSame(compare)) return result; result = namespace.compareTo(compare.namespace); if (result == 0) { result = name.compareTo(compare.name); if (result == 0) result = index - compare.index; } return result; } /** * {@inheritDoc} */ protected String asString() { return getAsString(true); } @Override public boolean equals(Object o) { boolean result = super.equals(o); if (result == true && (o instanceof QPathEntry)) { return result && (getIndex() == ((QPathEntry)o).getIndex()); } else { return result; } } }