////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2009-2014 Denim Group, Ltd.
//
// The contents of this file are subject to the Mozilla Public License
// Version 2.0 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://www.mozilla.org/MPL/
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is ThreadFix.
//
// The Initial Developer of the Original Code is Denim Group, Ltd.
// Portions created by Denim Group, Ltd. are Copyright (C)
// Denim Group, Ltd. All Rights Reserved.
//
// Contributor(s): Denim Group, Ltd.
//
////////////////////////////////////////////////////////////////////////
package com.denimgroup.threadfix.service;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.denimgroup.threadfix.data.dao.SurveyDao;
import com.denimgroup.threadfix.data.dao.SurveyResultDao;
import com.denimgroup.threadfix.data.entities.Survey;
import com.denimgroup.threadfix.data.entities.SurveyAssertion;
import com.denimgroup.threadfix.data.entities.SurveyLevel;
import com.denimgroup.threadfix.data.entities.SurveyObjective;
import com.denimgroup.threadfix.data.entities.SurveyPractice;
import com.denimgroup.threadfix.data.entities.SurveyQuestion;
import com.denimgroup.threadfix.data.entities.SurveyResult;
import com.denimgroup.threadfix.data.entities.SurveySection;
@Service
@Transactional(readOnly = false) // used to be true
public class SurveyServiceImpl implements SurveyService {
private SurveyDao surveyDao;
private SurveyResultDao surveyResultDao;
@Autowired
public SurveyServiceImpl(SurveyDao surveyDao, SurveyResultDao surveyResultDao) {
this.surveyDao = surveyDao;
this.surveyResultDao = surveyResultDao;
}
@Override
public List<Survey> loadAll() {
return surveyDao.retrieveAll();
}
@Override
public Survey loadSurvey(int id) {
return surveyDao.retrieveById(id);
}
@Override
@Transactional(readOnly = false)
public void storeSurvey(Survey survey) {
surveyDao.saveOrUpdate(survey);
}
@Override
@Transactional(readOnly = false)
public void saveOrUpdateResult(SurveyResult surveyResult) {
Date today = new Date();
surveyResult.setModifiedDate(today);
if (surveyResult.isNew()) {
surveyResult.setCreatedDate(today);
}
surveyResultDao.saveOrUpdate(surveyResult);
}
@Override
public SurveyResult loadSurveyResult(int resultId) {
return surveyResultDao.retrieveById(resultId);
}
@Override
public Survey constructSurvey(InputStream inputStream) throws DocumentException {
Document document = null;
document = new SAXReader().read(inputStream);
Element rootElement = document.getRootElement();
if (!rootElement.getName().equals("survey")) {
throw new DocumentException("The root element of the XML document should be 'survey'.");
}
return constructSurvey(rootElement);
}
private Survey constructSurvey(Element element) {
Survey survey = new Survey();
survey.setName(element.elementText("name"));
for (Object levelElement : element.elements("level")) {
survey.getSurveyLevels().add(constructLevel((Element) levelElement));
}
for (Object sectionElement : element.elements("section")) {
survey.getSurveySections().add(constructSection((Element) sectionElement));
}
// Link Back
for (SurveyLevel l : survey.getSurveyLevels()) {
l.setSurvey(survey);
}
for (SurveySection s : survey.getSurveySections()) {
s.setSurvey(survey);
}
return survey;
}
private SurveyLevel constructLevel(Element levelElement) {
SurveyLevel level = new SurveyLevel();
level.setNumber(Integer.parseInt(levelElement.attributeValue("number")));
level.setDescription(levelElement.getTextTrim());
return level;
}
private SurveySection constructSection(Element sectionElement) {
SurveySection section = new SurveySection();
section.setSectionName(sectionElement.attributeValue("name"));
section.setColor(sectionElement.attributeValue("color"));
section.setLightColor(sectionElement.attributeValue("lightColor"));
for (Object practiceElement : sectionElement.elements("practice")) {
section.getSurveyPractices().add(constructPractice((Element) practiceElement));
}
for (SurveyPractice practice : section.getSurveyPractices()) {
practice.setSurveySection(section);
}
return section;
}
private SurveyPractice constructPractice(Element practiceElement) {
SurveyPractice practice = new SurveyPractice();
practice.setName(practiceElement.attributeValue("name"));
for (Object objectiveElement : practiceElement.elements("objective")) {
practice.getSurveyObjectives().add(constructObjective((Element) objectiveElement));
}
for (SurveyObjective objective : practice.getSurveyObjectives()) {
objective.setSurveyPractice(practice);
}
return practice;
}
private SurveyObjective constructObjective(Element objectiveElement) {
SurveyObjective objective = new SurveyObjective();
objective.setDescription(objectiveElement.elementText("description"));
objective.setLevelNumber(Integer.parseInt(objectiveElement.attributeValue("level")));
for (Object questionElement : objectiveElement.elements("question")) {
objective.getSurveyQuestions().add(constructQuestion((Element) questionElement));
}
for (SurveyQuestion question : objective.getSurveyQuestions()) {
question.setSurveyObjective(objective);
}
return objective;
}
private SurveyQuestion constructQuestion(Element questionElement) {
SurveyQuestion question = new SurveyQuestion();
question.setSurveyQuestion(questionElement.getTextTrim());
for (Object assertionElement : questionElement.elements("assertion")) {
question.getSurveyAssertions().add(constructAssertion((Element) assertionElement));
}
for (SurveyAssertion assertion : question.getSurveyAssertions()) {
assertion.setSurveyQuestion(question);
}
return question;
}
private SurveyAssertion constructAssertion(Element assertionElement) {
SurveyAssertion assertion = new SurveyAssertion();
assertion.setDescription(assertionElement.getTextTrim());
return assertion;
}
}