/* This file is part of the PolePosition database benchmark http://www.polepos.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.zoodb.test.jdo.pole; import java.util.ArrayList; import java.util.Arrays; import java.util.IdentityHashMap; import java.util.List; import org.zoodb.jdo.spi.PersistenceCapableImpl; public class ComplexHolder0 extends PersistenceCapableImpl implements CheckSummable { private int id; private String name; private List<ComplexHolder0> children = new ArrayList<ComplexHolder0>(); private ComplexHolder0[] array; public ComplexHolder0() { } public static ComplexHolder0 generate(int depth, int leafs, boolean disjunctSpecial){ ComplexHolder0 complexHolder = new ComplexHolder0(); complexHolder.name = "root"; int specialValue = disjunctSpecial ? (int) Math.pow(leafs, depth) : 0; createChildren(complexHolder, depth -1, leafs, specialValue); return complexHolder; } private static void createChildren(ComplexHolder0 root, int depth, int numChildren, int specialValue) { if(depth < 1){ return; } int factoryIdx = 0; int holderIdx = 0; List<ComplexHolder0> parentLevel = Arrays.asList(root); for (int i = 0; i < depth; i++) { @SuppressWarnings("unchecked") Closure4<ComplexHolder0> curFactory = FACTORIES[factoryIdx]; List<ComplexHolder0> childLevel = new ArrayList<ComplexHolder0>(); for (ComplexHolder0 curParent : parentLevel) { for (int childIdx = 0; childIdx < numChildren; childIdx++) { ComplexHolder0 curChild = curFactory.run(); curChild.name = String.valueOf(holderIdx); curChild.array = createArray(holderIdx); curChild.setSpecial(holderIdx + specialValue); curParent.addChild(curChild); childLevel.add(curChild); holderIdx++; } } parentLevel = childLevel; factoryIdx++; if(factoryIdx == FACTORIES.length) { factoryIdx = 0; } } } private static ComplexHolder0[] createArray(int holderIdx) { ComplexHolder0[] holders = new ComplexHolder0[] { new ComplexHolder0(), new ComplexHolder1(), new ComplexHolder2(), new ComplexHolder3(), new ComplexHolder4(), }; for (int i = 0; i < holders.length; i++) { holders[i].name = "a" + holderIdx + "_" + i; } return holders; } public void addChild(ComplexHolder0 child) { zooActivateRead(); children.add(child); } @SuppressWarnings("rawtypes") public static final Closure4[] FACTORIES = { new Closure4<ComplexHolder0>(){ @Override public ComplexHolder0 run() { return new ComplexHolder0(); } }, new Closure4<ComplexHolder0>(){ @Override public ComplexHolder0 run() { return new ComplexHolder1(); } }, new Closure4<ComplexHolder0>(){ @Override public ComplexHolder0 run() { return new ComplexHolder2(); } }, new Closure4<ComplexHolder0>(){ @Override public ComplexHolder0 run() { return new ComplexHolder3(); } }, new Closure4<ComplexHolder0>(){ @Override public ComplexHolder0 run() { return new ComplexHolder4(); } } }; @Override public long checkSum() { zooActivateRead(); class CheckSumVisitor implements Visitor<ComplexHolder0> { long checkSum; @Override public void visit(ComplexHolder0 holder) { checkSum += Math.abs(holder.ownCheckSum()); } } CheckSumVisitor visitor = new CheckSumVisitor(); traverse(visitor, new NullVisitor<ComplexHolder0>()); return visitor.checkSum; } public void traverse(Visitor<ComplexHolder0> preVisitor, Visitor<ComplexHolder0> postVisitor) { internalTraverse(new IdentityHashMap<ComplexHolder0, ComplexHolder0>(), preVisitor, postVisitor); } private void internalTraverse(IdentityHashMap<ComplexHolder0, ComplexHolder0> visited, Visitor<ComplexHolder0> preVisitor, Visitor<ComplexHolder0> postVisitor) { if(visited.containsKey(this)) { return; } visited.put(this, this); preVisitor.visit(this); for (ComplexHolder0 child : getChildren()) { child.internalTraverse(visited, preVisitor, postVisitor); } if(getArray() != null) { for (ComplexHolder0 child : getArray()) { child.internalTraverse(visited, preVisitor, postVisitor); } } postVisitor.visit(this); } public long ownCheckSum() { return getName().hashCode(); } protected void setSpecial(int value) { } public String getName() { zooActivateRead(); return name; } public void setName(String name) { zooActivateWrite(); this.name = name; } public List<ComplexHolder0> getChildren() { zooActivateRead(); return children; } public void setChildren(List<ComplexHolder0> children) { zooActivateWrite(); this.children = children; } public ComplexHolder0[] getArray() { zooActivateRead(); return array; } public void setArray(ComplexHolder0[] array) { zooActivateWrite(); this.array = array; } void setId(int id) { zooActivateWrite(); this.id = id; } }