br.ufrgs.inf.dsmoura.repository.controller.util.XMLUtil.java Source code

Java tutorial

Introduction

Here is the source code for br.ufrgs.inf.dsmoura.repository.controller.util.XMLUtil.java

Source

package br.ufrgs.inf.dsmoura.repository.controller.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import br.ufrgs.inf.dsmoura.repository.controller.asset.AnalysisMB;
import br.ufrgs.inf.dsmoura.repository.controller.asset.ArtifactType;
import br.ufrgs.inf.dsmoura.repository.controller.asset.DesignMB;
import br.ufrgs.inf.dsmoura.repository.controller.asset.ImplementationMB;
import br.ufrgs.inf.dsmoura.repository.controller.asset.RequirementsMB;
import br.ufrgs.inf.dsmoura.repository.controller.asset.TestMB;
import br.ufrgs.inf.dsmoura.repository.controller.asset.UsageMB;
import br.ufrgs.inf.dsmoura.repository.model.entity.AdjustmentDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ApplicationSubdomain;
import br.ufrgs.inf.dsmoura.repository.model.entity.ArtifactDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ArtifactDependencyDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.Artifactable;
import br.ufrgs.inf.dsmoura.repository.model.entity.Asset;
import br.ufrgs.inf.dsmoura.repository.model.entity.ConsumptionDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.DescriptorGroupDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.DesignPatternDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.FeedbackDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.FreeFormDescriptorDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.FunctionalRequirementDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.InterfaceSpecDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.InternationalizationTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.NonFunctionalRequirementDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.OperationDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.OperationalSystemTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ProgrammingLanguageDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.ProjectDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.RelatedAsset;
import br.ufrgs.inf.dsmoura.repository.model.entity.SourceCodeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.TagDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.TestMethodTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.TestTypeDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.UseCaseDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.UserCommentDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.UserInterfaceDTO;
import br.ufrgs.inf.dsmoura.repository.model.entity.WsdlDTO;

public class XMLUtil {

