/*
* Demoiselle Framework
* Copyright (C) 2013 SERPRO
* ----------------------------------------------------------------------------
* This file is part of Demoiselle Framework.
*
* Demoiselle Framework is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License version 3
* as published by the Free Software Foundation.
*
* 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 Lesser General Public License version 3
* along with this program; if not, see <http://www.gnu.org/licenses/>
* or write to the Free Software Foundation, Inc., 51 Franklin Street,
* Fifth Floor, Boston, MA 02110-1301, USA.
* ----------------------------------------------------------------------------
* Este arquivo é parte do Framework Demoiselle.
*
* O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
* modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
* do Software Livre (FSF).
*
* Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
* GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
* APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
* para maiores detalhes.
*
* Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
* "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
* ou escreva para a Fundação do Software Livre (FSF) Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
*/
package br.gov.frameworkdemoiselle.behave.integration.alm.objects.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import br.gov.frameworkdemoiselle.behave.config.BehaveConfig;
import br.gov.frameworkdemoiselle.behave.internal.integration.ScenarioState;
import com.ibm.rqm.xml.bind.Details;
import com.ibm.rqm.xml.bind.Executionresult;
import com.ibm.rqm.xml.bind.Executionworkitem;
import com.ibm.rqm.xml.bind.Richtext;
import com.ibm.rqm.xml.bind.State;
import com.ibm.rqm.xml.bind.Testcase;
import com.ibm.rqm.xml.bind.Testplan;
public class GenerateXMLString {
// private static Logger log = Logger.getLogger(GenerateXMLString.class);
public static String getTestplanString(String urlServer, String projectAreaAlias, String encoding, String testCaseId, Testplan currentPlan) throws JAXBException {
// Adiciona o novo test case se não existir
boolean exists = false;
String newTestCaseId = urlServer + "resources/" + projectAreaAlias + "/testcase/" + testCaseId;
if (currentPlan.getTestcase() != null) {
for (com.ibm.rqm.xml.bind.Testplan.Testcase link : currentPlan.getTestcase()) {
if (link.getHref().equals(newTestCaseId)) {
exists = true;
break;
}
}
}
if (!exists) {
com.ibm.rqm.xml.bind.Testplan.Testcase testcase = new com.ibm.rqm.xml.bind.Testplan.Testcase();
testcase.setHref(newTestCaseId);
currentPlan.getTestcase().add(testcase);
}
JAXBContext jaxb = JAXBContext.newInstance(Testplan.class);
Marshaller marshaller = jaxb.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter testPlanString = new StringWriter();
marshaller.marshal(currentPlan, testPlanString);
return testPlanString.toString();
}
public static String getTestcaseString(String urlServer, String projectAreaAlias, String encoding, String name, String steps, Testcase currentTestCase) throws JAXBException {
Richtext textDesgin = new Richtext();
textDesgin.getContent().add(escapeHTMLForAlm(steps));
currentTestCase.setTitle(name);
currentTestCase.setSuspect(false);
currentTestCase.setWeight(100);
currentTestCase.setComIbmRqmPlanningEditorSectionTestCaseDesign(textDesgin);
// Valor da Categoria
String categoryTipoExecucao = BehaveConfig.getIntegration_CategoryTipoExecucao();
// Verifica se no caso de teste vindo da ALM existe a categoria
// "Tipo de Execução", se não existe cria.
boolean objExists = false;
for (Testcase.Category c : currentTestCase.getCategory()) {
if (c.getTerm().toLowerCase().trim().equals("tipo de execução")) {
objExists = true;
// Altera para "Automática"
c.setValue(categoryTipoExecucao);
break;
}
}
if (!objExists) {
Testcase.Category newC = new Testcase.Category();
newC.setTerm("Tipo de Execução");
newC.setValue(categoryTipoExecucao);
currentTestCase.getCategory().add(newC);
}
JAXBContext jaxb = JAXBContext.newInstance(Testcase.class);
Marshaller marshaller = jaxb.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter testCaseString = new StringWriter();
marshaller.marshal(currentTestCase, testCaseString);
return testCaseString.toString();
}
public static Testcase getTestcaseObject(HttpResponse response) throws IOException, JAXBException {
Testcase testcase = null;
StringBuffer xmlString = new StringBuffer();
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
String line = "";
while ((line = reader.readLine()) != null) {
xmlString.append(line);
}
} finally {
instream.close();
}
}
if (!xmlString.equals("")) {
JAXBContext jaxbContext = JAXBContext.newInstance(Testcase.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(xmlString.toString());
testcase = (Testcase) unmarshaller.unmarshal(reader);
}
return testcase;
}
public static String getExecutionworkitemString(String urlServer, String projectAreaAlias, String encoding, String testCaseId, String testPlanId) throws JAXBException {
// Workitem
com.ibm.rqm.xml.bind.Executionworkitem.Testcase workTest = new com.ibm.rqm.xml.bind.Executionworkitem.Testcase();
workTest.setHref(urlServer + "resources/" + projectAreaAlias + "/testcase/" + testCaseId);
// Testplan
com.ibm.rqm.xml.bind.Executionworkitem.Testplan testPlan = new com.ibm.rqm.xml.bind.Executionworkitem.Testplan();
testPlan.setHref(urlServer + "resources/" + projectAreaAlias + "/testplan/urn:com.ibm.rqm:testplan:" + testPlanId);
// Criação do Execution Work Item
Executionworkitem work = new Executionworkitem();
work.setFrequency("Once");
work.setRegression(false);
work.setTitle("Registro de Execução Automatizado - Plano de Teste " + testPlanId);
work.setWeight(100);
work.setTestcase(workTest);
work.setTestplan(testPlan);
JAXBContext jaxb = JAXBContext.newInstance(Executionworkitem.class);
Marshaller marshaller = jaxb.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter resourceString = new StringWriter();
marshaller.marshal(work, resourceString);
return resourceString.toString();
}
public static String getExecutionresultString(String urlServer, String projectAreaAlias, String encoding, String executionWorkItemUrl, ScenarioState stateOf, Date _startDate, Date _endDate, String details) throws JAXBException, DatatypeConfigurationException {
Date startDate = (Date) _startDate.clone();
Date endDate = (Date) _endDate.clone();
com.ibm.rqm.xml.bind.Executionresult.Executionworkitem workTest = new com.ibm.rqm.xml.bind.Executionresult.Executionworkitem();
workTest.setHref(executionWorkItemUrl);
State state = new State();
Executionresult result = new Executionresult();
if (stateOf.equals(ScenarioState.FAILED)) {
state.setContent("com.ibm.rqm.execution.common.state.failed");
} else {
if (stateOf.equals(ScenarioState.PENDING)) {
state.setContent("com.ibm.rqm.execution.common.state.blocked");
} else {
state.setContent("com.ibm.rqm.execution.common.state.passed");
}
}
result.setState(state);
result.setExecutionworkitem(workTest);
// Datas de início e fim do teste
GregorianCalendar c = new GregorianCalendar();
c.setTime(startDate);
XMLGregorianCalendar startDateXml = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
result.setStarttime(startDateXml);
c.setTime(endDate);
XMLGregorianCalendar endDateXml = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
result.setEndtime(endDateXml);
// Details
Details d = new Details();
d.getContent().add(details);
result.setDetails(d);
JAXBContext jaxb = JAXBContext.newInstance(Executionresult.class);
Marshaller marshaller = jaxb.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter resourceString = new StringWriter();
marshaller.marshal(result, resourceString);
return resourceString.toString();
}
public static Testplan getTestPlanObject(HttpResponse response) throws IOException, JAXBException {
Testplan plan = null;
StringBuffer xmlString = new StringBuffer();
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
String line = "";
while ((line = reader.readLine()) != null) {
xmlString.append(line);
}
} finally {
instream.close();
}
}
if (!xmlString.equals("")) {
JAXBContext jaxbContext = JAXBContext.newInstance(Testplan.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(xmlString.toString());
plan = (Testplan) unmarshaller.unmarshal(reader);
}
return plan;
}
/**
* Trata todas as tags para serem enviadas para a ALM, exceto a quebra de
* linha <br/>
*
* @param s
* string a ser tratada
* @return string tatada
*/
public static String escapeHTMLForAlm(String s) {
// Substitui as quebras de linha para não serem tratadas
s = s.replace("<br/>", "\n");
StringBuilder out = new StringBuilder(Math.max(16, s.length()));
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c > 127 || c == '"' || c == '<' || c == '>' || c == '&') {
out.append("");
out.append((int) c);
out.append(';');
} else {
out.append(c);
}
}
// Volta as quebras de linha
String stringRet = out.toString().replace("\n", "<br/>");
return stringRet;
}
}