private object[] compile(string obj0)
        {
            if (path == null)
            {
                return(new object[0]);
            }

            var list = new List <object>();
            var tok  = new StringTokenizer(path, ":.");

            while (tok.hasMoreTokens())
            {
                string token = tok.nextToken();
                OpEnum op    = OpEnum.getInstance(token);
                if (op == null)
                {
                    throw new Error("Bad path compiled " + path);
                }

                list.Add(op);

                if (op == OpEnum.RELATION)
                {
                    list.Add(tok.nextToken());
                }
            }
            return(list.ToArray());
        }
        public virtual Item findItem(Item item)
        {
            if (INTERPRET_PATHS)
            {
                return(item.findItem(path));
            }

            if (compiledPath == null)
            {
                compiledPath = compile(path);
            }

            Item pitem = item;

            for (int i = 0; pitem != null && i < compiledPath.Length;)
            {
                OpEnum op = (OpEnum)compiledPath[i++];
                if (op == OpEnum.NEXT)
                {
                    pitem = pitem.getNext();
                }
                else if (op == OpEnum.PREV)
                {
                    pitem = pitem.getPrevious();
                }
                else if (op == OpEnum.NEXT_NEXT)
                {
                    pitem = pitem.getNext();
                    if (pitem != null)
                    {
                        pitem = pitem.getNext();
                    }
                }
                else if (op == OpEnum.PREV_PREV)
                {
                    pitem = pitem.getPrevious();
                    if (pitem != null)
                    {
                        pitem = pitem.getPrevious();
                    }
                }
                else if (op == OpEnum.PARENT)
                {
                    pitem = pitem.getParent();
                }
                else if (op == OpEnum.DAUGHTER)
                {
                    pitem = pitem.getDaughter();
                }
                else if (op == OpEnum.LAST_DAUGHTER)
                {
                    pitem = pitem.getLastDaughter();
                }
                else if (op == OpEnum.RELATION)
                {
                    string relationName = (string)compiledPath[i++];
                    pitem =
                        pitem.getSharedContents()
                        .getItemRelation(relationName);
                }
                else
                {
                    this.LoggerInfo("findItem: bad feature " + op + " in "
                                    + path);
                }
            }
            return(pitem);
        }