    public static InputStream fromAssetToRassetXML(Asset asset) {

        // Order by RAS:
        // 1. profile
        // 2. description
        // 3. classification
        // 4. solution
        // 5. usage
        // 6. relatedAsset

        /* GENERAL */

        Element ecp = new Element("Asset");
        ecp.setAttribute("name", asset.getName());
        ecp.setAttribute("id", asset.getId());
        if (asset.getType() != null) {
            ecp.setAttribute("type", asset.getType().getName());
            if (FieldsUtil.isValidType(asset.getType()) && asset.getType().getName().equalsIgnoreCase("Other")) {
                ecp.setAttribute("other_type", asset.getOtherType());
            }
        }
        if (asset.getState() != null) {
            ecp.setAttribute("state", asset.getState().getName());
        }
        if (asset.getSoftwareLicenseDTO() != null) {
            ecp.setAttribute("software_license", asset.getSoftwareLicenseDTO().getName());
            if (FieldsUtil.isValidSoftwareLicense(asset.getSoftwareLicenseDTO())
                    && asset.getSoftwareLicenseDTO().getName().equalsIgnoreCase("Other")) {
                ecp.setAttribute("other_software_license", asset.getOtherSoftwareLicense());
            }
        }
        ecp.setAttribute("version", asset.getVersion());
        ecp.setAttribute("date", asset.getStrDate());
        ecp.setAttribute("creation_date", asset.getStrCreationDate());
        ecp.setAttribute("access_rights", asset.getAccessRights());
        ecp.setAttribute("short_description", asset.getShortDescription());

        Element description = new Element("description");
        description.addContent(asset.getDescription());
        ecp.addContent(description);

        /* CLASSIFICATION */

        Element classification = new Element("classification");
        ecp.addContent(classification);

        /* Application Domains */
        for (ApplicationSubdomain as : asset.getClassification().getApplicationSubdomains()) {
            Element applicationSubdomain = new Element("application_subdomain");
            applicationSubdomain.setAttribute("name", as.getName());

            Element applicationDomain = new Element("application_domain");
            applicationDomain.setAttribute("name", as.getApplicationDomain().getName());

            if (FieldsUtil.isValidApplicationSubdomain(as) && as.getName().equalsIgnoreCase("Other")) {
                applicationDomain.setAttribute("name", asset.getClassification().getOtherApplicationDomain());
                applicationSubdomain.setAttribute("name", asset.getClassification().getOtherApplicationSubdomain());
            }

            applicationSubdomain.addContent(applicationDomain);
            classification.addContent(applicationSubdomain);
        }

        /* Projects */
        for (ProjectDTO proj : asset.getClassification().getProjectDTOs()) {
            Element project = new Element("project");
            project.setAttribute("name", proj.getName());
            classification.addContent(project);

            Element organization = new Element("organization");
            organization.setAttribute("name", proj.getOrganizationDTO().getName());
            project.addContent(organization);
        }

        /* Tags */
        for (TagDTO t : asset.getClassification().getTagDTOs()) {
            Element tag = new Element("tag");
            tag.setAttribute("name", t.getName());
            classification.addContent(tag);
        }

        /* Group Descriptors */
        for (DescriptorGroupDTO groupDTO : asset.getClassification().getDescriptorGroupDTOs()) {
            Element group = new Element("descriptor_group");
            group.setAttribute("name", groupDTO.getName());
            classification.addContent(group);
            /* Descriptors */
            for (FreeFormDescriptorDTO descriptorDTO : groupDTO.getFreeFormDescriptorDTOs()) {
                Element descriptor = new Element("free_form_escriptor");
                descriptor.setAttribute("name", descriptorDTO.getName());
                descriptor.setAttribute("value", descriptorDTO.getFreeFormValue());
                group.addContent(descriptor);
            }
        }

        /* SOLUTION */

        Element solution = new Element("solution");
        ecp.addContent(solution);

        /* EFFORT */
        Element effort = new Element("effort");
        solution.addContent(effort);
        if (asset.getEffortDTO().getEstimatedTime() != null) {
            effort.setAttribute("estimated_time", asset.getEffortDTO().getEstimatedTime().toString());
        }
        if (asset.getEffortDTO().getRealTime() != null) {
            effort.setAttribute("real_time", asset.getEffortDTO().getRealTime().toString());
        }
        if (asset.getEffortDTO().getMonetary() != null) {
            effort.setAttribute("monetary", asset.getEffortDTO().getMonetary().toString());
        }
        if (asset.getEffortDTO().getTeamMembers() != null) {
            effort.setAttribute("team_members", asset.getEffortDTO().getTeamMembers().toString());
        }
        if (asset.getEffortDTO().getLinesOfCode() != null) {
            effort.setAttribute("linesOfCode", asset.getEffortDTO().getLinesOfCode().toString());
        }

        /* REQUIREMENTS */
        Element requirements = new Element("requirements");
        solution.addContent(requirements);

        requirements.addContent(
                fromArtifactsToElements(asset.getSolution().getRequirements().getFunctionalRequirementDTOs(),
                        RequirementsMB.FUNCTIONAL_REQ_REFERENCE_PATH));

        requirements.addContent(fromArtifactsToElements(asset.getSolution().getRequirements().getUseCaseDTOs(),
                RequirementsMB.USE_CASE_REFERENCE_PATH));

        requirements
                .addContent(fromArtifactsToElements(asset.getSolution().getRequirements().getUserInterfaceDTOs(),
                        RequirementsMB.USER_INTERFACE_REFERENCE_PATH));

        requirements.addContent(
                fromArtifactsToElements(asset.getSolution().getRequirements().getNonFunctionalRequirementDTOs(),
                        RequirementsMB.NON_FUNCTIONAL_REQ_REFERENCE_PATH));

        /* Internationalization */
        for (InternationalizationTypeDTO i : asset.getSolution().getRequirements()
                .getInternationalizationTypeDTOs()) {
            Element internat = new Element("language");
            internat.setAttribute("name", i.getName());
            requirements.addContent(internat);
        }

        /* Operational Systems */
        for (OperationalSystemTypeDTO o : asset.getSolution().getRequirements().getOperationalSystemTypeDTOs()) {
            Element operSyst = new Element("operational_system");
            operSyst.setAttribute("name", o.getName());
            requirements.addContent(operSyst);
        }

        /* ANALYSIS */

        Element analysis = new Element("analysis");
        solution.addContent(analysis);

        /* Interface Specs */
        for (InterfaceSpecDTO intSpecDTO : asset.getSolution().getAnalysis().getInterfaceSpecDTOs()) {
            Element interfaceSpec = new Element("interface_spec");
            if (intSpecDTO.getDescription() != null) {
                interfaceSpec.setAttribute("description", intSpecDTO.getDescription());
            }
            interfaceSpec.setAttribute("name", intSpecDTO.getName());
            analysis.addContent(interfaceSpec);
            /* Descriptors */
            for (OperationDTO operationDTO : intSpecDTO.getOperationDTOs()) {
                Element operation = new Element("operation");
                operation.setAttribute("name", operationDTO.getName());
                operation.setAttribute("initiates_transaction", operationDTO.getInitiatesTransaction().toString());
                if (operationDTO.getDescription() != null) {
                    operation.setAttribute("description", operationDTO.getDescription());
                }
                interfaceSpec.addContent(operation);
            }
        }

        /* Use Case */
        analysis.addContent(fromArtifactsToElements(asset.getSolution().getAnalysis().getUseCaseDTOs(),
                AnalysisMB.USE_CASE_REFERENCE_PATH));

        /* User Interfaces */
        analysis.addContent(fromArtifactsToElements(asset.getSolution().getAnalysis().getUserInterfaceDTOs(),
                AnalysisMB.USER_INTERFACE_REFERENCE_PATH));

        /* General Artifacts */
        analysis.addContent(fromArtifactsToElements(asset.getSolution().getAnalysis().getArtifactDTOs(),
                AnalysisMB.GENERAL_ARTIFACT_REFERENCE_PATH));

        /* DESIGN */

        Element design = new Element("design");
        solution.addContent(design);

        /* Interface Specs */
        for (InterfaceSpecDTO intSpecDTO : asset.getSolution().getDesign().getInterfaceSpecDTOs()) {
            Element interfaceSpec = new Element("interface_spec");
            interfaceSpec.setAttribute("name", intSpecDTO.getName());
            if (intSpecDTO.getDescription() != null) {
                interfaceSpec.setAttribute("description", intSpecDTO.getDescription());
            }
            design.addContent(interfaceSpec);
            /* Descriptors */
            for (OperationDTO operationDTO : intSpecDTO.getOperationDTOs()) {
                Element operation = new Element("operation");
                operation.setAttribute("name", operationDTO.getName());
                operation.setAttribute("initiates_transaction", operationDTO.getInitiatesTransaction().toString());
                if (operationDTO.getDescription() != null) {
                    operation.setAttribute("description", operationDTO.getDescription());
                }
                interfaceSpec.addContent(operation);
            }
        }
        /* Design Patterns */
        for (DesignPatternDTO dp : asset.getSolution().getDesign().getDesignPatternDTOs()) {
            Element designPat = new Element("design_pattern");
            designPat.setAttribute("name", dp.getName());
            design.addContent(designPat);
        }

        /* User Interfaces */
        design.addContent(fromArtifactsToElements(asset.getSolution().getDesign().getUserInterfaceDTOs(),
                DesignMB.USER_INTERFACE_REFERENCE_PATH));

        /* General Artifacts */
        design.addContent(fromArtifactsToElements(asset.getSolution().getDesign().getArtifactDTOs(),
                DesignMB.GENERAL_ARTIFACT_REFERENCE_PATH));

        /* IMPLEMENTATION */

        Element implementation = new Element("implementation");
        solution.addContent(implementation);

        /* Programming Languages */
        for (ProgrammingLanguageDTO pl : asset.getSolution().getImplementation().getProgrammingLanguageDTOs()) {
            Element progLang = new Element("programming_language");
            progLang.setAttribute("name", pl.getName());
            if (FieldsUtil.isValidProgrammingLanguage(pl) && pl.getName().equalsIgnoreCase("Other")) {
                progLang.setAttribute("other_name",
                        asset.getSolution().getImplementation().getOtherProgrammingLanguage());
            }
            implementation.addContent(progLang);
        }

        /* Design Patterns */
        for (DesignPatternDTO dp : asset.getSolution().getImplementation().getDesignPatternDTOs()) {
            Element designPat = new Element("design_pattern");
            designPat.setAttribute("name", dp.getName());
            implementation.addContent(designPat);
        }

        /* Source Codes */
        implementation
                .addContent(fromArtifactsToElements(asset.getSolution().getImplementation().getSourceCodeDTOs(),
                        ImplementationMB.SOURCE_CODE_REFERENCE_PATH));

        /* User Interfaces */
        implementation
                .addContent(fromArtifactsToElements(asset.getSolution().getImplementation().getUserInterfaceDTOs(),
                        ImplementationMB.USER_INTERFACE_REFERENCE_PATH));

        /* WSDL */
        implementation.addContent(fromArtifactsToElements(asset.getSolution().getImplementation().getWsdlDTOs(),
                ImplementationMB.WSDL_REFERENCE_PATH));

        /* General Artifacts */
        implementation.addContent(fromArtifactsToElements(asset.getSolution().getImplementation().getArtifactDTOs(),
                ImplementationMB.GENERAL_ARTIFACT_REFERENCE_PATH));

        /* TEST */
        Element test = new Element("test");
        solution.addContent(test);

        /* Test Type */
        for (TestTypeDTO tt : asset.getSolution().getTest().getTestTypeDTOs()) {
            Element testMethod = new Element("test_type");
            testMethod.setAttribute("name", tt.getName());
            test.addContent(testMethod);
        }

        /* Test Method Type */
        for (TestMethodTypeDTO tmt : asset.getSolution().getTest().getTestMethodTypeDTOs()) {
            Element testMethod = new Element("test_method_type");
            testMethod.setAttribute("name", tmt.getName());
            test.addContent(testMethod);
        }

        /* Programming Languages */
        for (ProgrammingLanguageDTO pl : asset.getSolution().getTest().getProgrammingLanguageDTOs()) {
            Element progLang = new Element("programming_language");
            progLang.setAttribute("name", pl.getName());
            if (FieldsUtil.isValidProgrammingLanguage(pl) && pl.getName().equalsIgnoreCase("Other")) {
                progLang.setAttribute("other_name", asset.getSolution().getTest().getOtherProgrammingLanguage());
            }
            test.addContent(progLang);
        }

        /* Design Patterns */
        for (DesignPatternDTO dp : asset.getSolution().getTest().getDesignPatternDTOs()) {
            Element designPat = new Element("design_pattern");
            designPat.setAttribute("name", dp.getName());
            test.addContent(designPat);
        }

        /* Source Codes */
        test.addContent(fromArtifactsToElements(asset.getSolution().getTest().getSourceCodeDTOs(),
                TestMB.SOURCE_CODE_REFERENCE_PATH));

        /* General Artifacts */
        test.addContent(fromArtifactsToElements(asset.getSolution().getTest().getArtifactDTOs(),
                TestMB.GENERAL_ARTIFACT_REFERENCE_PATH));

        /* USAGE */

        Element usage = new Element("usage");
        ecp.addContent(usage);

        Element usageDescription = new Element("description");
        usageDescription.addContent(asset.getUsage().getDescription());
        usage.addContent(usageDescription);

        usage.addContent(fromArtifactsToElements(asset.getUsage().getArtifactDTOs(),
                UsageMB.GENERAL_ARTIFACT_REFERENCE_PATH));

        /* Author User */
        Element author = new Element("author");
        author.setAttribute("username", asset.getUsage().getAuthorUserDTO().getUsername());
        author.setAttribute("name", asset.getUsage().getAuthorUserDTO().getName());
        usage.addContent(author);

        usage.setAttribute("authorship_date", asset.getUsage().getStrAuthorshipDate());

        usage.setAttribute("creator_name", asset.getUsage().getCreatorUsername());

        /* Certifier User */
        if (asset.getUsage().getCertifierUserDTO() != null) {
            Element certifier = new Element("certifier");
            certifier.setAttribute("username", asset.getUsage().getCertifierUserDTO().getUsername());
            certifier.setAttribute("name", asset.getUsage().getCertifierUserDTO().getName());
            usage.addContent(certifier);
        }
        if (asset.getUsage().getCertificationDate() != null) {
            usage.setAttribute("certification_date", asset.getUsage().getStrCertificationDate());
        }

        /* Feedbacks */
        for (FeedbackDTO feedbackDTO : asset.getFeedbackDTOs()) {
            if (feedbackDTO.getHasFeedback()) {
                Element feedback = new Element("feedback");
                feedback.setAttribute("date", feedbackDTO.getStrDate());
                feedback.setAttribute("comment", feedbackDTO.getComment());

                /* Feedback User */
                Element user = new Element("feedback_user");
                user.setAttribute("username", feedbackDTO.getFeedbackUserDTO().getUsername());
                user.setAttribute("name", feedbackDTO.getFeedbackUserDTO().getName());
                feedback.addContent(user);

                /* Scores */
                feedback.setAttribute("general_score", feedbackDTO.getGeneralScore().toString());

                Element qualityInUse = new Element("quality_in_use");
                if (feedbackDTO.getQualityInUseDTO().getContextCoverageScore() != null) {
                    qualityInUse.setAttribute("context_coverage_score",
                            feedbackDTO.getQualityInUseDTO().getContextCoverageScore().toString());
                }
                if (feedbackDTO.getQualityInUseDTO().getEfficiencyScore() != null) {
                    qualityInUse.setAttribute("efficiency_score",
                            feedbackDTO.getQualityInUseDTO().getEfficiencyScore().toString());
                }
                if (feedbackDTO.getQualityInUseDTO().getEffectivenessScore() != null) {
                    qualityInUse.setAttribute("effectiveness_score",
                            feedbackDTO.getQualityInUseDTO().getEffectivenessScore().toString());
                }
                if (feedbackDTO.getQualityInUseDTO().getSafetyScore() != null) {
                    qualityInUse.setAttribute("safety_score",
                            feedbackDTO.getQualityInUseDTO().getSafetyScore().toString());
                }
                if (feedbackDTO.getQualityInUseDTO().getSatisfactionScore() != null) {
                    qualityInUse.setAttribute("satisfaction_score",
                            feedbackDTO.getQualityInUseDTO().getSatisfactionScore().toString());
                }
                feedback.addContent(qualityInUse);

                Element softProdQuality = new Element("software_product_quality");
                if (feedbackDTO.getSoftwareProductQualityDTO().getCompatibilityScore() != null) {
                    softProdQuality.setAttribute("compatibility_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getCompatibilityScore().toString());
                }
                if (feedbackDTO.getSoftwareProductQualityDTO().getFunctionalSuitabilityScore() != null) {
                    softProdQuality.setAttribute("functional_suitability_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getFunctionalSuitabilityScore().toString());
                }
                if (feedbackDTO.getSoftwareProductQualityDTO().getMaintainabilityScore() != null) {
                    softProdQuality.setAttribute("maintainability_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getMaintainabilityScore().toString());
                }
                if (feedbackDTO.getSoftwareProductQualityDTO().getPerformanceEfficiencyScore() != null) {
                    softProdQuality.setAttribute("performance_efficiency_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getPerformanceEfficiencyScore().toString());
                }
                if (feedbackDTO.getSoftwareProductQualityDTO().getPortabilityScore() != null) {
                    softProdQuality.setAttribute("portability_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getPortabilityScore().toString());
                }
                if (feedbackDTO.getSoftwareProductQualityDTO().getReliabilityScore() != null) {
                    softProdQuality.setAttribute("reliability_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getReliabilityScore().toString());
                }
                if (feedbackDTO.getSoftwareProductQualityDTO().getSecurityScore() != null) {
                    softProdQuality.setAttribute("security_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getSecurityScore().toString());
                }
                if (feedbackDTO.getSoftwareProductQualityDTO().getUsabilityScore() != null) {
                    softProdQuality.setAttribute("usability_score",
                            feedbackDTO.getSoftwareProductQualityDTO().getUsabilityScore().toString());
                }
                feedback.addContent(softProdQuality);

                usage.addContent(feedback);
            }
        }

        /* Adjustments */
        for (AdjustmentDTO adjustmentDTO : asset.getUsage().getAdjustmentDTOs()) {
            Element adjustment = new Element("adjustment");
            adjustment.setAttribute("date", adjustmentDTO.getStrDate());
            Element user = new Element("adjuster_user");
            user.setAttribute("username", adjustmentDTO.getAdjusterUserDTO().getUsername());
            user.setAttribute("name", adjustmentDTO.getAdjusterUserDTO().getName());
            adjustment.addContent(user);
            Element adjustmentDescription = new Element("description");
            adjustmentDescription.addContent(adjustmentDTO.getDescription());
            adjustment.addContent(adjustmentDescription);
            usage.addContent(adjustment);
        }

        /* Consumptions */
        for (ConsumptionDTO consumptionDTO : asset.getUsage().getConsumptionDTOs()) {
            Element consumption = new Element("consumption");
            consumption.setAttribute("date", consumptionDTO.getStrDate());
            Element user = new Element("comsumer_user");
            user.setAttribute("username", consumptionDTO.getConsumerUserDTO().getUsername());
            user.setAttribute("name", consumptionDTO.getConsumerUserDTO().getName());
            consumption.addContent(user);
            usage.addContent(consumption);
        }

        /* User Comments */
        for (UserCommentDTO userCommentDTO : asset.getUsage().getUserCommentDTOs()) {
            Element consumption = new Element("user_comment");
            consumption.setAttribute("date", userCommentDTO.getStrDate());
            Element user = new Element("user");
            user.setAttribute("username", userCommentDTO.getUserDTO().getUsername());
            user.setAttribute("name", userCommentDTO.getUserDTO().getName());
            consumption.addContent(user);
            Element comment = new Element("comment");
            comment.addContent(userCommentDTO.getComment());
            consumption.addContent(comment);
            usage.addContent(consumption);
        }

        /* RELATED ASSETS */

        Element relatedAssets = new Element("related_assets");
        ecp.addContent(relatedAssets);
        for (RelatedAsset ra : asset.getRelatedAssets()) {
            Element relatedAsset = new Element("related_asset");
            relatedAsset.setAttribute("id", ra.getId());
            relatedAsset.setAttribute("name", ra.getName());
            relatedAsset.setAttribute("version", ra.getVersion());
            relatedAsset.setAttribute("reference", ra.getReference());
            if (ra.getRelatedAssetTypeDTO() != null) {
                relatedAsset.setAttribute("relationshipType", ra.getRelatedAssetTypeDTO().getName());
            }
            relatedAssets.addContent(relatedAsset);
        }

        /* Generate XML */
        Document doc = new Document();
        doc.setRootElement(ecp);

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
        try {
            xmlOut.output(doc, outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        InputStream is = new ByteArrayInputStream(outputStream.toByteArray());

        return is;
    }

    private static List<Element> fromArtifactsToElements(List<? extends Artifactable> artifacts,
            String referencePath) {
        List<Element> elements = new ArrayList<Element>();
        for (Artifactable artifactable : artifacts) {
            Element element = null;

            /* element name */
            if (artifactable instanceof ArtifactDTO) {
                element = new Element(ArtifactType.GENERAL.getXmlName());
            } else if (artifactable instanceof FunctionalRequirementDTO) {
                element = new Element(ArtifactType.FUNCTIONAL_REQ.getXmlName());
            } else if (artifactable instanceof NonFunctionalRequirementDTO) {
                element = new Element(ArtifactType.NON_FUNCTIONAL_REQ.getXmlName());
            } else if (artifactable instanceof SourceCodeDTO) {
                element = new Element(ArtifactType.SOURCE_CODE.getXmlName());
            } else if (artifactable instanceof UserInterfaceDTO) {
                element = new Element(ArtifactType.USER_INTERFACE.getXmlName());
            } else if (artifactable instanceof UseCaseDTO) {
                element = new Element(ArtifactType.USE_CASE.getXmlName());
            } else if (artifactable instanceof WsdlDTO) {
                element = new Element(ArtifactType.WSDL.getXmlName());
            } else {
                throw new IllegalArgumentException(
                        "Class type of artifact unrecognized: " + artifactable.getClass());
            }

            /* id and name */
            element.setAttribute("id", artifactable.getId());
            element.setAttribute("name", artifactable.getName());

            Element description = new Element("description");
            description.addContent(artifactable.getDescription());
            element.addContent(description);

            /* artifact types */
            if (artifactable instanceof ArtifactDTO || artifactable instanceof UseCaseDTO
                    || artifactable instanceof WsdlDTO) {
                //nothing
            } else if (artifactable instanceof FunctionalRequirementDTO) {
                if (((FunctionalRequirementDTO) artifactable).getFunctionalRequirementTypeDTO() != null) {
                    element.setAttribute("functional_requirement_type",
                            ((FunctionalRequirementDTO) artifactable).getFunctionalRequirementTypeDTO().getName());
                }
            } else if (artifactable instanceof NonFunctionalRequirementDTO) {
                if (((NonFunctionalRequirementDTO) artifactable).getNonFunctionalRequirementTypeDTO() != null) {
                    element.setAttribute("non_functional_requirement_type",
                            ((NonFunctionalRequirementDTO) artifactable).getNonFunctionalRequirementTypeDTO()
                                    .getName());
                }
            } else if (artifactable instanceof SourceCodeDTO) {
                if (((SourceCodeDTO) artifactable).getSourceCodeTypeDTO() != null) {
                    element.setAttribute("source_code_type",
                            ((SourceCodeDTO) artifactable).getSourceCodeTypeDTO().getName());
                }
            } else if (artifactable instanceof UserInterfaceDTO) {
                if (((UserInterfaceDTO) artifactable).getUserInterfaceTypeDTO() != null) {
                    element.setAttribute("user_interface_type",
                            ((UserInterfaceDTO) artifactable).getUserInterfaceTypeDTO().getName());
                }
            } else {
                throw new IllegalArgumentException(
                        "Class type of artifact unrecognized: " + artifactable.getClass());
            }

            /* software license */
            if (artifactable.getSoftwareLicenseDTO() != null) {
                element.setAttribute("software_license", artifactable.getSoftwareLicenseDTO().getName());
            }

            /* reference */
            if (artifactable.getFile() == null) {
                element.setAttribute("reference", artifactable.getReference());
            } else {
                element.setAttribute("reference", referencePath + "\\" + artifactable.getName());
            }

            /* artifact dependency */
            for (ArtifactDependencyDTO artifactDependencyDTO : artifactable.getArtifactDependencyDTOs()) {
                Element artifactDependency = new Element("artifact_dependency");
                artifactDependency.setAttribute("artifact_id", artifactDependencyDTO.getArtifactID());
                if (artifactDependencyDTO.getArtifactDependencyTypeDTO() != null) {
                    artifactDependency.setAttribute("artifact_dependency_type",
                            artifactDependencyDTO.getArtifactDependencyTypeDTO().getName());
                }
                element.addContent(artifactDependency);
            }

            elements.add(element);
        }
        return elements;
    }
}