/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including 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 General Public License along with * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.cms.applications.managementtool.actions; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.exolab.castor.jdo.Database; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.xml.Marshaller; import org.infoglue.cms.applications.common.VisualFormatter; import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction; import org.infoglue.cms.applications.databeans.ProcessBean; import org.infoglue.cms.controllers.kernel.impl.simple.AccessRightController; import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; import org.infoglue.cms.controllers.kernel.impl.simple.CategoryController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentTypeDefinitionController; import org.infoglue.cms.controllers.kernel.impl.simple.InterceptionPointController; import org.infoglue.cms.controllers.kernel.impl.simple.OptimizedExportController; import org.infoglue.cms.controllers.kernel.impl.simple.RepositoryController; import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeController; import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeVersionController; import org.infoglue.cms.entities.content.Content; import org.infoglue.cms.entities.management.AccessRight; import org.infoglue.cms.entities.management.InterceptionPointVO; import org.infoglue.cms.entities.management.Repository; import org.infoglue.cms.entities.management.impl.simple.InfoGlueExportImpl; import org.infoglue.cms.entities.structure.SiteNode; import org.infoglue.cms.entities.structure.SiteNodeVersionVO; import org.infoglue.cms.exception.SystemException; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.cms.util.handlers.DigitalAssetBytesHandler; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.opensymphony.module.propertyset.PropertySet; import com.opensymphony.module.propertyset.PropertySetManager; /** * This class handles Exporting of a repository to an XML-file. * * @author mattias */ public class ExportRepositoryAction extends InfoGlueAbstractAction { private final static Logger logger = Logger.getLogger(ExportRepositoryAction.class.getName()); private VisualFormatter visualFormatter = new VisualFormatter(); private Integer repositoryId = null; private List repositories = new ArrayList(); private String fileUrl = ""; private String fileName = ""; private String exportFileName = null; private String exportFormat = "2"; private Boolean onlyPublishedVersions = false; private int assetMaxSize = -1; private String processId = null; private int processStatus = -1; /** * This deletes a process info bean and related files etc. * @return * @throws Exception */ public String doDeleteProcessBean() throws Exception { if(this.processId != null) { ProcessBean pb = ProcessBean.getProcessBean(ExportRepositoryAction.class.getName(), processId); if(pb != null) pb.removeProcess(); } return "successRedirectToProcesses"; } /** * This refreshes the view. * @return * @throws Exception */ public String doShowProcesses() throws Exception { return "successShowProcesses"; } public String doShowProcessesAsJSON() throws Exception { // TODO it would be nice we could write JSON to the OutputStream but we get a content already transmitted exception then. return "successShowProcessesAsJSON"; } /** * This shows the dialog before export. * @return * @throws Exception */ public String doInput() throws Exception { repositories = RepositoryController.getController().getRepositoryVOListNotMarkedForDeletion(); return "input"; } /** * This handles the actual exporting. */ protected String doExecuteV3() throws Exception { String[] repositories = getRequest().getParameterValues("repositoryId"); String exportId = "Export_" + visualFormatter.formatDate(new Date(), "yyyy-MM-dd_HHmm"); ProcessBean processBean = ProcessBean.createProcessBean(ExportRepositoryAction.class.getName(), exportId); processBean.setStatus(ProcessBean.RUNNING); OptimizedExportController.export(repositories, assetMaxSize, onlyPublishedVersions, exportFileName, processBean); return "successRedirectToProcesses"; } /** * This handles the actual exporting. */ protected String doExecute() throws Exception { String exportFormat = CmsPropertyHandler.getExportFormat(); if(exportFormat.equalsIgnoreCase("3") || this.exportFormat.equals("3")) { logger.info("exportFormat:" + exportFormat); logger.info("this.exportFormat:" + this.exportFormat); return doExecuteV3(); } Database db = CastorDatabaseService.getDatabase(); try { Mapping map = new Mapping(); if(exportFormat.equalsIgnoreCase("2")) { logger.info("MappingFile:" + CastorDatabaseService.class.getResource("/xml_mapping_site_2.5.xml").toString()); map.loadMapping(CastorDatabaseService.class.getResource("/xml_mapping_site_2.5.xml").toString()); } else { logger.info("MappingFile:" + CastorDatabaseService.class.getResource("/xml_mapping_site.xml").toString()); map.loadMapping(CastorDatabaseService.class.getResource("/xml_mapping_site.xml").toString()); } // All ODMG database access requires a transaction db.begin(); List<SiteNode> siteNodes = new ArrayList<SiteNode>(); List<Content> contents = new ArrayList<Content>(); Hashtable<String,String> allRepositoryProperties = new Hashtable<String,String>(); Hashtable<String,String> allSiteNodeProperties = new Hashtable<String,String>(); Hashtable<String,String> allContentProperties = new Hashtable<String,String>(); List<AccessRight> allAccessRights = new ArrayList<AccessRight>(); //List<AccessRight> allAccessRights = AccessRightController.getController().getAllAccessRightListForExportReadOnly(db); //TEST Map args = new HashMap(); args.put("globalKey", "infoglue"); PropertySet ps = PropertySetManager.getInstance("jdbc", args); //END TEST String names = ""; String[] repositories = getRequest().getParameterValues("repositoryId"); for(int i=0; i<repositories.length; i++) { Integer repositoryId = new Integer(repositories[i]); Repository repository = RepositoryController.getController().getRepositoryWithId(repositoryId, db); SiteNode siteNode = SiteNodeController.getController().getRootSiteNode(repositoryId, db); Content content = ContentController.getContentController().getRootContent(repositoryId, db); InterceptionPointVO interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Repository.Read", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), repository.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Repository.Write", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), repository.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Repository.ReadForBinding", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), repository.getId().toString(), db)); getContentPropertiesAndAccessRights(ps, allContentProperties, allAccessRights, content, db); if(siteNode != null) getSiteNodePropertiesAndAccessRights(ps, allSiteNodeProperties, allAccessRights, siteNode, db); if(siteNode != null) siteNodes.add(siteNode); contents.add(content); names = names + "_" + repository.getName(); allRepositoryProperties.putAll(OptimizedExportController.getRepositoryProperties(ps, repositoryId)); } List contentTypeDefinitions = ContentTypeDefinitionController.getController().getContentTypeDefinitionList(db); List categories = CategoryController.getController().getAllActiveCategories(); InfoGlueExportImpl infoGlueExportImpl = new InfoGlueExportImpl(); VisualFormatter visualFormatter = new VisualFormatter(); names = new VisualFormatter().replaceNonAscii(names, '_'); if(repositories.length > 2 || names.length() > 40) names = "" + repositories.length + "_repositories"; String fileName = "Export_" + names + "_" + visualFormatter.formatDate(new Date(), "yyyy-MM-dd_HHmm") + ".xml"; if(exportFileName != null && !exportFileName.equals("")) fileName = exportFileName; String filePath = CmsPropertyHandler.getDigitalAssetPath(); String fileSystemName = filePath + File.separator + fileName; fileUrl = CmsPropertyHandler.getWebServerAddress() + "/" + CmsPropertyHandler.getDigitalAssetBaseUrl() + "/" + fileName; this.fileName = fileName; String encoding = "UTF-8"; File file = new File(fileSystemName); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, encoding); Marshaller marshaller = new Marshaller(osw); marshaller.setMapping(map); marshaller.setEncoding(encoding); DigitalAssetBytesHandler.setMaxSize(assetMaxSize); infoGlueExportImpl.getRootContent().addAll(contents); infoGlueExportImpl.getRootSiteNode().addAll(siteNodes); infoGlueExportImpl.setContentTypeDefinitions(contentTypeDefinitions); infoGlueExportImpl.setCategories(categories); infoGlueExportImpl.setRepositoryProperties(allRepositoryProperties); infoGlueExportImpl.setContentProperties(allContentProperties); infoGlueExportImpl.setSiteNodeProperties(allSiteNodeProperties); infoGlueExportImpl.setAccessRights(allAccessRights); marshaller.marshal(infoGlueExportImpl); osw.flush(); osw.close(); db.rollback(); db.close(); } catch (Exception e) { logger.error("An error was found exporting a repository: " + e.getMessage(), e); db.rollback(); } return "success"; } public static void getContentPropertiesAndAccessRights(PropertySet ps, Hashtable<String, String> allContentProperties, List<AccessRight> allAccessRights, Content content, Database db) throws SystemException { String allowedContentTypeNames = ps.getString("content_" + content.getId() + "_allowedContentTypeNames"); if ( allowedContentTypeNames != null && !allowedContentTypeNames.equals("")) { allContentProperties.put("content_" + content.getId() + "_allowedContentTypeNames", allowedContentTypeNames); } if(ps.exists("content_" + content.getId() + "_defaultContentTypeName")) allContentProperties.put("content_" + content.getId() + "_defaultContentTypeName", "" + ps.getString("content_" + content.getId() + "_defaultContentTypeName")); if(ps.exists("content_" + content.getId() + "_initialLanguageId")) allContentProperties.put("content_" + content.getId() + "_initialLanguageId", "" + ps.getString("content_" + content.getId() + "_initialLanguageId")); InterceptionPointVO interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.Read", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.Write", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.Create", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.Delete", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.Move", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.SubmitToPublish", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.ChangeAccessRights", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.CreateVersion", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("ContentVersion.Delete", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("ContentVersion.Write", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("ContentVersion.Read", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("ContentVersion.Publish", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), content.getId().toString(), db)); Iterator childContents = content.getChildren().iterator(); while(childContents.hasNext()) { Content childContent = (Content)childContents.next(); getContentPropertiesAndAccessRights(ps, allContentProperties, allAccessRights, childContent, db); } } public static void getSiteNodePropertiesAndAccessRights(PropertySet ps, Hashtable<String, String> allSiteNodeProperties, List<AccessRight> allAccessRights, SiteNode siteNode, Database db) throws SystemException, Exception { String disabledLanguagesString = "" + ps.getString("siteNode_" + siteNode.getId() + "_disabledLanguages"); String enabledLanguagesString = "" + ps.getString("siteNode_" + siteNode.getId() + "_enabledLanguages"); if(disabledLanguagesString != null && !disabledLanguagesString.equals("") && !disabledLanguagesString.equals("null")) allSiteNodeProperties.put("siteNode_" + siteNode.getId() + "_disabledLanguages", disabledLanguagesString); if(enabledLanguagesString != null && !enabledLanguagesString.equals("") && !enabledLanguagesString.equals("null")) allSiteNodeProperties.put("siteNode_" + siteNode.getId() + "_enabledLanguages", enabledLanguagesString); SiteNodeVersionVO latestSiteNodeVersionVO = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, siteNode.getId()); if(latestSiteNodeVersionVO != null) { InterceptionPointVO interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.Read", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.Write", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.CreateSiteNode", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.DeleteSiteNode", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.MoveSiteNode", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.SubmitToPublish", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.ChangeAccessRights", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName("SiteNodeVersion.Publish", db); if(interceptionPointVO != null) allAccessRights.addAll(AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPointVO.getId(), latestSiteNodeVersionVO.getId().toString(), db)); } Iterator childSiteNodes = siteNode.getChildSiteNodes().iterator(); while(childSiteNodes.hasNext()) { SiteNode childSiteNode = (SiteNode)childSiteNodes.next(); getSiteNodePropertiesAndAccessRights(ps, allSiteNodeProperties, allAccessRights, childSiteNode, db); } } public static void getContentPropertiesAndAccessRights(PropertySet ps, Hashtable<String, String> allContentProperties, List<AccessRight> allAccessRights, Collection keys, Content content, Database db) throws SystemException { String allowedContentTypeNames = ps.getString("content_" + content.getId() + "_allowedContentTypeNames"); if ( allowedContentTypeNames != null && !allowedContentTypeNames.equals("")) { allContentProperties.put("content_" + content.getId() + "_allowedContentTypeNames", allowedContentTypeNames); } //if(ps.exists("content_" + content.getId() + "_defaultContentTypeName")) if(keys.contains("content_" + content.getId() + "_defaultContentTypeName")) allContentProperties.put("content_" + content.getId() + "_defaultContentTypeName", "" + ps.getString("content_" + content.getId() + "_defaultContentTypeName")); //if(ps.exists("content_" + content.getId() + "_initialLanguageId")) if(keys.contains("content_" + content.getId() + "_initialLanguageId")) allContentProperties.put("content_" + content.getId() + "_initialLanguageId", "" + ps.getString("content_" + content.getId() + "_initialLanguageId")); Iterator childContents = content.getChildren().iterator(); while(childContents.hasNext()) { Content childContent = (Content)childContents.next(); getContentPropertiesAndAccessRights(ps, allContentProperties, allAccessRights, keys, childContent, db); } } public static void getSiteNodePropertiesAndAccessRights(PropertySet ps, Hashtable<String, String> allSiteNodeProperties, List<AccessRight> allAccessRights, Collection keys, SiteNode siteNode, Database db) throws SystemException, Exception { if(keys.contains("siteNode_" + siteNode.getId() + "_disabledLanguages")) { String disabledLanguagesString = "" + ps.getString("siteNode_" + siteNode.getId() + "_disabledLanguages"); if(disabledLanguagesString != null && !disabledLanguagesString.equals("") && !disabledLanguagesString.equals("null")) allSiteNodeProperties.put("siteNode_" + siteNode.getId() + "_disabledLanguages", disabledLanguagesString); } if(keys.contains("siteNode_" + siteNode.getId() + "_enabledLanguages")) { String enabledLanguagesString = "" + ps.getString("siteNode_" + siteNode.getId() + "_enabledLanguages"); if(enabledLanguagesString != null && !enabledLanguagesString.equals("") && !enabledLanguagesString.equals("null")) allSiteNodeProperties.put("siteNode_" + siteNode.getId() + "_enabledLanguages", enabledLanguagesString); } Iterator childSiteNodes = siteNode.getChildSiteNodes().iterator(); while(childSiteNodes.hasNext()) { SiteNode childSiteNode = (SiteNode)childSiteNodes.next(); getSiteNodePropertiesAndAccessRights(ps, allSiteNodeProperties, allAccessRights, keys, childSiteNode, db); } } public void setRepositoryId(Integer repositoryId) { this.repositoryId = repositoryId; } public String getFileName() { return fileName; } public String getFileUrl() { return fileUrl; } public Integer getRepositoryId() { return repositoryId; } public List getRepositories() { return repositories; } public String getExportFileName() { return exportFileName; } public void setExportFileName(String exportFileName) { this.exportFileName = exportFileName; } public int getAssetMaxSize() { return assetMaxSize; } public void setAssetMaxSize(int assetMaxSize) { this.assetMaxSize = assetMaxSize; } public String getExportFormat() { return exportFormat; } public void setExportFormat(String exportFormat) { this.exportFormat = exportFormat; } public Boolean getOnlyPublishedVersions() { return this.onlyPublishedVersions; } public void setOnlyPublishedVersions(Boolean onlyPublishedVersions) { this.onlyPublishedVersions = onlyPublishedVersions; } public void setProcessId(String processId) { this.processId = processId; } public void setProcessStatus(String processStatusString) { if ("running".equals(processStatusString)) { this.processStatus = ProcessBean.RUNNING; } else if ("finished".equals(processStatusString)) { this.processStatus = ProcessBean.FINISHED; } else if ("error".equals(processStatusString)) { this.processStatus = ProcessBean.ERROR; } else if ("notStarted".equals(processStatusString)) { this.processStatus = ProcessBean.NOT_STARTED; } else { logger.warn("Got unknown process status parameter. Ignoring value. Parameter: " + processStatusString); this.processStatus = -1; } } public List<ProcessBean> getProcessBeans() { return ProcessBean.getProcessBeans(ExportRepositoryAction.class.getName()); } public List<ProcessBean> getFilteredProcessBeans() { List<ProcessBean> processes = ProcessBean.getProcessBeans(ExportRepositoryAction.class.getName()); if (logger.isDebugEnabled()) { logger.debug("Number of processes before filtering: " + processes.size()); } if (this.processStatus != -1) { Iterator<ProcessBean> processIterator = processes.iterator(); ProcessBean process; while (processIterator.hasNext()) { process = processIterator.next(); if (process.getStatus() != this.processStatus) { logger.debug("Removing (filtering) process with Id: " + process.getProcessId()); processIterator.remove(); } } } if (logger.isDebugEnabled()) { logger.debug("Number of processes after filtering: " + processes.size()); } return processes; } public String getStatusAsJSON() { Gson gson = new GsonBuilder() .excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.STATIC) .setDateFormat("dd MMM HH:mm:ss").create(); JsonObject object = new JsonObject(); try { List<ProcessBean> processes = getProcessBeans(); Type processBeanListType = new TypeToken<List<ProcessBean>>() {}.getType(); JsonElement list = gson.toJsonTree(processes, processBeanListType); object.add("processes", list); object.addProperty("memoryMessage", getMemoryUsageAsText()); } catch (Throwable t) { logger.error("Error when generating repository export status report as JSON.", t); JsonObject error = new JsonObject(); error.addProperty("message", t.getMessage()); error.addProperty("type", t.getClass().getSimpleName()); object.add("error", error); } return gson.toJson(object); } }