001 /* 002 * Copyright (C) 2010 eXo Platform SAS. 003 * 004 * This is free software; you can redistribute it and/or modify it 005 * under the terms of the GNU Lesser General Public License as 006 * published by the Free Software Foundation; either version 2.1 of 007 * the License, or (at your option) any later version. 008 * 009 * This software is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * You should have received a copy of the GNU Lesser General Public 015 * License along with this software; if not, write to the Free 016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 018 */ 019 020 package org.crsh.jcr.command; 021 022 import org.crsh.cmdline.IntrospectionException; 023 import org.crsh.cmdline.ParameterDescriptor; 024 import org.crsh.cmdline.completers.AbstractPathCompleter; 025 import org.crsh.cmdline.spi.Completer; 026 import org.crsh.cmdline.spi.ValueCompletion; 027 import org.crsh.command.CRaSHCommand; 028 029 import javax.jcr.Node; 030 import javax.jcr.NodeIterator; 031 import javax.jcr.PathNotFoundException; 032 import javax.jcr.Session; 033 import java.util.ArrayList; 034 import java.util.Collection; 035 import java.util.List; 036 037 /** 038 * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> 039 * @version $Revision$ 040 */ 041 public abstract class JCRCommand extends CRaSHCommand implements Completer { 042 043 protected JCRCommand() throws IntrospectionException { 044 } 045 046 public ValueCompletion complete(ParameterDescriptor<?> parameter, String prefix) throws Exception { 047 if (parameter.getJavaValueType() == Path.class) { 048 049 final Path path = (Path)getProperty("currentPath"); 050 final Session session = (Session)getProperty("session"); 051 052 // 053 if (session != null) { 054 055 AbstractPathCompleter<Node> pc = new AbstractPathCompleter<Node>() { 056 @Override 057 protected String getCurrentPath() throws Exception { 058 return path != null ? path.getString() : "/"; 059 } 060 061 @Override 062 protected Node getPath(String path) throws Exception { 063 try { 064 return (Node)session.getItem(path); 065 } 066 catch (PathNotFoundException e) { 067 return null; 068 } 069 } 070 071 @Override 072 protected boolean exists(Node path) throws Exception { 073 return path != null; 074 } 075 076 @Override 077 protected boolean isDirectory(Node path) throws Exception { 078 return true; 079 } 080 081 @Override 082 protected boolean isFile(Node path) throws Exception { 083 return false; 084 } 085 086 @Override 087 protected Collection<Node> getChilren(Node path) throws Exception { 088 List<Node> children = new ArrayList<Node>(); 089 for (NodeIterator i = path.getNodes();i.hasNext();) { 090 Node child = i.nextNode(); 091 children.add(child); 092 } 093 return children; 094 } 095 096 @Override 097 protected String getName(Node path) throws Exception { 098 return path.getName(); 099 } 100 }; 101 102 // 103 return pc.complete(parameter, prefix); 104 } 105 } 106 107 // 108 return ValueCompletion.create(); 109 } 110 }