/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.hibernate.console.node;
import java.util.Collection;
import java.util.Iterator;
import javax.swing.tree.TreeNode;
import org.eclipse.osgi.util.NLS;
import org.hibernate.console.ConsoleMessages;
import org.jboss.tools.hibernate.runtime.spi.HibernateException;
import org.jboss.tools.hibernate.runtime.spi.IClassMetadata;
import org.jboss.tools.hibernate.runtime.spi.ICollectionMetadata;
import org.jboss.tools.hibernate.runtime.spi.IType;
/**
* @author MAX
*
*/
class PersistentCollectionNode extends BaseNode implements TypedNode{
BaseNode virtualNode;
IType type;
IType elementType;
private boolean objectGraph;
private Object baseObject;
private Object collectionObject;
boolean childrenCreated = false;
private IClassMetadata md;
public PersistentCollectionNode(NodeFactory factory, BaseNode parent, String name, IType type, IClassMetadata md, ICollectionMetadata metadata, Object baseObject, boolean objectGraph) {
super(factory, parent);
this.md = md;
this.type = type;
this.name = name;
this.baseObject = baseObject;
this.objectGraph = objectGraph;
iconName = factory.getIconNameForType(type);
this.elementType = metadata.getElementType();
if(objectGraph) {
//
} else {
virtualNode = factory.createNode(null, elementType.getReturnedClass() );
}
}
Object initCollectionObject() {
if(collectionObject!=null) return collectionObject;
try {
collectionObject = md.getPropertyValue(baseObject, name);
} catch (HibernateException e) {
IllegalArgumentException iae = new IllegalArgumentException(ConsoleMessages.PersistentCollectionNode_could_not_access_property_value);
iae.initCause(e);
throw iae;
}
return collectionObject;
}
public String getHQL() {
return ""; //$NON-NLS-1$
}
@Override
public String getCriteria() {
final String criteria = ".createCriteria({0})"; //$NON-NLS-1$
final String alias = "\n.createCriteria(\"{0}\", \"{1}\")"; //$NON-NLS-1$
final String sess = "session"; //$NON-NLS-1$
String enName = "";//$NON-NLS-1$
String propCriteria = "";//$NON-NLS-1$
if (getName() != null){
if (getParent() instanceof BaseNode) {
BaseNode baseNodeParent = (BaseNode)getParent();
if (baseNodeParent instanceof TypedNode) {
TypedNode typedNodeParent = (TypedNode)baseNodeParent;
enName = typedNodeParent.getType().getName();
} else {
enName = baseNodeParent.getName();
}
enName = enName.substring(enName.lastIndexOf('.') + 1);
propCriteria = NLS.bind(alias, getName(), getName().charAt(0));
}
}
if ("".equals(enName)) { //$NON-NLS-1$
return ""; //$NON-NLS-1$
}
String enCriteria = NLS.bind(criteria, enName + ".class"); //$NON-NLS-1$
return sess + enCriteria + propCriteria;
}
public TreeNode getChildAt(int childIndex) {
checkChildren();
if(objectGraph) {
return super.getChildAt(childIndex);
} else {
return virtualNode.getChildAt(childIndex);
}
}
public int getChildCount() {
checkChildren();
if(objectGraph) {
return super.getChildCount();
} else {
return virtualNode.getChildCount();
}
}
public int getIndex(TreeNode node) {
checkChildren();
if(objectGraph) {
return super.getIndex(node);
} else {
return virtualNode.getIndex(node);
}
}
public boolean isLeaf() {
checkChildren();
if(objectGraph) {
return super.isLeaf();
} else {
return virtualNode.isLeaf();
}
}
protected void checkChildren() {
if(!childrenCreated && objectGraph) {
initCollectionObject();
int idx = 0;
if(!type.isArrayType() ) {
Iterator<?> i = ( (Collection<?>)collectionObject).iterator();
while (i.hasNext() ) {
Object element = i.next();
children.add(createNode(idx++,element, elementType) );
}
} else {
Object[] os = (Object[]) collectionObject;
for (int i = 0; i < os.length; i++) {
Object element = os[i];
children.add(createNode(idx++, element, elementType) );
}
}
childrenCreated = true;
}
}
private BaseNode createNode(int idx, Object element, IType type) { // TODO: use a common way to create these darn nodes!
return new ClassNode(factory, this,type.getReturnedClass().getName(), factory.getMetaData(type.getReturnedClass() ),element,objectGraph);
}
public String renderLabel(boolean b) {
return getLabel(getName(),b) + " : " + getLabel(type.getReturnedClass().getName(),b) + "<" + getLabel(elementType.getReturnedClass().getName(),b) + ">"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
}
public IType getType() {
return type;
}
}