inject into a non-component?
laksu Aug 15, 2007 12:13 PMI have a wrapper class called Node implementing TreeNode from RichFaces. I try to avoid recursively populating the whole tree and so have a mechanism in there to populate each node as they are referred. And in conjunction with the "ajax" property of the tree component, I expect the individual population of the nodes happening in the ajax calls.
The class "Node" basically keeps a Map (required to be a Map by the tree) of my Category objects that are children of the wrapped Category object when populated.
I provide these details because I could not figure out what kind of a component the Node should be.
My proof of concept does not even start by populating the root node. I try to inject the session (I use Hibernate/session instead of JPA/em) but it is injected null or not injected.
So the question is if my "Node" should be a Seam component to have the Hibernate session injected and if so what kind of a scope I should put it in?
Here follows my Node class:
public class Node<E extends Treeable<E>> implements TreeNode {
@In(create=true)
private Session session;
private E value;
Node parent;
public Node(E aValue, Node<E> parent) {
value=aValue;
this.parent=parent;
System.out.println("initing Node with Treeable="+aValue.getName());
}
private Map<Long,Node<E>> dataMap;
public Node(String className) {
List<E> rooties;
System.out.println("Expanding root. session is"+session);
rooties=session.createQuery("from "+className+" where parent"+className+" is null")
.list();
System.out.println("Root has "+rooties.size()+" rooties");
dataMap=new HashMap<Long,Node<E>>();
for(E rootie:rooties){
Node node=new Node(rootie,this);
dataMap.put(rootie.getId(),node);
System.out.println("Rootie :"+rootie.getName()+" was added to roots");
}
System.out.println("initing rooties done");
}
public Map<Long, Node<E>> getDataMap() {
if (dataMap==null){
List<E> children;
System.out.println("Expanding Node:"+value);
String className=value.getClass().getName();
children=session.createQuery("from "+className+" where parent"+className+"= :parent")
.setEntity("parent",value)
.list();
dataMap=new HashMap<Long,Node<E>>();
for(E child:value.getChildren()){
Node node=new Node(child,this);
dataMap.put(child.getId(),node);
}
}
return dataMap;
}
public Object getData() {
return this;
}
public void setData(Object data) {
}
public boolean isLeaf() {
return getDataMap().isEmpty();
}
public Iterator getChildren() {
System.out.println("getChildren is called for:"+toString());
return getDataMap().entrySet().iterator();
}
public TreeNode getChild(Object id) {
return getDataMap().get(id);
}
public void addChild(Object identifier, TreeNode child) {
}
public void removeChild(Object id) {
}
public TreeNode getParent() {
System.out.println("getParent is called for:"+toString());
return parent;
}
public void setParent(TreeNode treeNode) {
System.out.println("setParent is called with:"+treeNode);
}
public String getType(){
return (value==null)?"root":value.getType();
}
public String toString(){
...
}
public String getName(){
return value.getName();
}
public E getValue() {
return value;
}
}