From: <hs...@us...> - 2011-10-28 14:08:37
|
Revision: 975 http://treebase.svn.sourceforge.net/treebase/?rev=975&view=rev Author: hshyket Date: 2011-10-28 14:08:26 +0000 (Fri, 28 Oct 2011) Log Message: ----------- Updating functionality to allow download of all trees through the tree search page and also via the API query calls for Nexus and NeXML Modified Paths: -------------- trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/SearchController.java trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/TaxonSearchController.java trunk/treebase-web/src/main/webapp/WEB-INF/pages/search/searchResultsListControls.jsp trunk/treebase-web/src/main/webapp/WEB-INF/treebase-servlet.xml Modified: trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/SearchController.java =================================================================== --- trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/SearchController.java 2011-10-27 16:58:16 UTC (rev 974) +++ trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/SearchController.java 2011-10-28 14:08:26 UTC (rev 975) @@ -3,6 +3,8 @@ package org.cipres.treebase.web.controllers; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -12,6 +14,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import javax.servlet.ServletException; @@ -23,16 +26,31 @@ import org.cipres.treebase.TreebaseUtil; import org.cipres.treebase.TreebaseIDString.MalformedTreebaseIDString; import org.cipres.treebase.domain.TBPersistable; +import org.cipres.treebase.domain.nexus.NexusDataSet; +import org.cipres.treebase.domain.nexus.NexusService; +import org.cipres.treebase.domain.nexus.nexml.NexmlDocumentWriter; import org.cipres.treebase.domain.search.SearchResults; import org.cipres.treebase.domain.search.SearchResultsFrozen; import org.cipres.treebase.domain.search.SearchResultsType; import org.cipres.treebase.domain.search.SearchService; import org.cipres.treebase.domain.search.StudySearchResults; +import org.cipres.treebase.domain.search.TaxonSearchResults; +import org.cipres.treebase.domain.search.TreeSearchResults; +import org.cipres.treebase.domain.taxon.Taxon; +import org.cipres.treebase.domain.taxon.TaxonLabel; +import org.cipres.treebase.domain.taxon.TaxonLabelHome; import org.cipres.treebase.domain.taxon.TaxonLabelService; +import org.cipres.treebase.domain.taxon.TaxonLabelSet; +import org.cipres.treebase.domain.taxon.TaxonVariant; +import org.cipres.treebase.domain.tree.PhyloTree; +import org.cipres.treebase.domain.tree.TreeBlock; import org.cipres.treebase.service.AbstractService; import org.cipres.treebase.web.Constants; import org.cipres.treebase.web.model.SearchCommand; import org.cipres.treebase.web.util.SearchMessageSetter; +import org.cipres.treebase.web.util.WebUtil; +import org.nexml.model.Document; +import org.nexml.model.DocumentFactory; import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.RedirectView; @@ -55,6 +73,12 @@ protected String formView; private TaxonLabelService mTaxonLabelService; + protected static final int FORMAT_NEXUS = 1; + protected static final int FORMAT_NEXML = 2; + private static String mNexmlContentType = "application/xml; charset=UTF-8"; + protected String mFormatParameter = "format"; + private TaxonLabelHome mTaxonLabelHome; + protected abstract ModelAndView handleQueryRequest(HttpServletRequest request,HttpServletResponse response,BindException errors,String query) throws CQLParseException, IOException, InstantiationException, ParseException; /** @@ -122,7 +146,11 @@ onSubmitDiscardResults(request, response, command, errors); } else if ( action.equals("refineSearch") ){ onSubmitRefineSearch(request,response,command,errors); - } else { + } else if ( action.equals("downloadAllTrees") ) { + downloadAllTrees(request, response, errors); + return null; + } + else { throw new Error("Unknown action '" + action + "'"); } } else { @@ -140,6 +168,116 @@ return selectResultsView(request); } + protected void downloadAllTrees(HttpServletRequest request, + HttpServletResponse response, BindException errors) { + // TODO Auto-generated method stub + + try { + java.util.Date date= new java.util.Date(); + + TreeSearchResults treeResults = searchResults(request).convertToTrees(); + + String fileName = "TB" + date.getTime(); + StringBuilder builder = new StringBuilder(); + + if ( getFormat(request) == FORMAT_NEXML ) { + Document doc = DocumentFactory.safeCreateDocument(); + NexmlDocumentWriter ndw = new NexmlDocumentWriter(null,getTaxonLabelHome(), doc); + ndw.fromTreeBaseToXml(treeResults); + builder.append(doc.getXmlString()); + } + else { + Set<PhyloTree> trees = treeResults.getResults(); + TreeBlock treeBlock = new TreeBlock(); + TaxonLabelSet taxonLabelSet = new TaxonLabelSet(); + + for (PhyloTree pTree : trees) { + for (TaxonLabel pTaxLabel : pTree.getTreeBlock().getTaxonLabelList()) { + if (! taxonLabelSet.getTaxonLabelsReadOnly().contains(pTaxLabel)) { + taxonLabelSet.addPhyloTaxonLabel(pTaxLabel); + } + } + treeBlock.addPhyloTree(pTree); + } + + treeBlock.setTaxonLabelSet(taxonLabelSet); + taxonLabelSet.setTitle("TB" + date.getTime()); + + + builder.append("#NEXUS\n\n"); + + taxonLabelSet.buildNexusBlockTaxa(builder, true, false); + + treeBlock.generateAFileDynamically(builder); + fileName += ".nex"; + } + + String downloadDirName = request.getSession().getServletContext().getRealPath( + TreebaseUtil.FILESEP + "NexusFileDownload") + + TreebaseUtil.FILESEP + request.getRemoteUser(); + + + File file = new File(downloadDirName + TreebaseUtil.FILESEP + fileName); + FileWriter out = new FileWriter(file); + out.write(builder.toString()); + out.close(); + + if ( getFormat(request) == FORMAT_NEXML ) { + WebUtil.downloadFile(response, downloadDirName, fileName, mNexmlContentType); + } + else { + WebUtil.downloadFile(response, downloadDirName, fileName); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * + * @param request + * @return + */ + protected int getFormat (HttpServletRequest request) { + String requestedFormat = request.getParameter(mFormatParameter); + if ( null != requestedFormat ) { + if ( requestedFormat.equalsIgnoreCase("nexml") ) { + return FORMAT_NEXML; + } + else { + return FORMAT_NEXUS; // default + } + } + else { + return FORMAT_NEXUS; // default + } + } + + protected Properties getDefaultProperties(HttpServletRequest request) { + Properties properties = new Properties(); + + properties.setProperty("nexml.uri.base", TreebaseUtil.getPurlBase()); + return properties; + } + + /** + * + * @return + */ + public TaxonLabelHome getTaxonLabelHome() { + return mTaxonLabelHome; + } + + /** + * + * @param nexmlService + */ + public void setTaxonLabelHome(TaxonLabelHome taxonLabelHome) { + mTaxonLabelHome = taxonLabelHome; + } + protected ModelAndView searchResultsAsRDF (SearchResults<?> searchResults,HttpServletRequest request,CQLNode root, String schema, String original) throws UnsupportedEncodingException { //${baseURL} //${phyloWSPath} Modified: trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/TaxonSearchController.java =================================================================== --- trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/TaxonSearchController.java 2011-10-27 16:58:16 UTC (rev 974) +++ trunk/treebase-web/src/main/java/org/cipres/treebase/web/controllers/TaxonSearchController.java 2011-10-28 14:08:26 UTC (rev 975) @@ -409,7 +409,10 @@ Set<Taxon> queryResults = doCQLQuery(root, new HashSet<Taxon>(),request); TaxonSearchResults tsr = new TaxonSearchResults(queryResults); saveSearchResults(request, tsr); - if ( TreebaseUtil.isEmpty(request.getParameter("format")) || ! request.getParameter("format").equals("rss1") ) { + if ( TreebaseUtil.isEmpty(request.getParameter("format")) || + (! request.getParameter("format").equals("rss1") && + ! request.getParameter("format").equals("nexus") && + ! request.getParameter("format").equals("nexml")) ) { return samePage(request); } else { @@ -428,7 +431,16 @@ } } this.saveSearchResults(request, res); - return this.searchResultsAsRDF(res, request, root,schema,"taxon"); + + if (schema.equals("tree") && + ( request.getParameter("format").equals("nexus") || + request.getParameter("format").equals("nexml") )) { + super.downloadAllTrees(request, response, errors); + return null; + } + else { + return this.searchResultsAsRDF(res, request, root,schema,"taxon"); + } } } Modified: trunk/treebase-web/src/main/webapp/WEB-INF/pages/search/searchResultsListControls.jsp =================================================================== --- trunk/treebase-web/src/main/webapp/WEB-INF/pages/search/searchResultsListControls.jsp 2011-10-27 16:58:16 UTC (rev 974) +++ trunk/treebase-web/src/main/webapp/WEB-INF/pages/search/searchResultsListControls.jsp 2011-10-28 14:08:26 UTC (rev 975) @@ -24,5 +24,8 @@ <input style="align: right;" type="submit" id="discardResults" value="Discard All Results" onclick="confirmDiscard()"/> <a href="#" class="openHelp" onclick="openHelp('s+res+discard-these-results+btn')"><img class="iconButton" src="<fmt:message key="icons.help"/>" /></a> - + <c:if test="${resultSet.resultType == 'TREE'}"> + <input style="align: right;" type="submit" id="downloadAllTrees" value="Download All Trees" onclick="doAction('downloadAllTrees')"/> + <a href="#" class="openHelp" onclick="openHelp('s+res+download-all-treess+btn')"><img class="iconButton" src="<fmt:message key="icons.help"/>" /></a> + </c:if> </c:if> Modified: trunk/treebase-web/src/main/webapp/WEB-INF/treebase-servlet.xml =================================================================== --- trunk/treebase-web/src/main/webapp/WEB-INF/treebase-servlet.xml 2011-10-27 16:58:16 UTC (rev 974) +++ trunk/treebase-web/src/main/webapp/WEB-INF/treebase-servlet.xml 2011-10-28 14:08:26 UTC (rev 975) @@ -749,7 +749,8 @@ <property name="commandName"><value>search</value></property> <property name="commandClass"><value>org.cipres.treebase.web.model.SearchCommand</value></property> <property name="taxonLabelService"><ref bean="taxonLabelService"></ref></property> - <property name="searchService"><ref bean="searchService"></ref></property> + <property name="searchService"><ref bean="searchService"></ref></property> + <property name="taxonLabelHome"><ref bean="taxonLabelHome"></ref></property> </bean> <!-- bean id="mainSearchController" parent="searchController" class="org.cipres.treebase.web.controllers.MainSearchController"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |