blob: c738e5dbbeeae8c8cd82fda9519f0f70b1a41a77 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.command.info;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.ResourceBundle;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NodeType;
import org.apache.commons.chain.Context;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.command.CommandHelper;
import org.apache.jackrabbit.command.CommandException;
/**
* List nodes. <br>
* The following attributes will be used in order to customize the output:
* <ul>
* <li>pathKey</li>
* <li>uuidKey</li>
* <li>mixinKey</li>
* <li>nodesSizeKey</li>
* <li>propertiesSizeKey</li>
* <li>referencesSizeKey</li>
* <li>versionableKey</li>
* <li>lockableKey</li>
* <li>referenceableKey</li>
* <li>lockedKey</li>
* <li>hasLockKey</li>
* <li>new_Key</li>
* <li>modifiedKey</li>
* </ul>
*/
public abstract class AbstractLsNodes extends AbstractLs {
/** bundle */
private static final ResourceBundle bundle = CommandHelper.getBundle();
/** show path */
private String pathKey = "path";
/** show uuid */
private String uuidKey = "uuid";
/** show mixin */
private String mixinKey = "mixin";
/** show node size */
private String nodesSizeKey = "nodeSize";
/** show properties size */
private String propertiesSizeKey = "propertiesSize";
/** show references size */
private String referencesSizeKey = "referencesSize";
/** show is versionable */
private String versionableKey = "versionable";
/** show is lockable */
private String lockableKey = "lockable";
/** show is referenceable */
private String referenceableKey = "referenceable";
/** show is locked */
private String lockedKey = "locked";
/** show has lock */
private String hasLockKey = "hasLock";
/** show is new */
private String new_Key = "new";
/** show is modified */
private String modifiedKey = "modified";
/** show lock tocken */
private String lockTokenKey = "lockToken";
/** uuid width */
private int uuidWidth = 36;
/** path width */
private int nameWidth = 30;
/** node type width */
private int nodeTypeWidth = 20;
/** node type width */
private int pathWidth = 40;
/** referenceable width */
private int mixinWidth = 30;
/**
* {@inheritDoc}
*/
public final boolean execute(Context ctx) throws Exception {
OptionHolder oh = new OptionHolder(ctx);
// Get children
Iterator iter = getNodes(ctx);
// write header
writeHeader(ctx, oh);
int index = 0;
int maxItems = getMaxItems(ctx);
// Write item
while (iter.hasNext() && index < maxItems) {
Node n = (Node) iter.next();
writeItem(ctx, n, oh);
index++;
}
// Write footer
printFooter(ctx, iter);
return false;
}
/**
* @param ctx
* the <code>Context</code>
* @return the <code>Node<code>s to show
* @throws RepositoryException if the current working <code>Repository</code> throws a <code>RepositoryException</code>
* @throws CommandException
*/
protected abstract Iterator getNodes(Context ctx) throws CommandException,
RepositoryException;
/**
* Write a node to the current output
* @param ctx
* the <code>Context</code>
* @param n
* the <code>Node</code>
* @throws RepositoryException
* @throws CommandException
*/
void writeItem(Context ctx, Node n, OptionHolder oh)
throws RepositoryException, CommandException {
// TODO do something with this long piece of code
Collection widths = new ArrayList();
Collection texts = new ArrayList();
widths.add(new Integer(this.nameWidth));
String name = n.getName();
if (n.getIndex() > 1) {
name += "[" + n.getIndex() + "]";
}
texts.add(name);
widths.add(new Integer(this.nodeTypeWidth));
texts.add(n.getPrimaryNodeType().getName());
// uuid
if (oh.isUuid()) {
widths.add(new Integer(this.uuidWidth));
if (n.isNodeType(JcrConstants.MIX_REFERENCEABLE)) {
texts.add(n.getUUID());
} else {
texts.add("");
}
}
// is new
if (oh.isNew_()) {
widths.add(new Integer(this.longWidth));
texts.add(Boolean.toString(n.isNew()));
}
// is new
if (oh.isModified()) {
widths.add(new Integer(this.longWidth));
texts.add(Boolean.toString(n.isModified()));
}
// mixin
if (oh.isMixin()) {
widths.add(new Integer(this.mixinWidth));
Collection mixins = new ArrayList();
// Assigned mixin types
NodeType[] assigned = n.getMixinNodeTypes();
for (int i = 0; i < assigned.length; i++) {
mixins.add(assigned[i].getName());
}
// Inherited mixin types
NodeType[] nt = n.getPrimaryNodeType().getSupertypes();
for (int i = 0; i < nt.length; i++) {
if (nt[i].isMixin()) {
mixins.add(nt[i].getName());
}
}
texts.add(mixins);
}
// node size
if (oh.isNodesSize()) {
widths.add(new Integer(this.longWidth));
texts.add(Long.toString(n.getNodes().getSize()));
}
// prop size
if (oh.isPropertiesSize()) {
widths.add(new Integer(this.longWidth));
texts.add(Long.toString(n.getProperties().getSize()));
}
// ref size
if (oh.isReferencesSize()) {
widths.add(new Integer(this.longWidth));
texts.add(Long.toString(n.getReferences().getSize()));
}
// is versionable
if (oh.isVersionable()) {
widths.add(new Integer(this.longWidth));
texts.add(Boolean.toString(n
.isNodeType(JcrConstants.MIX_VERSIONABLE)));
}
// is lockable
if (oh.isLockable()) {
widths.add(new Integer(this.longWidth));
texts
.add(Boolean.toString(n.isNodeType(JcrConstants.MIX_LOCKABLE)));
}
// is referenceable
if (oh.isReferenceable()) {
widths.add(new Integer(this.longWidth));
texts.add(Boolean.toString(n
.isNodeType(JcrConstants.MIX_REFERENCEABLE)));
}
// is locked
if (oh.isLocked()) {
widths.add(new Integer(this.longWidth));
texts.add(Boolean.toString(n.isLocked()));
}
// has lock
if (oh.isHasLock()) {
widths.add(new Integer(this.longWidth));
texts.add(Boolean.toString(n.holdsLock()));
}
// path
if (oh.isPath()) {
widths.add(new Integer(this.pathWidth));
texts.add(n.getPath());
}
// lock token
if (oh.isLockToken()) {
widths.add(new Integer(this.nameWidth));
if (n.isLocked()) {
texts.add(n.getLock().getLockToken());
} else {
texts.add("");
}
}
PrintHelper.printRow(ctx, widths, texts);
}
/**
* Prints the header
* @param ctx
* the <code>Context</code>
* @throws CommandException
*/
void writeHeader(Context ctx, OptionHolder oh) throws CommandException {
// TODO do something with this long piece of code
Collection widths = new ArrayList();
Collection texts = new ArrayList();
widths.add(new Integer(this.nameWidth));
texts.add(bundle.getString("word.name"));
widths.add(new Integer(this.nodeTypeWidth));
texts.add(bundle.getString("word.nodetype"));
// uuid
if (oh.isUuid()) {
widths.add(new Integer(this.uuidWidth));
texts.add("uuid");
}
// is new
if (oh.isNew_()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.new"));
}
// is new
if (oh.isModified()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.modified"));
}
// mixin
if (oh.isMixin()) {
widths.add(new Integer(this.mixinWidth));
texts.add("mixin");
}
// node size
if (oh.isNodesSize()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.nodes"));
}
// prop size
if (oh.isPropertiesSize()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.properties"));
}
// ref size
if (oh.isReferencesSize()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.references"));
}
// is versionable
if (oh.isVersionable()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.versionable"));
}
// is lockable
if (oh.isLockable()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.lockable"));
}
// is referenceable
if (oh.isReferenceable()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.referenceable"));
}
// is locked
if (oh.isLocked()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("word.locked"));
}
// has lock
if (oh.isHasLock()) {
widths.add(new Integer(this.longWidth));
texts.add(bundle.getString("phrase.haslock"));
}
// path
if (oh.isPath()) {
widths.add(new Integer(this.pathWidth));
texts.add(bundle.getString("word.path"));
}
if (oh.isLockToken()) {
widths.add(new Integer(this.nameWidth));
texts.add(bundle.getString("word.locktoken"));
}
PrintHelper.printRow(ctx, widths, texts);
PrintHelper.printSeparatorRow(ctx, widths, '-');
}
/**
* option holder
*/
private class OptionHolder {
/** show path */
private boolean path = false;
/** show uuid */
private boolean uuid = false;
/** show mixin */
private boolean mixin = false;
/** show node size */
private boolean nodesSize = false;
/** show properties size */
private boolean propertiesSize = false;
/** show references size */
private boolean referencesSize = false;
/** show is versionable */
private boolean versionable = false;
/** show is lockable */
private boolean lockable = false;
/** show is referenceable */
private boolean referenceable = false;
/** show is locked */
private boolean locked = false;
/** show has lock */
private boolean hasLock = false;
/** show is new */
private boolean new_ = false;
/** show is modified */
private boolean modified = false;
/** lock tokeb */
private boolean lockToken = false;
/** context */
private Context ctx;
/**
* @param key
* the key the flag key
* @return the boolean value for the given key
*/
private boolean getFlag(String key) {
boolean flag = false;
if (ctx.containsKey(key)) {
flag = Boolean.valueOf((String) ctx.get(key)).booleanValue();
}
return flag;
}
/**
* Constructor
* @param ctx
* the <code>Context</code>
*/
public OptionHolder(Context ctx) {
super();
this.ctx = ctx;
path = getFlag(pathKey);
uuid = getFlag(uuidKey);
mixin = getFlag(mixinKey);
nodesSize = getFlag(nodesSizeKey);
propertiesSize = getFlag(propertiesSizeKey);
referencesSize = getFlag(referencesSizeKey);
versionable = getFlag(versionableKey);
lockable = getFlag(lockableKey);
referenceable = getFlag(referenceableKey);
locked = getFlag(lockedKey);
hasLock = getFlag(hasLockKey);
new_ = getFlag(new_Key);
modified = getFlag(modifiedKey);
lockToken = getFlag(lockTokenKey);
}
/**
* @return the has lock
*/
public boolean isHasLock() {
return hasLock;
}
/**
* @return Returns the lockable.
*/
public boolean isLockable() {
return lockable;
}
/**
* @return Returns the locked.
*/
public boolean isLocked() {
return locked;
}
/**
* @return Returns the mixin.
*/
public boolean isMixin() {
return mixin;
}
/**
* @return Returns the modified.
*/
public boolean isModified() {
return modified;
}
/**
* @return Returns the new_.
*/
public boolean isNew_() {
return new_;
}
/**
* @return Returns the nodesSize.
*/
public boolean isNodesSize() {
return nodesSize;
}
/**
* @return Returns the propertiesSize.
*/
public boolean isPropertiesSize() {
return propertiesSize;
}
/**
* @return Returns the referenceable.
*/
public boolean isReferenceable() {
return referenceable;
}
/**
* @return Returns the referencesSize.
*/
public boolean isReferencesSize() {
return referencesSize;
}
/**
* @return Returns the uuid.
*/
public boolean isUuid() {
return uuid;
}
/**
* @return Returns the versionable.
*/
public boolean isVersionable() {
return versionable;
}
/**
* @return Returns the path.
*/
public boolean isPath() {
return path;
}
public boolean isLockToken() {
return lockToken;
}
}
/**
* @return Returns the hasLockKey.
*/
public String getHasLockKey() {
return hasLockKey;
}
/**
* @param hasLockKey
* The hasLockKey to set.
*/
public void setHasLockKey(String hasLockKey) {
this.hasLockKey = hasLockKey;
}
/**
* @return Returns the lockableKey.
*/
public String getLockableKey() {
return lockableKey;
}
/**
* @param lockableKey
* The lockableKey to set.
*/
public void setLockableKey(String lockableKey) {
this.lockableKey = lockableKey;
}
/**
* @return Returns the lockedKey.
*/
public String getLockedKey() {
return lockedKey;
}
/**
* @param lockedKey
* The lockedKey to set.
*/
public void setLockedKey(String lockedKey) {
this.lockedKey = lockedKey;
}
/**
* @return Returns the mixinKey.
*/
public String getMixinKey() {
return mixinKey;
}
/**
* @param mixinKey
* The mixinKey to set.
*/
public void setMixinKey(String mixinKey) {
this.mixinKey = mixinKey;
}
/**
* @return Returns the modifiedKey.
*/
public String getModifiedKey() {
return modifiedKey;
}
/**
* @param modifiedKey
* The modifiedKey to set.
*/
public void setModifiedKey(String modifiedKey) {
this.modifiedKey = modifiedKey;
}
/**
* @return Returns the new_Key.
*/
public String getNew_Key() {
return new_Key;
}
/**
* @param new_Key
* The new_Key to set.
*/
public void setNew_Key(String new_Key) {
this.new_Key = new_Key;
}
/**
* @return Returns the nodesSizeKey.
*/
public String getNodesSizeKey() {
return nodesSizeKey;
}
/**
* @param nodesSizeKey
* The nodesSizeKey to set.
*/
public void setNodesSizeKey(String nodesSizeKey) {
this.nodesSizeKey = nodesSizeKey;
}
/**
* @return Returns the pathKey.
*/
public String getPathKey() {
return pathKey;
}
/**
* @param pathKey
* The pathKey to set.
*/
public void setPathKey(String pathKey) {
this.pathKey = pathKey;
}
/**
* @return Returns the propertiesSizeKey.
*/
public String getPropertiesSizeKey() {
return propertiesSizeKey;
}
/**
* @param propertiesSizeKey
* The propertiesSizeKey to set.
*/
public void setPropertiesSizeKey(String propertiesSizeKey) {
this.propertiesSizeKey = propertiesSizeKey;
}
/**
* @return Returns the referenceableKey.
*/
public String getReferenceableKey() {
return referenceableKey;
}
/**
* @param referenceableKey
* The referenceableKey to set.
*/
public void setReferenceableKey(String referenceableKey) {
this.referenceableKey = referenceableKey;
}
/**
* @return Returns the referencesSizeKey.
*/
public String getReferencesSizeKey() {
return referencesSizeKey;
}
/**
* @param referencesSizeKey
* The referencesSizeKey to set.
*/
public void setReferencesSizeKey(String referencesSizeKey) {
this.referencesSizeKey = referencesSizeKey;
}
/**
* @return Returns the uuidKey.
*/
public String getUuidKey() {
return uuidKey;
}
/**
* @param uuidKey
* The uuidKey to set.
*/
public void setUuidKey(String uuidKey) {
this.uuidKey = uuidKey;
}
/**
* @return Returns the versionableKey.
*/
public String getVersionableKey() {
return versionableKey;
}
/**
* @param versionableKey
* The versionableKey to set.
*/
public void setVersionableKey(String versionableKey) {
this.versionableKey = versionableKey;
}
/**
* @return the lock token key
*/
public String getLockTokenKey() {
return lockTokenKey;
}
/**
* @param lockTokenKey
* the lock token to set
*/
public void setLockTokenKey(String lockTokenKey) {
this.lockTokenKey = lockTokenKey;
}
}