package com.idega.builder.business; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.ejb.FinderException; import com.idega.builder.data.IBExportImportData; import com.idega.builder.data.IBReferences; import com.idega.business.IBOLookup; import com.idega.business.IBOLookupException; import com.idega.business.IBOServiceBean; import com.idega.core.builder.data.ICPage; import com.idega.core.builder.data.ICPageHome; import com.idega.core.data.ICTreeNode; import com.idega.core.file.data.ICFile; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; import com.idega.presentation.IWContext; import com.idega.util.xml.XMLData; import com.idega.xml.XMLDocument; import com.idega.xml.XMLElement; /** * <p>Title: idegaWeb</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: idega Software</p> * @author <a href="thomas@idega.is">Thomas Hilbig</a> * @version 1.0 * Created on Mar 12, 2004 */ public class IBPageExportBusinessBean extends IBOServiceBean implements IBPageExportBusiness { private ICPageHome pageHome = null; private FileBusiness fileBusiness = null; private IBReferences references = null; public String exportPages(List pageIds, List templateIds, IWContext iwc) throws IOException, FinderException { List ids = null; boolean pageIdsExists = (pageIds != null && ! pageIds.isEmpty()); boolean templateIdsExists = (templateIds != null && ! templateIds.isEmpty()); if (! pageIdsExists && ! templateIdsExists) { return null; } IBExportImportData metadata = new IBExportImportData(); // add always both trees, because it might be that later some templates are added (see method exportPages) metadata.addPageTree(iwc); metadata.addTemplateTree(iwc); if (pageIdsExists) { ids = new ArrayList(pageIds); } if (templateIdsExists) { if (pageIdsExists) { ids.addAll(templateIds); } else { ids = new ArrayList(templateIds); } } return exportPages(ids, metadata, iwc); } private String exportPages(List pageIds,IBExportImportData metadata, IWContext iwc) throws IOException, FinderException { List finishedPageIds = new ArrayList(); List additionalPageIds = pageIds; while (! additionalPageIds.isEmpty()) { List usedPageIds = prepareMetadataGetUsedPageIds(additionalPageIds, metadata, iwc); finishedPageIds.addAll(additionalPageIds); additionalPageIds = new ArrayList(); Iterator iterator = usedPageIds.iterator(); while (iterator.hasNext()) { Integer usedId = (Integer) iterator.next(); if (! finishedPageIds.contains(usedId)) { additionalPageIds.add(usedId); } } } FileBusiness fileBusiness = getFileBusiness(); return fileBusiness.getURLForOfferingDownload(metadata, iwc); } private List prepareMetadataGetUsedPageIds(List pageIds, IBExportImportData metadata, IWContext iwc) throws IDOLookupException, FinderException, IOException { List additionalPageIds = new ArrayList(); Iterator pageIterator = pageIds.iterator(); while (pageIterator.hasNext()) { Integer pageId = (Integer) pageIterator.next(); ICPageHome pageHome = getPageHome(); ICPage page = pageHome.findByPrimaryKey(pageId); // add parent page ICTreeNode nodeTree = page.getParentNode(); if (nodeTree != null) { Integer additionalPageId = new Integer(nodeTree.getNodeID()); additionalPageIds.add(additionalPageId); } // add template int templateId = page.getTemplateId(); if (templateId != -1) { Integer additionalPageId = new Integer(templateId); additionalPageIds.add(additionalPageId); } ICFile file = page.getFile(); if (! file.isEmpty()) { XMLData xmlData = XMLData.getInstanceForFile(file); XMLDocument pageXML = xmlData.getDocument(); XMLElement pageRoot = pageXML.getRootElement().getChild(XMLConstants.PAGE_STRING); getReferences(iwc).checkElementForReferencesNoteNecessaryModules(pageRoot, metadata); } metadata.addFileEntry(page); } // check pages that are used List pages = metadata.getPageData(); Iterator usedPageIterator = pages.iterator(); while (usedPageIterator.hasNext()) { ICPage usedPage = (ICPage) usedPageIterator.next(); Integer usedPageId = (Integer) usedPage.getPrimaryKey(); additionalPageIds.add(usedPageId); } return additionalPageIds; } private IBReferences getReferences(IWContext iwc) throws IOException { if (this.references == null) { this.references = new IBReferences(iwc); } return this.references; } private ICPageHome getPageHome() throws IDOLookupException { if (this.pageHome == null) { this.pageHome = (ICPageHome) IDOLookup.getHome(ICPage.class); } return this.pageHome; } private FileBusiness getFileBusiness() throws IBOLookupException { if (this.fileBusiness == null) { this.fileBusiness = (FileBusiness) IBOLookup.getServiceInstance( getIWApplicationContext(), FileBusiness.class); } return this.fileBusiness; } }