Changeset 528


Ignore:
Timestamp:
Jan 9, 2008, 11:25:17 AM (13 years ago)
Author:
mbayer
Message:

file mappings now fully implemented on UI side -- still need to pick up mappings in the actual plugin though

Location:
branches/uk_ac_ebi_Tab2MageImporter
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/uk_ac_ebi_Tab2MageImporter/jsp/uk/ac/ebi/nugo/plugins/experiment.jsp

    r525 r528  
    120120
    121121<h1>Tab2MAGE Importer -- Your Experiment</h1>
    122 Page 1 of 3
     122Page 1 of 4
    123123<p>
    124124
  • branches/uk_ac_ebi_Tab2MageImporter/jsp/uk/ac/ebi/nugo/plugins/hybridizations.jsp

    r527 r528  
    8888<input type="hidden" name="ID" value="<%=ID%>"> <input type="hidden" name="cmd" value="SetParameters">
    8989<input type="hidden"name="requestID" value="<%=requestID%>">
    90 <!-- these are the parameters from the input pages; need to pick them up individually from the bean here; ugly as hell but can't be done any other way -->
    91 <input type="hidden" name="parameter:domain" value="<%=inputDataBean.getDomain()%>">
    92 <input type="hidden" name="parameter:accession" value="<%=inputDataBean.getAccession()%>">
    93 <input type="hidden" name="parameter:qualityControl" value="<%=inputDataBean.getQualityControl()%>">
    94 <input type="hidden" name="parameter:experimentalDesign" value="<%=inputDataBean.getExperimentalDesign()%>">
    95 <input type="hidden" name="parameter:experimentName" value="<%=inputDataBean.getExperimentName()%>">
    96 <input type="hidden" name="parameter:description" value="<%=inputDataBean.getDescription()%>">
    97 <input type="hidden" name="parameter:releaseDate" value="<%=inputDataBean.getReleaseDate()%>">
    98 <input type="hidden" name="parameter:submissionDate" value="<%=inputDataBean.getSubmissionDate()%>">
    99 <input type="hidden" name="parameter:submitter" value="<%=inputDataBean.getSubmitter()%>">
    100 <input type="hidden" name="parameter:organization" value="<%=inputDataBean.getOrganization()%>">
    101 <input type="hidden" name="parameter:publicationTitle" value="<%=inputDataBean.getPublicationTitle()%>">
    102 <input type="hidden" name="parameter:authors" value="<%=inputDataBean.getAuthors()%>">
    103 <input type="hidden" name="parameter:journal" value="<%=inputDataBean.getJournal()%>">
    104 <input type="hidden" name="parameter:volume" value="<%=inputDataBean.getVolume()%>">
    105 <input type="hidden" name="parameter:issue" value="<%=inputDataBean.getIssue()%>">
    106 <input type="hidden" name="parameter:pages" value="<%=inputDataBean.getPages()%>">
    107 <input type="hidden" name="parameter:year" value="<%=inputDataBean.getYear()%>">
    108 <input type="hidden" name="parameter:pubmedId" value="<%=inputDataBean.getPubmedId()%>">
    109 <input type="hidden" name="parameter:treatmentProtocol" value="<%=inputDataBean.getTreatmentProtocol()%>">
    110 <input type="hidden" name="parameter:extractionProtocol" value="<%=inputDataBean.getExtractionProtocol()%>">
    111 <input type="hidden" name="parameter:labelingProtocol" value="<%=inputDataBean.getLabelingProtocol()%>">
    112 <input type="hidden" name="parameter:hybridizationProtocol" value="<%=inputDataBean.getHybridizationProtocol()%>">
    113 <input type="hidden" name="parameter:scanningProtocol" value="<%=inputDataBean.getScanningProtocol()%>">
    114 <input type="hidden" name="parameter:treatmentProtocolParams" value="<%=inputDataBean.getTreatmentProtocolParams()%>">
    115 <input type="hidden" name="parameter:extractionProtocolParams" value="<%=inputDataBean.getExtractionProtocolParams()%>">
    116 <input type="hidden" name="parameter:labelingProtocolParams" value="<%=inputDataBean.getLabelingProtocolParams()%>">
    117 <input type="hidden" name="parameter:hybridizationProtocolParams" value="<%=inputDataBean.getHybridizationProtocolParams()%>">
    118 <input type="hidden" name="parameter:scanningProtocolParams" value="<%=inputDataBean.getScanningProtocolParams()%>">
    119 <input type="hidden" name="parameter:experimentId" value="<%=inputDataBean.getExperimentId()%>">
    12090
    12191<input type="hidden" name="file_id" value="">
    122 <input type="hidden" name="parameter:zipFile" value=""  id="zipFile">
     92<input type="hidden" name="zipFile" value=""  id="zipFile">
    12393
    12494<h1>Tab2MAGE Importer -- Your Hybridizations</h1>
    125 Page 3 of 3
     95Page 3 of 4
    12696<p>
    12797<!--  table with the input form -->
     
    131101  <tr >
    132102    <td class="boldText">Microarray platform:</td>
    133     <td class="input"><select name="platform">
     103    <td class="input">
     104    <select name="platform">
    134105    <option >Affymetrix</option>
    135106    <option >Agilent</option>
  • branches/uk_ac_ebi_Tab2MageImporter/jsp/uk/ac/ebi/nugo/plugins/mappings.jsp

    r527 r528  
    1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    2   pageEncoding="ISO-8859-1"%>
     1<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    32<%@ page import="java.util.*"%>
     3<%@ page import="java.util.zip.*"%>
    44<%@ page import="net.sf.basedb.core.*"%>
    55<%@ page import="net.sf.basedb.clients.web.*"%>
     
    77<%@ page import="uk.ac.ebi.nugo.plugins.*"%>
    88
    9 <jsp:useBean id="inputDataBean" class="uk.ac.ebi.nugo.plugins.DataBean"
    10   scope="application" />
     9<jsp:useBean id="inputDataBean" class="uk.ac.ebi.nugo.plugins.DataBean" scope="application" />
    1110<!-- submits the form data back to the bean assuming that each form element is matched to a variable in the bean by the same name -->
    1211<jsp:setProperty name="inputDataBean" property="*" />
     
    2221<head>
    2322
    24 <link rel="stylesheet" type="text/css"
    25   href="<%= request.getContextPath()%>/plugins/uk/ac/ebi/nugo/plugins/styles.css" />
    26 <link rel="stylesheet" type="text/css"
    27   href="/base/include/styles/main.css">
    28 <link rel="stylesheet" type="text/css"
    29   href="/base/include/styles/size_m.css">
    30 
    31 <script language="JavaScript"
    32   src="<%= request.getContextPath()%>/include/scripts/main.js"
    33   type="text/javascript"></script>
     23<link rel="stylesheet" type="text/css" href="<%= request.getContextPath()%>/plugins/uk/ac/ebi/nugo/plugins/styles.css" />
     24<link rel="stylesheet" type="text/css" href="/base/include/styles/main.css">
     25<link rel="stylesheet" type="text/css" href="/base/include/styles/size_m.css">
     26
     27<script language="JavaScript" src="<%= request.getContextPath()%>/include/scripts/main.js" type="text/javascript"></script>
    3428<script language="JavaScript" type="text/javascript">
    3529  //submits form
     
    5246<body>
    5347
     48
     49
     50<form name="mappings" action="<%= request.getContextPath()%>/common/plugin/index.jsp" method="post">
     51
     52<input type="hidden" name="ID" value="<%=ID%>">
     53<input type="hidden" name="cmd" value="SetParameters"> <input type="hidden" name="requestID" value="<%=requestID%>">
     54
     55<!-- these are the parameters from the input pages; need to pick them up individually from the bean here; ugly as hell but can't be done any other way -->
     56
     57<!-- inputs from experiment.jsp page -->
     58<input type="hidden" name="parameter:domain" value="<%=inputDataBean.getDomain()%>">
     59<input type="hidden" name="parameter:accession" value="<%=inputDataBean.getAccession()%>">
     60<input type="hidden" name="parameter:qualityControl" value="<%=inputDataBean.getQualityControl()%>">
     61<input type="hidden" name="parameter:experimentalDesign" value="<%=inputDataBean.getExperimentalDesign()%>">
     62<input type="hidden" name="parameter:experimentName" value="<%=inputDataBean.getExperimentName()%>">
     63<input type="hidden" name="parameter:description" value="<%=inputDataBean.getDescription()%>">
     64<input type="hidden" name="parameter:releaseDate" value="<%=inputDataBean.getReleaseDate()%>">
     65<input type="hidden" name="parameter:submissionDate" value="<%=inputDataBean.getSubmissionDate()%>">
     66<input type="hidden" name="parameter:submitter" value="<%=inputDataBean.getSubmitter()%>">
     67<input type="hidden" name="parameter:organization" value="<%=inputDataBean.getOrganization()%>">
     68<input type="hidden" name="parameter:publicationTitle" value="<%=inputDataBean.getPublicationTitle()%>">
     69<input type="hidden" name="parameter:authors" value="<%=inputDataBean.getAuthors()%>">
     70<input type="hidden" name="parameter:journal" value="<%=inputDataBean.getJournal()%>">
     71<input type="hidden" name="parameter:volume" value="<%=inputDataBean.getVolume()%>">
     72<input type="hidden" name="parameter:issue" value="<%=inputDataBean.getIssue()%>">
     73<input type="hidden" name="parameter:pages" value="<%=inputDataBean.getPages()%>">
     74<input type="hidden" name="parameter:year" value="<%=inputDataBean.getYear()%>">
     75<input type="hidden" name="parameter:pubmedId" value="<%=inputDataBean.getPubmedId()%>">
     76<input type="hidden" name="parameter:experimentId" value="<%=inputDataBean.getExperimentId()%>">
     77<!-- inputs from protocols.jsp page -->
     78<input type="hidden" name="parameter:treatmentProtocol" value="<%=inputDataBean.getTreatmentProtocol()%>">
     79<input type="hidden" name="parameter:extractionProtocol" value="<%=inputDataBean.getExtractionProtocol()%>">
     80<input type="hidden" name="parameter:labelingProtocol" value="<%=inputDataBean.getLabelingProtocol()%>">
     81<input type="hidden" name="parameter:hybridizationProtocol" value="<%=inputDataBean.getHybridizationProtocol()%>">
     82<input type="hidden" name="parameter:scanningProtocol" value="<%=inputDataBean.getScanningProtocol()%>">
     83<input type="hidden" name="parameter:treatmentProtocolParams" value="<%=inputDataBean.getTreatmentProtocolParams()%>">
     84<input type="hidden" name="parameter:extractionProtocolParams" value="<%=inputDataBean.getExtractionProtocolParams()%>">
     85<input type="hidden" name="parameter:labelingProtocolParams" value="<%=inputDataBean.getLabelingProtocolParams()%>">
     86<input type="hidden" name="parameter:hybridizationProtocolParams" value="<%=inputDataBean.getHybridizationProtocolParams()%>">
     87<input type="hidden" name="parameter:scanningProtocolParams" value="<%=inputDataBean.getScanningProtocolParams()%>">
     88<!-- inputs from hybridizations.jsp page -->
     89<input type="hidden" name="parameter:platform" value="<%=inputDataBean.getPlatform()%>">
     90<input type="hidden" name="parameter:organism" value="<%=inputDataBean.getOrganism()%>">
     91<input type="hidden" name="parameter:numDesigns" value="<%=inputDataBean.getNumDesigns()%>">
     92<input type="hidden" name="parameter:dyeSwap" value="<%=inputDataBean.getDyeSwap()%>">
     93<input type="hidden" name="parameter:refSample" value="<%=inputDataBean.getRefSample()%>">
     94<input type="hidden" name="parameter:numTreatmentGroups" value="<%=inputDataBean.getNumTreatmentGroups()%>">
     95<input type="hidden" name="parameter:expFactors" value="<%=inputDataBean.getExpFactors()%>">
     96<input type="hidden" name="parameter:numReplicates" value="<%=inputDataBean.getNumReplicates()%>">
     97<input type="hidden" name="parameter:tissues" value="<%=inputDataBean.getTissues()%>">
     98<input type="hidden" name="parameter:pooling" value="<%=inputDataBean.getPooling()%>">
     99<input type="hidden" name="file_id" value="<%=(String)request.getAttribute("file_id") %>">
     100<input type="hidden" name="parameter:zipFile" value="<%=(String)request.getParameter("path") %>" id="zipFile">
     101
    54102<%
     103  System.out.println("all parameter values in mappings.jsp:");
     104  for (java.util.Enumeration e = request.getParameterNames(); e.hasMoreElements();)
     105  {
     106    String name = (String) e.nextElement();
     107    String value = request.getParameter(name);
     108    System.out.println("parameter " + name + " = " + value);
     109  }
     110
    55111  //first extract the factor names and the possible values
    56   String expFactors = inputDataBean.getExpFactors();
     112  String expFactors = inputDataBean.getExpFactors().trim();
    57113  String[] rawFactors = expFactors.split("\n");
    58114
     
    66122    factorNames[i] = factorName;
    67123    //extract the possible values from between the parentheses
    68     String allValues = rawFactors[i].substring(rawFactors[i].indexOf("(") + 1, rawFactors[i].indexOf(")"));
     124    String allValues = rawFactors[i].substring(rawFactors[i].indexOf("(") + 1,
     125        rawFactors[i].indexOf(")"));
    69126    String[] values = allValues.split(",");
    70127    factorValues[i] = values;
    71128  }
    72129
     130  //here we get hold of the cartesian product of all the factor values
    73131  String[][] products = CartesianProduct.getCartesianProduct(factorValues);
     132
     133  //now inspect the content of the zip file and list all the individual files therein
     134
     135  //first parse the filepath from the input page 
     136  String zipFilePath = (String) request.getParameter("path");
     137  String zipFileDirStr = zipFilePath.substring(0, zipFilePath.lastIndexOf("/"));
     138  String zipFileName = zipFilePath.substring(zipFilePath.lastIndexOf("/")+1);
     139
     140  //get hold of the appropriate BASE objects for this
     141  DbControl dc = sc.newDbControl();
     142  Directory zipFileDir = Directory.getByPath(dc, new Path(zipFileDirStr, Path.Type.DIRECTORY));
     143  File zipFile = File.getFile(dc, zipFileDir, zipFileName, false);
     144
     145  //now inspect the file content and store the names in the List
     146  Vector<String> fileNames = new Vector<String>();
     147  ZipInputStream zipStream = new ZipInputStream(zipFile.getDownloadStream(0));
     148  ZipEntry entry = zipStream.getNextEntry();
     149  while (entry != null)
     150  {
     151    fileNames.add(entry.getName());
     152    entry = zipStream.getNextEntry();
     153  }
     154 
     155  String [] fileNamesArr = new String[fileNames.size()];
     156  fileNames.toArray(fileNamesArr);
     157  Arrays.sort(fileNamesArr);
     158 
     159  dc.close();
    74160%>
    75161
    76 <form name="mappings"
    77   action="<%= request.getContextPath()%>/plugins/uk/ac/ebi/nugo/plugins/mappings.jsp"
    78   method="post"><input type="hidden" name="ID" value="<%=ID%>">
    79 <input type="hidden" name="cmd" value="SetParameters"> <input
    80   type="hidden" name="requestID" value="<%=requestID%>"> <!-- these are the parameters from the input pages; need to pick them up individually from the bean here; ugly as hell but can't be done any other way -->
    81 
    82 <!-- inputs from experiment.jsp page --> <input type="hidden"
    83   name="parameter:domain" value="<%=inputDataBean.getDomain()%>">
    84 <input type="hidden" name="parameter:accession"
    85   value="<%=inputDataBean.getAccession()%>"> <input type="hidden"
    86   name="parameter:qualityControl"
    87   value="<%=inputDataBean.getQualityControl()%>"> <input
    88   type="hidden" name="parameter:experimentalDesign"
    89   value="<%=inputDataBean.getExperimentalDesign()%>"> <input
    90   type="hidden" name="parameter:experimentName"
    91   value="<%=inputDataBean.getExperimentName()%>"> <input
    92   type="hidden" name="parameter:description"
    93   value="<%=inputDataBean.getDescription()%>"> <input
    94   type="hidden" name="parameter:releaseDate"
    95   value="<%=inputDataBean.getReleaseDate()%>"> <input
    96   type="hidden" name="parameter:submissionDate"
    97   value="<%=inputDataBean.getSubmissionDate()%>"> <input
    98   type="hidden" name="parameter:submitter"
    99   value="<%=inputDataBean.getSubmitter()%>"> <input type="hidden"
    100   name="parameter:organization"
    101   value="<%=inputDataBean.getOrganization()%>"> <input
    102   type="hidden" name="parameter:publicationTitle"
    103   value="<%=inputDataBean.getPublicationTitle()%>"> <input
    104   type="hidden" name="parameter:authors"
    105   value="<%=inputDataBean.getAuthors()%>"> <input type="hidden"
    106   name="parameter:journal" value="<%=inputDataBean.getJournal()%>">
    107 <input type="hidden" name="parameter:volume"
    108   value="<%=inputDataBean.getVolume()%>"> <input type="hidden"
    109   name="parameter:issue" value="<%=inputDataBean.getIssue()%>"> <input
    110   type="hidden" name="parameter:pages"
    111   value="<%=inputDataBean.getPages()%>"> <input type="hidden"
    112   name="parameter:year" value="<%=inputDataBean.getYear()%>"> <input
    113   type="hidden" name="parameter:pubmedId"
    114   value="<%=inputDataBean.getPubmedId()%>"> <input type="hidden"
    115   name="parameter:experimentId"
    116   value="<%=inputDataBean.getExperimentId()%>"> <!-- inputs from protocols.jsp page -->
    117 <input type="hidden" name="parameter:treatmentProtocol"
    118   value="<%=inputDataBean.getTreatmentProtocol()%>"> <input
    119   type="hidden" name="parameter:extractionProtocol"
    120   value="<%=inputDataBean.getExtractionProtocol()%>"> <input
    121   type="hidden" name="parameter:labelingProtocol"
    122   value="<%=inputDataBean.getLabelingProtocol()%>"> <input
    123   type="hidden" name="parameter:hybridizationProtocol"
    124   value="<%=inputDataBean.getHybridizationProtocol()%>"> <input
    125   type="hidden" name="parameter:scanningProtocol"
    126   value="<%=inputDataBean.getScanningProtocol()%>"> <input
    127   type="hidden" name="parameter:treatmentProtocolParams"
    128   value="<%=inputDataBean.getTreatmentProtocolParams()%>"> <input
    129   type="hidden" name="parameter:extractionProtocolParams"
    130   value="<%=inputDataBean.getExtractionProtocolParams()%>"> <input
    131   type="hidden" name="parameter:labelingProtocolParams"
    132   value="<%=inputDataBean.getLabelingProtocolParams()%>"> <input
    133   type="hidden" name="parameter:hybridizationProtocolParams"
    134   value="<%=inputDataBean.getHybridizationProtocolParams()%>"> <input
    135   type="hidden" name="parameter:scanningProtocolParams"
    136   value="<%=inputDataBean.getScanningProtocolParams()%>"> <!-- inputs from hybridizations.jsp page -->
    137 <input type="hidden" name="parameter:platform"
    138   value="<%=inputDataBean.getPlatform()%>"> <input type="hidden"
    139   name="parameter:organism" value="<%=inputDataBean.getOrganism()%>">
    140 <input type="hidden" name="parameter:numDesigns"
    141   value="<%=inputDataBean.getNumDesigns()%>"> <input
    142   type="hidden" name="parameter:dyeSwap"
    143   value="<%=inputDataBean.getDyeSwap()%>"> <input type="hidden"
    144   name="parameter:refSample" value="<%=inputDataBean.getRefSample()%>">
    145 <input type="hidden" name="parameter:numTreatmentGroups"
    146   value="<%=inputDataBean.getNumTreatmentGroups()%>"> <input
    147   type="hidden" name="parameter:expFactors"
    148   value="<%=inputDataBean.getExpFactors()%>"> <input
    149   type="hidden" name="parameter:numReplicates"
    150   value="<%=inputDataBean.getNumReplicates()%>"> <input
    151   type="hidden" name="parameter:tissues"
    152   value="<%=inputDataBean.getTissues()%>"> <input type="hidden"
    153   name="parameter:pooling" value="<%=inputDataBean.getPooling()%>">
    154 
    155 <input type="hidden" name="file_id"
    156   value="<%=(String)request.getAttribute("file_id") %>"> <input
    157   type="hidden" name="parameter:zipFile"
    158   value="<%=(String)request.getAttribute("path") %>" id="zipFile">
    159 
    160 <table>
    161 
     162<h1>Tab2MAGE Importer -- File Mappings</h1>
     163Page 4 of 4
     164<p>
     165
     166The table below holds a list of all possible factor value combinations used in your experiment.
     167Please select, for each combination, the appropriate file name from the drop down menu.</p><p>
     168
     169<!-- this table holds the combinations of factor values -->
     170
     171<table align="center" cellpadding="15">
     172
     173  <!-- column header row factor names -->
     174
     175  <tr>
     176
     177    <!-- file selector header -->
     178    <td class="header"><h3>File</h3></td>
     179
     180    <!-- factor names -->
     181    <%
     182      for (int i = 0; i < products[i].length; i++)
     183      {
     184    %>
     185    <td class="header"><h3><%=factorNames[i]%></h3></td>
     186    <%
     187    }
     188    %>
     189  </tr>
     190
     191  <!-- now add as many rows as we have discrete combinations of factor values -->
    162192
    163193  <%
     
    168198  <tr>
    169199
     200    <!-- first we need a cell with a drop down menu where we can select a filename to match the combination of factor values-->
     201
     202    <td class="input" name="fileinput<%=i %>"><select>
     203      <%
     204          for (int k = 0; k < fileNamesArr.length; k++)
     205          {
     206      %>
     207
     208      <option><%=fileNamesArr[k]%></option>
     209
     210      <%
     211      }
     212      %>
     213    </select></td>
     214
     215<!-- now print the values of this factor value combination, each in a separate cell -->
    170216    <%
    171217        for (int j = 0; j < products[i].length; j++)
    172218        {
    173219    %>
    174     <td><%=products[i][j]%></td>
     220    <td class="border"><%=products[i][j]%></td>
    175221    <%
    176222    }
     
    185231
    186232</table>
     233
     234<p>
     235
     236  <table align="center" class="noBorder" cellspacing="5"  cellpadding="5">
     237  <tr class="noBorder">
     238    <td id="next" width="50%" style="border-style: none;"><div class="buttons" onmouseover="this.className='buttons_hover';" onmouseout="this.className='buttons';" onclick="submit()"><div class="buttons_inner"><table  class="noBorder" cellspacing="0" cellpadding="0"><tr  class="noBorder"><td style="border-style: none;"><img src="/base/images/gonext.gif" border="0"></td><td style="border-style: none;">Start Import</td></tr></table></div></div></td>
     239    <td id="close" width="50%" style="border-style: none;"><div class="buttons" onmouseover="this.className='buttons_hover';" onmouseout="this.className='buttons';" onclick="window.close()"><div class="buttons_inner"><table  class="noBorder" cellspacing="0" cellpadding="0"><tr  class="noBorder"><td style="border-style: none;"><img src="/base/images/cancel.gif" border="0"></td><td style="border-style: none;">Cancel</td></tr></table></div></div></td>  </tr>
     240  </table>
     241
     242
     243</form>
     244
    187245</body>
    188246</html>
  • branches/uk_ac_ebi_Tab2MageImporter/jsp/uk/ac/ebi/nugo/plugins/protocols.jsp

    r525 r528  
    122122
    123123<h1>Tab2MAGE Importer -- Your Protocols</h1>
    124 Page 2 of 3
     124Page 2 of 4
    125125<p>
    126126<table cellpadding="10">
  • branches/uk_ac_ebi_Tab2MageImporter/jsp/uk/ac/ebi/nugo/plugins/styles.css

    r524 r528  
    2727  align: left;
    2828  border-top: 1px solid #6E94B7;
     29}
     30
     31td.border {
     32  vertical-align: middle;
     33  text-align: center;
     34  align: center;
     35  border-color: #6E94B7;
     36  border-style: solid;
     37  border-width: 1px;
    2938}
    3039
     
    7079  vertical-align: top;
    7180  background-color: #F9F7F0;
     81  text-align: center;
    7282}
    7383
  • branches/uk_ac_ebi_Tab2MageImporter/src/uk/ac/ebi/nugo/plugins/CartesianProduct.java

    r527 r528  
    4444      }
    4545    }
    46    
    47     for (int i = 0; i < products.length; i++)
    48     {
    49       for (int j = 0; j < products[i].length; j++)
    50       {
    51         System.out.print(products[i][j] + " ");
    52       }
    53       System.out.println();
    54     }
    55    
     46       
    5647    return products;
    5748  }
Note: See TracChangeset for help on using the changeset viewer.