package org.zstack.test;
import org.zstack.core.Platform;
import org.zstack.core.componentloader.ComponentLoader;
import org.zstack.header.exception.CloudRuntimeException;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import static org.zstack.utils.StringDSL.ln;
public class BeanConstructor {
private List<String> xmls = new ArrayList<String>();
private List<String> excludedXmls = new ArrayList<String>();
private static final String SPRING_XML_NAME = "spring-config-for-unit-test-from-BeanConstructor.xml";
protected ComponentLoader loader;
protected String springConfigPath;
private boolean loadAll = false;
private String coreBeans = ln(
"<import resource=\"springConfigXml/ThreadFacade.xml\" />",
"<import resource=\"springConfigXml/CloudBus.xml\" />",
"<import resource=\"springConfigXml/validation.xml\" />",
"<import resource=\"springConfigXml/InventoryFacade.xml\" />",
"<import resource=\"springConfigXml/DatabaseFacade.xml\" />",
"<import resource=\"springConfigXml/JobQueueFacade.xml\" />",
"<import resource=\"springConfigXml/GlobalConfigFacade.xml\" />",
"<import resource=\"springConfigXml/ProgressBar.xml\" />",
"<import resource=\"springConfigXml/RESTFacade.xml\" />",
"<import resource=\"springConfigXml/QueryFacade.xml\" />",
"<import resource=\"springConfigXml/ansibleFacade.xml\" />",
"<import resource=\"springConfigXml/CascadeFacade.xml\" />",
"<import resource=\"springConfigXml/tag.xml\" />",
"<import resource=\"springConfigXml/Aspect.xml\" />",
"<import resource=\"springConfigXml/keyValueFacade.xml\" />",
"<import resource=\"springConfigXml/jmx.xml\" />",
"<import resource=\"springConfigXml/Error.xml\" />",
"<import resource=\"springConfigXml/gc.xml\" />",
"<import resource=\"springConfigXml/debug.xml\" />",
"<import resource=\"springConfigXml/SchedulerFacade.xml\" />",
"<import resource=\"springConfigXml/jsonlabel.xml\" />",
"<import resource=\"springConfigXml/encrypt.xml\" />",
"<import resource=\"springConfigXml/rest.xml\" />"
).toString();
public BeanConstructor() {
}
public BeanConstructor addXml(String xmlName) {
if (this.getClass().getClassLoader().getResource(String.format("springConfigXml/%s", xmlName)) == null) {
throw new IllegalArgumentException(String.format("Cannot find %s in test/src/test/resources/springConfigXml/", xmlName));
}
xmls.add(xmlName);
return this;
}
public BeanConstructor excludeXml(String name) {
excludedXmls.add(name);
return this;
}
public BeanConstructor addAllConfigInZstackXml() {
loadAll = true;
return this;
}
protected void generateSpringConfig() {
try {
URL templatePath = this.getClass().getClassLoader().getResource("zstack-template.xml");
File template = new File(templatePath.getPath());
BufferedReader input = new BufferedReader(new FileReader(template));
List<String> contents = new ArrayList<String>();
String line = null;
while ((line = input.readLine()) != null) {
contents.add(line);
}
String configPath = "target/test-classes/" + SPRING_XML_NAME;
int insertPos = contents.size() - 1;
if (loadAll) {
String r = String.format("\t<import resource=\"zstack.xml\" />");
contents.add(insertPos, r);
} else {
for (String bean : coreBeans.split("\\n")) {
contents.add(insertPos, bean);
}
}
for (String c : xmls) {
String r = String.format("\t<import resource=\"springConfigXml/%s\" />", c);
contents.add(insertPos, r);
}
File tmpSpringConfig = new File(configPath);
FileWriter fw = new FileWriter(tmpSpringConfig.getAbsolutePath());
BufferedWriter bw = new BufferedWriter(fw);
for (String s : contents) {
bw.write(s + "\n");
}
bw.close();
fw.close();
springConfigPath = configPath;
} catch (Exception e) {
throw new CloudRuntimeException("Unable to create temporary spring xml config", e);
}
}
public ComponentLoader build() {
excludeXmls();
generateSpringConfig();
System.setProperty("spring.xml", SPRING_XML_NAME);
loader = Platform.getComponentLoader();
return loader;
}
private void excludeXmls() {
List<String> tmp = new ArrayList<String>();
for (String xml : xmls) {
if (excludedXmls.contains(xml)) {
continue;
}
tmp.add(xml);
}
xmls = tmp;
}
}