package org.jboss.tools.teiid.reddeer;
import static org.hamcrest.core.StringContains.containsString;
import static org.hamcrest.core.Is.is;
import java.io.StringReader;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.jboss.reddeer.swt.impl.styledtext.DefaultStyledText;
import org.jboss.reddeer.swt.impl.tree.DefaultTreeItem;
import org.jboss.tools.teiid.reddeer.connection.ConnectionProfileConstants;
import org.jboss.tools.teiid.reddeer.dialog.GenerateDynamicVdbDialog;
import org.jboss.tools.teiid.reddeer.dialog.GenerateVdbArchiveDialog;
import org.jboss.tools.teiid.reddeer.editor.VdbEditor;
import org.jboss.tools.teiid.reddeer.requirement.TeiidServerRequirement;
import org.jboss.tools.teiid.reddeer.view.ModelExplorer;
import org.jboss.tools.teiid.reddeer.view.ServersViewExt;
import org.jboss.tools.teiid.reddeer.wizard.exports.DDLTeiidExportWizard;
import org.jboss.tools.teiid.reddeer.wizard.imports.DDLTeiidImportWizard;
import org.jboss.tools.teiid.reddeer.wizard.imports.ImportFromFileSystemWizard;
import org.jboss.tools.teiid.reddeer.wizard.newWizard.VdbWizard;
import org.junit.Rule;
import org.junit.rules.ErrorCollector;
import org.xml.sax.InputSource;
public class DdlHelper {
@Rule
private ErrorCollector collector;
public DdlHelper(ErrorCollector collector){
this.collector = collector;
}
public String createDynamicVdb(String sourceProject, String staticVdbName, String dynamicVdbName) {
GenerateDynamicVdbDialog wizard = new ModelExplorer().generateDynamicVDB(sourceProject, staticVdbName);
wizard.setName(dynamicVdbName)
.setFileName(dynamicVdbName)
.setLocation(sourceProject)
.next()
.generate();
String contents = wizard.getContents();
wizard.finish();
return contents;
}
public String exportDDL(String sourceProject, String model, String targetProject) {
new ModelExplorer().selectItem(sourceProject,model + ".xmi");
DDLTeiidExportWizard.openWizard()
.setLocation(sourceProject,model + ".xmi")
.setNameInSource(true)
.setNativeType(true)
.nextPage()
.exportToWorkspace(model, targetProject)
.finish();
new DefaultTreeItem(targetProject,model).doubleClick();
return new DefaultStyledText().getText();
}
public String getXPath(String xml, String path) {
XPath xpath = XPathFactory.newInstance().newXPath();
try {
return xpath.evaluate(path, new InputSource(new StringReader(xml)));
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("error evaluating xpath");
}
return null;
}
public String deploy(String project, String dynamicVDB,TeiidServerRequirement teiidServer) {
ServersViewExt serversView = new ServersViewExt();
if(serversView.isVDBDeployed(teiidServer.getName(), ServersViewExt.ServerType.DV6, dynamicVDB)){
serversView.undeployVdb(teiidServer.getName(), dynamicVDB);
}
new ModelExplorer().deployVdb(project, dynamicVDB);
serversView.refreshServer(teiidServer.getName());
return serversView.getVdbStatus(teiidServer.getName(), dynamicVDB);
}
public void checkXpathPermission(String xml, String role, String resource, String permission, String expected) {
try {
String path = String.format("/vdb/data-role[@name='%s']/permission[resource-name='%s']/%s", role, resource,
permission);
String perm = getXPath(xml, path);
collector.checkThat("wrong value for " + path, perm, is(expected));
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void importDdlFromSource(String projectName, String sourceModelName, String workProjectName){
DDLTeiidImportWizard.openWizard()
.setPath("resources/projects/DDLtests/"+projectName+"/"+ sourceModelName +".ddl")
.setFolder(workProjectName)
.setName(sourceModelName)
.setModelType(DDLTeiidImportWizard.Source_Type)
.nextPage()
.finish();
}
public void importDdlFromView(String projectName, String viewModelName, String workProjectName){
DDLTeiidImportWizard.openWizard()
.setPath("resources/projects/DDLtests/"+projectName+"/"+ viewModelName +".ddl")
.setFolder(workProjectName)
.setName(viewModelName)
.setModelType(DDLTeiidImportWizard.View_Type)
.generateValidDefaultSQL(true)
.nextPage()
.finish();
}
public void importVdb(String projectName, String originalDynamicVDB, String workProjectName){
ImportFromFileSystemWizard.openWizard()
.setPath("resources/projects/DDLtests/"+projectName)
.setFolder(workProjectName)
.selectFile(originalDynamicVDB)
.setCreteTopLevelFolder(false)
.finish();
GenerateVdbArchiveDialog wizard = new ModelExplorer().generateVdbArchive(workProjectName, originalDynamicVDB);
wizard.next()
.generate()
.finish();
}
public void checkDeploy(String sourceModelName, String viewModelName, String workProjectName, String vdbName,TeiidServerRequirement teiidServer){
/*all models must be opened before synchronize VDB*/
if(viewModelName != null){
new ModelExplorer().openModelEditor(workProjectName,viewModelName+".xmi");
}
if(sourceModelName != null){
new ModelExplorer().openModelEditor(workProjectName,sourceModelName+".xmi");
new ModelExplorer().changeConnectionProfile(ConnectionProfileConstants.SQL_SERVER_2008_PARTS_SUPPLIER, workProjectName, sourceModelName);
}
new ModelExplorer().openModelEditor(workProjectName,vdbName+".vdb");
VdbEditor staticVdb = VdbEditor.getInstance(vdbName);
staticVdb.synchronizeAll();
staticVdb.saveAndClose();
/*test deploy generated VDB from dynamic VDB*/
String status = deploy(workProjectName, vdbName, teiidServer);
collector.checkThat("vdb is not active", status, containsString("ACTIVE"));
}
public void createStaticVdb(String vdbName, String projectName, String modelName){
VdbWizard.openVdbWizard()
.setName(vdbName)
.setLocation(projectName)
.addModel(projectName, modelName)
.finish();
}
}