package com.ikokoon.serenity.persistence; import java.util.List; import org.apache.log4j.Logger; import com.ikokoon.serenity.Collector; import com.ikokoon.serenity.model.Afferent; import com.ikokoon.serenity.model.Class; import com.ikokoon.serenity.model.Composite; import com.ikokoon.serenity.model.Efferent; import com.ikokoon.serenity.model.Line; import com.ikokoon.serenity.model.Method; import com.ikokoon.serenity.model.Package; import com.ikokoon.serenity.model.Project; import com.ikokoon.serenity.model.Snapshot; import com.ikokoon.toolkit.LoggingConfigurator; import com.ikokoon.toolkit.Toolkit; /** * Just some useful methods to dump the database and clean it. * * @author Michael Couck * @since 09.12.09 * @version 01.00 */ public class DataBaseToolkit { static { LoggingConfigurator.configure(); } private static Logger logger = Logger.getLogger(DataBaseToolkit.class); /** * Clears the data in the database. * * @param dataBase * the database to truncate */ @SuppressWarnings("unchecked") public static synchronized void clear(IDataBase dataBase) { Project<?, ?> project = (Project<?, ?>) dataBase.find(Project.class, Toolkit.hash(Project.class.getName())); if (project != null) { dataBase.remove(Project.class, project.getId()); } List<Package> packages = dataBase.find(Package.class); for (Composite<?, ?> composite : packages) { dataBase.remove(composite.getClass(), composite.getId()); } List<Class> classes = dataBase.find(Class.class); for (Composite composite : classes) { dataBase.remove(composite.getClass(), composite.getId()); } List<Method> methods = dataBase.find(Method.class); for (Composite composite : methods) { dataBase.remove(composite.getClass(), composite.getId()); } List<Line> lines = dataBase.find(Line.class); for (Composite composite : lines) { dataBase.remove(composite.getClass(), composite.getId()); } List<Snapshot> snapshots = dataBase.find(Snapshot.class); for (Snapshot snapshot : snapshots) { dataBase.remove(Snapshot.class, snapshot.getId()); } } @SuppressWarnings("unchecked") public static synchronized void copyDataBase(IDataBase sourceDataBase, IDataBase targetDataBase) { Collector.initialize(targetDataBase); List<Package> sourcePackages = sourceDataBase.find(Package.class); for (Package sourcePackage : sourcePackages) { List<Class> sourceClasses = sourcePackage.getChildren(); for (Class sourceClass : sourceClasses) { Collector.collectAccess(sourceClass.getName(), sourceClass.getAccess()); collectEfferentAndAfferent(sourceClass, sourcePackages); List<Class> sourceInnerClasses = sourceClass.getInnerClasses(); for (Class sourceInnerClass : sourceInnerClasses) { Collector.collectInnerClass(sourceInnerClass.getName(), sourceClass.getName()); Method sourceOuterMethod = sourceClass.getOuterMethod(); if (sourceOuterMethod != null) { Collector.collectOuterClass(sourceInnerClass.getName(), sourceClass.getName(), sourceOuterMethod.getName(), sourceOuterMethod .getDescription()); } } // Collector.collectSource(sourceClass.getName(), "source"); List<Method> sourceMethods = sourceClass.getChildren(); for (Method sourceMethod : sourceMethods) { Collector.collectComplexity(sourceClass.getName(), sourceMethod.getName(), sourceMethod.getDescription(), sourceMethod .getComplexity()); Collector.collectAccess(sourceClass.getName(), sourceMethod.getName(), sourceMethod.getDescription(), sourceMethod.getAccess()); List<Line> sourceLines = sourceMethod.getChildren(); for (Line sourceLine : sourceLines) { Collector.collectLine(sourceClass.getName(), sourceMethod.getName(), sourceMethod.getDescription(), Integer .valueOf((int) sourceLine.getNumber())); for (int i = 0; i < sourceLine.getCounter(); i++) { Collector.collectCoverage(sourceClass.getName(), sourceMethod.getName(), sourceMethod.getDescription(), (int) sourceLine .getNumber()); } } } } } } @SuppressWarnings("unchecked") public static synchronized void execute(IDataBase dataBase, Composite composite, Executer executer) { List list = dataBase.find(composite.getClass()); for (Object object : list) { executer.execute(object); } } public interface Executer { public void execute(Object object); } @SuppressWarnings("unchecked") private static synchronized void collectEfferentAndAfferent(Class klass, List<Package> packages) { List<Efferent> efferents = klass.getEfferent(); for (Efferent efferent : efferents) { String efferentPackage = Toolkit.replaceAll(efferent.getName(), "<e:", ""); efferentPackage = Toolkit.replaceAll(efferent.getName(), ">", ""); for (Package pakkage : packages) { List<Class> children = pakkage.getChildren(); for (Class child : children) { List<Afferent> afferents = child.getAfferent(); for (Afferent afferent : afferents) { String afferentPackage = Toolkit.replaceAll(afferent.getName(), "<a:", ""); afferentPackage = Toolkit.replaceAll(afferent.getName(), ">", ""); if (efferentPackage.equals(afferentPackage)) { Collector.collectEfferentAndAfferent(klass.getName(), child.getName()); } } } } } } /** * Dumps the database to the output stream. * * @param dataBase * the database to dump * @param criteria * the criteria to match if the data for the composite must be written to the output */ @SuppressWarnings("unchecked") public static synchronized void dump(IDataBase dataBase, ICriteria criteria, String message) { if (message != null) { logger.warn(message); } try { Object object = dataBase.find(Project.class, Toolkit.hash(Project.class.getName())); logger.info(object); Project<?, ?> project = (Project<?, ?>) dataBase.find(Project.class, Toolkit.hash(Project.class.getName())); if (project != null) { logger.warn("Project : " + project.getName()); } } catch (Exception e) { logger.error("Exception dumping the data for the project object.", e); } try { List<Package> packages = dataBase.find(Package.class); for (Package<?, ?> pakkage : packages) { log(criteria, pakkage, 1, pakkage.getId() + " : " + pakkage.getName() + ", coverage : " + pakkage.getCoverage() + ", complexity : " + pakkage.getComplexity() + ", stability : " + pakkage.getStability()); for (Class<?, ?> klass : ((List<Class<?, ?>>) pakkage.getChildren())) { log(criteria, klass, 2, " : id : " + klass.getId() + " : name : " + klass.getName() + " : coverage : " + klass.getCoverage() + ", complexity : " + klass.getComplexity() + ", outer class : " + klass.getOuterClass() + ", outer method : " + klass.getOuterMethod() + ", lines : " + klass.getChildren().size() + ", inner classes : " + klass.getInnerClasses()); List<Efferent> efferents = klass.getEfferent(); List<Afferent> afferents = klass.getAfferent(); for (Efferent efferent : efferents) { log(criteria, efferent, 4, efferent.getName()); } for (Afferent afferent : afferents) { log(criteria, afferent, 4, afferent.getName()); } for (Method<?, ?> method : ((List<Method<?, ?>>) klass.getChildren())) { log(criteria, method, 3, method.getId() + " : name : " + method.getName() + " : description : " + method.getDescription() + " : coverage : " + method.getCoverage() + ", complexity : " + method.getComplexity() + ", start time : " + method.getStartTime() + ", end time : " + method.getEndTime()); for (Line<?, ?> line : ((List<Line<?, ?>>) method.getChildren())) { log(criteria, line, 4, line.getId() + " : number : " + line.getNumber() + ", counter : " + line.getCounter()); } } } } } catch (Exception e) { logger.error("Exception dumping the data for the database.", e); } } private static synchronized void log(ICriteria criteria, Composite<?, ?> composite, int tabs, String data) { if (criteria == null || (criteria != null && criteria.satisfied(composite))) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < tabs; i++) { builder.append(" "); } builder.append(composite.getClass().getSimpleName()); builder.append(" : "); builder.append(data); logger.warn(builder.toString()); } } public interface ICriteria { public boolean satisfied(Composite<?, ?> composite); } public static void main(String[] args) { // D:/Eclipse/workspace/search/modules/Jar/serenity // D:/Eclipse/workspace/Discovery/modules/Jar/serenity IDataBase dataBase = IDataBase.DataBaseManager.getDataBase(DataBaseOdb.class, "D:/Eclipse/workspace/search/modules/Jar/serenity/serenity.odb", null); DataBaseToolkit.dump(dataBase, null, "Database dump : "); dataBase.close(); } }