/*
* RHQ Management Platform
* Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* 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 version 2 of the License.
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.helpers.perftest.support.config;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.rhq.helpers.perftest.support.jpa.Edge;
import org.rhq.helpers.perftest.support.jpa.Node;
/**
*
* @author Lukas Krejci
*/
@XmlRootElement(name = "graph")
@XmlAccessorType(XmlAccessType.FIELD)
public class ExportConfiguration {
@XmlElement(name = "entity")
private Set<Entity> entity = new HashSet<Entity>();
@XmlAttribute
private String packagePrefix;
@XmlAttribute
private Boolean includeExplicitDependentsImplicitly;
@XmlTransient
private Properties settings;
public Set<Entity> getEntities() {
return entity;
}
public void setEntities(Set<Entity> nodes) {
this.entity = nodes;
}
public Class<?> getClassForEntity(Entity n) {
String className = packagePrefix == null ? n.getName() : packagePrefix + "." + n.getName();
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
//maybe it's an absolute name after all
try {
return Class.forName(n.getName());
} catch (ClassNotFoundException e1) {
//hmm... run out of options
return null;
}
}
}
public Entity getEntity(Class<?> clazz) {
for (Entity e : entity) {
if (getClassForEntity(e).equals(clazz)) {
return e;
}
}
return null;
}
public String getPackagePrefix() {
return packagePrefix;
}
public void setPackagePrefix(String packagePrefix) {
this.packagePrefix = packagePrefix;
}
/**
* @return the includeExplicitDependentsImplicitly
*/
public boolean isIncludeExplicitDependentsImplicitly() {
return includeExplicitDependentsImplicitly == null ? true : includeExplicitDependentsImplicitly;
}
/**
* @param includeExplicitDependentsImplicitly the includeExplicitDependentsImplicitly to set
*/
public void setIncludeExplicitDependentsImplicitly(boolean includeExplicitDependentsImplicitly) {
this.includeExplicitDependentsImplicitly = includeExplicitDependentsImplicitly;
}
/**
* @return the settings
*/
public Properties getSettings() {
return settings;
}
/**
* @param settings the settings to set
*/
public void setSettings(Properties settings) {
this.settings = settings;
}
public static JAXBContext getJAXBContext() throws JAXBException {
return JAXBContext.newInstance(ExportConfiguration.class, Entity.class, Relationship.class);
}
public static ExportConfiguration fromRealDependencyGraph(String packagePrefix,
org.rhq.helpers.perftest.support.jpa.EntityDependencyGraph g) {
ExportConfiguration ret = new ExportConfiguration();
ret.setPackagePrefix(packagePrefix);
Map<Node, Entity> realToSerialized = new HashMap<Node, Entity>();
for (Node node : g.getAllNodes()) {
Entity serialized = fromRealNode(packagePrefix, node);
realToSerialized.put(node, serialized);
ret.getEntities().add(serialized);
}
//now go through the edges.. this has to be done only after we have all the nodes
for (Node node : g.getAllNodes()) {
Set<Relationship> edges = new HashSet<Relationship>();
for (Edge edge : node.getEdges()) {
if (edge.getFrom() == node) {
Relationship r = fromRealEdge(node, edge, realToSerialized);
if (r != null) {
edges.add(r);
}
}
}
Entity serialized = realToSerialized.get(node);
serialized.setRelationships(edges);
}
return ret;
}
private static Entity fromRealNode(String packageNamePrefix, Node node) {
String className = node.getEntity().getName();
if (className.startsWith(packageNamePrefix)) {
className = className.substring(packageNamePrefix.length() + 1);
}
Entity ret = new Entity();
ret.setName(className);
return ret;
}
private static Relationship fromRealEdge(Node currentNode, Edge edge, Map<Node, Entity> realToSerializedNodes) {
Relationship ret = new Relationship();
if (currentNode.equals(edge.getFrom())) {
if (edge.getFromField() != null) {
ret.setField(edge.getFromField().getName());
} else {
return null;
}
} else {
if (edge.getToField() != null) {
ret.setField(edge.getToField().getName());
} else {
return null;
}
}
return ret;
}
public static void main(String[] args) throws Exception {
JAXBContext c = JAXBContext.newInstance(ExportConfiguration.class, Entity.class, Relationship.class);
Marshaller m = c.createMarshaller();
org.rhq.helpers.perftest.support.jpa.EntityDependencyGraph edg = new org.rhq.helpers.perftest.support.jpa.EntityDependencyGraph();
edg.addEntity(Class.forName("org.rhq.core.domain.resource.Resource"));
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));
m.marshal(ExportConfiguration.fromRealDependencyGraph("org.rhq.core.domain", edg), System.out);
}
}