Changeset 4825
- Timestamp:
- Mar 20, 2009, 3:41:22 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/clients/web/net/sf/basedb/clients/web/servlet/PlotServlet.java
r4548 r4825 48 48 import net.sf.basedb.clients.web.util.HTML; 49 49 import net.sf.basedb.util.BioAssaySetUtil; 50 import net.sf.basedb.util.FileUtil; 51 import net.sf.basedb.util.StaticCache; 50 52 import net.sf.basedb.util.Values; 51 53 import net.sf.basedb.util.formatter.Formatter; … … 64 66 import javax.servlet.http.HttpServletResponse; 65 67 68 import org.apache.commons.io.output.TeeOutputStream; 66 69 import org.jfree.chart.JFreeChart; 67 70 import org.jfree.chart.renderer.xy.XYStepRenderer; … … 75 78 import java.awt.image.BufferedImage; 76 79 import java.awt.image.RenderedImage; 80 import java.io.InputStream; 77 81 import java.io.OutputStream; 78 82 import java.io.IOException; … … 289 293 private int defaultHeight = 400; 290 294 private String defaultFormat = "png"; 291 295 private String cacheBase = "plots/"; 296 292 297 public void init() 293 298 throws ServletException … … 299 304 defaultHeight = Values.getInt(cfg.getInitParameter("defaultHeight"), defaultHeight); 300 305 defaultFormat = Values.getString(cfg.getInitParameter("defaultFormat"), defaultFormat); 306 cacheBase = Values.getString(cfg.getInitParameter("cacheBase"), cacheBase); 301 307 } 302 308 … … 311 317 final int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id")); 312 318 final String type = Values.getString(request.getParameter("type"), "scatter"); 313 319 String cacheKey = Values.getStringOrNull(request.getParameter("cache")); 320 314 321 // Where to deliver the image 315 322 final boolean download = Values.getBoolean(request.getParameter("download")); … … 358 365 Values.getStringOrNull(request.getParameter("hiloAggregate")); 359 366 360 367 InputStream cachedImageIn = null; 368 OutputStream cachedImageOut = null; 361 369 RenderedImage image = null; 362 370 DbControl dc = null; 363 371 boolean wasError = false; 364 372 try 365 373 { 366 final SessionControl sc = Application.getSessionControl(ID, request.getRemoteAddr()); 367 dc = sc.newDbControl(); 368 BioAssay ba = bioAssayId == 0 ? null : BioAssay.getById(dc, bioAssayId); 369 BioAssaySet bas = ba == null ? BioAssaySet.getById(dc, bioAssaySetId) : ba.getBioAssaySet(); 374 if (cacheKey != null) 375 { 376 cacheKey = cacheBase + cacheKey; 377 StaticCache cache = Application.getStaticCache(); 378 try 379 { 380 cachedImageIn = cache.read(cacheKey); 381 if (cachedImageIn == null) 382 { 383 cachedImageOut = cache.write(cacheKey); 384 } 385 } 386 catch (IOException ex) 387 { 388 ex.printStackTrace(); 389 } 390 } 391 try 392 { 393 if (cachedImageIn == null) 394 { 395 // Only reload the image if there is no cached version 396 final SessionControl sc = Application.getSessionControl(ID, request.getRemoteAddr()); 397 dc = sc.newDbControl(); 398 BioAssay ba = bioAssayId == 0 ? null : BioAssay.getById(dc, bioAssayId); 399 BioAssaySet bas = ba == null ? BioAssaySet.getById(dc, bioAssaySetId) : ba.getBioAssaySet(); 400 401 JFreeChart chart = null; 402 if ("cfplot".equals(type)) 403 { 404 chart = generateCFPlot(ba, xLabel, yLabel); 405 } 406 else 407 { 408 // Get the query 409 DynamicSpotQuery query = ba != null ? ba.getSpotData() : bas.getSpotData(); 410 query.setAutoJoinType(JoinType.INNER); 411 412 // Filter 413 Restriction filter = filterFormula == null ? 414 null : BioAssaySetUtil.createJepRestriction(dc, bas, filterFormula, false); 415 416 // Convert formulas to Expression:s 417 Expression[] x = xFormulas == null ? null : new Expression[xFormulas.length]; 418 Expression[] y = yFormulas == null ? null : new Expression[yFormulas.length]; 419 420 if (xFormulas != null) 421 { 422 for (int i = 0; i < xFormulas.length; ++i) 423 { 424 x[i] = BioAssaySetUtil.createJepExpression(dc, bas, xFormulas[i], false); 425 if (xLog) x[i] = Expressions.log2(x[i]); 426 } 427 } 428 if (yFormulas != null) 429 { 430 for (int i = 0; i < yFormulas.length; ++i) 431 { 432 y[i] = BioAssaySetUtil.createJepExpression(dc, bas, yFormulas[i], false); 433 if (yLog) y[i] = Expressions.log2(y[i]); 434 } 435 } 370 436 371 JFreeChart chart = null; 372 if ("cfplot".equals(type)) 373 { 374 chart = generateCFPlot(ba, xLabel, yLabel); 375 } 376 else 377 { 378 // Get the query 379 DynamicSpotQuery query = ba != null ? ba.getSpotData() : bas.getSpotData(); 380 query.setAutoJoinType(JoinType.INNER); 381 382 // Filter 383 Restriction filter = filterFormula == null ? 384 null : BioAssaySetUtil.createJepRestriction(dc, bas, filterFormula, false); 385 386 // Convert formulas to Expression:s 387 Expression[] x = xFormulas == null ? null : new Expression[xFormulas.length]; 388 Expression[] y = yFormulas == null ? null : new Expression[yFormulas.length]; 389 390 if (xFormulas != null) 391 { 392 for (int i = 0; i < xFormulas.length; ++i) 393 { 394 x[i] = BioAssaySetUtil.createJepExpression(dc, bas, xFormulas[i], false); 395 if (xLog) x[i] = Expressions.log2(x[i]); 396 } 397 } 398 if (yFormulas != null) 399 { 400 for (int i = 0; i < yFormulas.length; ++i) 401 { 402 y[i] = BioAssaySetUtil.createJepExpression(dc, bas, yFormulas[i], false); 403 if (yLog) y[i] = Expressions.log2(y[i]); 404 } 405 } 406 407 // Get annotations 408 Collection<PlotAnnotation> annotations = null; 409 if (hasAnnotation) 410 { 411 annotations = new TreeSet<PlotAnnotation>(); 412 List<BioAssay> bioAssays = bas.getBioAssays().list(dc); 413 annotationSelect = Dynamic.select(VirtualColumn.COLUMN); 414 if ("bioassay".equals(annotation)) 415 { 416 for (BioAssay bioAssay : bioAssays) 437 // Get annotations 438 Collection<PlotAnnotation> annotations = null; 439 if (hasAnnotation) 417 440 { 418 annotations.add(new PlotAnnotation(bioAssay.getName(), 419 Collections.singleton(new Integer(bioAssay.getDataCubeColumnNo())))); 420 } 421 } 422 else if (annotation.matches("\\d+")) 423 { 424 int annotationTypeId = Values.getInt(annotation); 425 AnnotationType at = AnnotationType.getById(dc, annotationTypeId); 426 Map<Set<?>, List<Integer>> groups = new HashMap<Set<?>, List<Integer>>(); 427 Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType()); 428 if (at.supportUnits()) formatter = at.getDefaultUnit().getFormatter(formatter); 429 for (BioAssay bioAssay : bioAssays) 430 { 431 Set<?> values = BioAssaySetUtil.getAnnotationValues(dc, bioAssay, at); 432 if (!groups.containsKey(values)) 441 annotations = new TreeSet<PlotAnnotation>(); 442 List<BioAssay> bioAssays = bas.getBioAssays().list(dc); 443 annotationSelect = Dynamic.select(VirtualColumn.COLUMN); 444 if ("bioassay".equals(annotation)) 433 445 { 434 groups.put(values, new ArrayList<Integer>()); 446 for (BioAssay bioAssay : bioAssays) 447 { 448 annotations.add(new PlotAnnotation(bioAssay.getName(), 449 Collections.singleton(new Integer(bioAssay.getDataCubeColumnNo())))); 450 } 435 451 } 436 groups.get(values).add((int)bioAssay.getDataCubeColumnNo()); 437 } 438 for (Map.Entry<Set<?>, List<Integer>> entry : groups.entrySet()) 439 { 440 String name = Values.getString(entry.getKey(), ", ", true, formatter); 441 if (name == null || name.trim().equals("")) name = "null"; 442 annotations.add(new PlotAnnotation(name, entry.getValue())); 443 } 444 } 445 else if (annotation.startsWith("=")) 446 { 447 // JEP restriction 448 Restriction r = 449 BioAssaySetUtil.createJepRestriction(dc, bas, annotation.substring(1), false); 450 Expression e = Expressions.caseWhen(Expressions.integer(0), 451 new WhenStatement(r, Expressions.integer(1))); 452 annotationSelect = Selects.expression(e, "ann"); 453 annotations.add(new PlotAnnotation("", 0)); 454 annotations.add(new PlotAnnotation(annotation.substring(1), 1)); 455 } 456 else 457 { 458 Map<Set<Object>, List<Integer>> groups = new HashMap<Set<Object>, List<Integer>>(); 459 for (BioAssay bioAssay : bioAssays) 460 { 461 Set<Object> values = BioAssaySetUtil.getParentProperties(dc, bioAssay, annotation); 462 463 if (!groups.containsKey(values)) 452 else if (annotation.matches("\\d+")) 464 453 { 465 groups.put(values, new ArrayList<Integer>()); 454 int annotationTypeId = Values.getInt(annotation); 455 AnnotationType at = AnnotationType.getById(dc, annotationTypeId); 456 Map<Set<?>, List<Integer>> groups = new HashMap<Set<?>, List<Integer>>(); 457 Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType()); 458 if (at.supportUnits()) formatter = at.getDefaultUnit().getFormatter(formatter); 459 for (BioAssay bioAssay : bioAssays) 460 { 461 Set<?> values = BioAssaySetUtil.getAnnotationValues(dc, bioAssay, at); 462 if (!groups.containsKey(values)) 463 { 464 groups.put(values, new ArrayList<Integer>()); 465 } 466 groups.get(values).add((int)bioAssay.getDataCubeColumnNo()); 467 } 468 for (Map.Entry<Set<?>, List<Integer>> entry : groups.entrySet()) 469 { 470 String name = Values.getString(entry.getKey(), ", ", true, formatter); 471 if (name == null || name.trim().equals("")) name = "null"; 472 annotations.add(new PlotAnnotation(name, entry.getValue())); 473 } 466 474 } 467 groups.get(values).add((int)bioAssay.getDataCubeColumnNo()); 468 } 469 for (Map.Entry<Set<Object>, List<Integer>> entry : groups.entrySet()) 470 { 471 String name = Values.getString(entry.getKey(), ", ", true); 472 if (name == null || name.trim().equals("")) name = "null"; 473 annotations.add(new PlotAnnotation(name, entry.getValue())); 475 else if (annotation.startsWith("=")) 476 { 477 // JEP restriction 478 Restriction r = 479 BioAssaySetUtil.createJepRestriction(dc, bas, annotation.substring(1), false); 480 Expression e = Expressions.caseWhen(Expressions.integer(0), 481 new WhenStatement(r, Expressions.integer(1))); 482 annotationSelect = Selects.expression(e, "ann"); 483 annotations.add(new PlotAnnotation("", 0)); 484 annotations.add(new PlotAnnotation(annotation.substring(1), 1)); 485 } 486 else 487 { 488 Map<Set<Object>, List<Integer>> groups = new HashMap<Set<Object>, List<Integer>>(); 489 for (BioAssay bioAssay : bioAssays) 490 { 491 Set<Object> values = BioAssaySetUtil.getParentProperties(dc, bioAssay, annotation); 492 493 if (!groups.containsKey(values)) 494 { 495 groups.put(values, new ArrayList<Integer>()); 496 } 497 groups.get(values).add((int)bioAssay.getDataCubeColumnNo()); 498 } 499 for (Map.Entry<Set<Object>, List<Integer>> entry : groups.entrySet()) 500 { 501 String name = Values.getString(entry.getKey(), ", ", true); 502 if (name == null || name.trim().equals("")) name = "null"; 503 annotations.add(new PlotAnnotation(name, entry.getValue())); 504 } 505 506 } 474 507 } 475 508 476 } 477 } 478 479 if (filter != null) query.restrictPermanent(filter); 480 481 if ("scatter".equals(type)) 482 { 483 ScatterPlot plot = new ScatterPlot(xLabel, yLabel); 484 for (int i = 0; i < x.length; ++i) 485 { 486 query.reset(); 487 if (annotationSelect != null) 509 if (filter != null) query.restrictPermanent(filter); 510 511 if ("scatter".equals(type)) 488 512 { 489 query.select(annotationSelect); 490 } 491 query.select(Selects.expression(x[i], "x")); 492 query.select(Selects.expression(y[i], "y")); 493 if (hasAnnotation) 494 { 495 plot.addData(query.iterate(dc), annotations); 513 ScatterPlot plot = new ScatterPlot(xLabel, yLabel); 514 for (int i = 0; i < x.length; ++i) 515 { 516 query.reset(); 517 if (annotationSelect != null) 518 { 519 query.select(annotationSelect); 520 } 521 query.select(Selects.expression(x[i], "x")); 522 query.select(Selects.expression(y[i], "y")); 523 if (hasAnnotation) 524 { 525 plot.addData(query.iterate(dc), annotations); 526 } 527 else 528 { 529 plot.addData(query.iterate(dc), Integer.toString(i)); 530 } 531 } 532 chart = plot.getChart(); 496 533 } 497 534 else 498 535 { 499 plot.addData(query.iterate(dc), Integer.toString(i)); 536 HistogramPlot plot = new HistogramPlot(xLabel, yLabel, 537 hasAnnotation ? new XYStepRenderer() : null); 538 query.setReturnTotalCount(true); 539 for (int i = 0; i < x.length; ++i) 540 { 541 query.reset(); 542 if (annotationSelect != null) 543 { 544 query.select(annotationSelect); 545 } 546 query.select(Selects.expression(x[i], "x")); 547 if (!isCount) query.select(Selects.expression(y[i], "y")); 548 HistogramPlot.YAggregate ya = HistogramPlot.YAggregate.valueOf(yAggregate.toUpperCase()); 549 HistogramPlot.YAggregate hilo = hiloAggregate == null ? null : 550 HistogramPlot.YAggregate.valueOf(hiloAggregate.toUpperCase()); 551 if (hasAnnotation) 552 { 553 plot.addData(query.iterate(dc), annotations, binSize, ya, hilo); 554 } 555 else 556 { 557 plot.addData(query.iterate(dc), Integer.toString(i), binSize, ya, hilo); 558 } 559 } 560 chart = plot.getChart(); 500 561 } 501 562 } 502 chart = plot.getChart(); 503 } 504 else 505 { 506 HistogramPlot plot = new HistogramPlot(xLabel, yLabel, 507 hasAnnotation ? new XYStepRenderer() : null); 508 query.setReturnTotalCount(true); 509 for (int i = 0; i < x.length; ++i) 510 { 511 query.reset(); 512 if (annotationSelect != null) 563 564 if (title != null) chart.setTitle(title); 565 if (!hasAnnotation) chart.removeLegend(); 566 if (subTitle != null) chart.addSubtitle(new TextTitle(subTitle)); 567 image = chart.createBufferedImage(width, height); 568 } 569 570 // Store the image in the BASE file system 571 if (saveAs != null) 572 { 573 Path path = new Path(saveAs, Path.Type.FILE); 574 File f = File.getByPath(dc, path, true); 575 f.setMimeType("image/"+format); 576 577 if (f.isInDatabase()) 578 { 579 if (!overwrite) throw new ItemAlreadyExistsException("File[path="+saveAs+"]"); 580 } 581 else 582 { 583 dc.saveItem(f); 584 } 585 OutputStream out = f.getUploadStream(false); 586 if (cachedImageIn != null) 587 { 588 FileUtil.copy(cachedImageIn, out); 589 cachedImageIn.close(); 590 cachedImageIn = null; 591 } 592 else if (image != null) 593 { 594 if (cachedImageOut != null) 513 595 { 514 query.select(annotationSelect);596 out = new TeeOutputStream(cachedImageOut, out); 515 597 } 516 query.select(Selects.expression(x[i], "x")); 517 if (!isCount) query.select(Selects.expression(y[i], "y")); 518 HistogramPlot.YAggregate ya = HistogramPlot.YAggregate.valueOf(yAggregate.toUpperCase()); 519 HistogramPlot.YAggregate hilo = hiloAggregate == null ? null : 520 HistogramPlot.YAggregate.valueOf(hiloAggregate.toUpperCase()); 521 if (hasAnnotation) 598 ImageIO.write(image, format, out); 599 } 600 out.flush(); 601 out.close(); 602 dc.commit(); 603 image = null; 604 cachedImageOut = null; 605 } 606 } 607 catch (Throwable t) 608 { 609 wasError = true; 610 t.printStackTrace(); 611 if (saveAs == null) 612 { 613 // Generate error image 614 try 615 { 616 BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 617 Graphics2D graphics = img.createGraphics(); 618 graphics.setBackground(Color.WHITE); 619 graphics.clearRect(0, 0, width, height); 620 graphics.setColor(Color.RED); 621 FontRenderContext context = graphics.getFontRenderContext(); 622 623 Font topFont = new Font("SansSerif", Font.BOLD, 12); 624 Font stackTraceFont = new Font("SansSerif", Font.PLAIN, 12); 625 626 float x = .0f; 627 float y = .0f; 628 String causedBy = ""; 629 do 522 630 { 523 plot.addData(query.iterate(dc), annotations, binSize, ya, hilo); 524 } 525 else 526 { 527 plot.addData(query.iterate(dc), Integer.toString(i), binSize, ya, hilo); 528 } 529 } 530 chart = plot.getChart(); 531 } 532 } 533 534 if (title != null) chart.setTitle(title); 535 if (!hasAnnotation) chart.removeLegend(); 536 if (subTitle != null) chart.addSubtitle(new TextTitle(subTitle)); 537 image = chart.createBufferedImage(width, height); 538 539 if (saveAs != null) 540 { 541 Path path = new Path(saveAs, Path.Type.FILE); 542 File f = File.getByPath(dc, path, true); 543 f.setMimeType("image/"+format); 544 545 if (f.isInDatabase()) 546 { 547 if (!overwrite) throw new ItemAlreadyExistsException("File[path="+saveAs+"]"); 548 } 549 else 550 { 551 dc.saveItem(f); 552 } 553 OutputStream out = f.getUploadStream(false); 554 ImageIO.write(image, format, out); 555 out.flush(); 556 out.close(); 557 dc.commit(); 558 image = null; 559 } 560 } 561 catch (Throwable t) 562 { 563 t.printStackTrace(); 564 if (saveAs == null) 565 { 566 // Generate error image 567 try 568 { 569 BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 570 Graphics2D graphics = img.createGraphics(); 571 graphics.setBackground(Color.WHITE); 572 graphics.clearRect(0, 0, width, height); 573 graphics.setColor(Color.RED); 574 FontRenderContext context = graphics.getFontRenderContext(); 575 576 Font topFont = new Font("SansSerif", Font.BOLD, 12); 577 Font stackTraceFont = new Font("SansSerif", Font.PLAIN, 12); 578 579 float x = .0f; 580 float y = .0f; 581 String causedBy = ""; 582 do 583 { 584 graphics.setFont(topFont); 585 String msg = causedBy + t.getClass().getSimpleName() + ": " + t.getMessage(); 586 x = 5.0f; 587 Rectangle2D bounds = topFont.getStringBounds(msg, context); 588 y += bounds.getHeight()+5; 589 if (bounds.getWidth() > width - x) 590 { 591 msg = cutMiddle(msg, (width - x) / bounds.getWidth()); 592 } 593 graphics.drawString(msg, x, y); 594 595 graphics.setFont(stackTraceFont); 596 x = 15.0f; 597 for (StackTraceElement st : t.getStackTrace()) 598 { 599 msg = "at " + st.getClassName() + "." + st.getMethodName() + 600 ":" + st.getLineNumber(); 601 bounds = stackTraceFont.getStringBounds(msg, context); 602 y += bounds.getHeight(); 631 graphics.setFont(topFont); 632 String msg = causedBy + t.getClass().getSimpleName() + ": " + t.getMessage(); 633 x = 5.0f; 634 Rectangle2D bounds = topFont.getStringBounds(msg, context); 635 y += bounds.getHeight()+5; 603 636 if (bounds.getWidth() > width - x) 604 637 { … … 606 639 } 607 640 graphics.drawString(msg, x, y); 608 } 609 t = t.getCause(); 610 causedBy = "Caused by: "; 611 } while (t != null && y < height); 612 image = img; 613 } 614 catch (Throwable t2) 615 { 616 t2.printStackTrace(); 617 } 618 } 619 else 620 { 621 // Let servlet container redirect to appropriate error page 622 throw new ServletException(t); 623 } 624 } 625 finally 641 642 graphics.setFont(stackTraceFont); 643 x = 15.0f; 644 for (StackTraceElement st : t.getStackTrace()) 645 { 646 msg = "at " + st.getClassName() + "." + st.getMethodName() + 647 ":" + st.getLineNumber(); 648 bounds = stackTraceFont.getStringBounds(msg, context); 649 y += bounds.getHeight(); 650 if (bounds.getWidth() > width - x) 651 { 652 msg = cutMiddle(msg, (width - x) / bounds.getWidth()); 653 } 654 graphics.drawString(msg, x, y); 655 } 656 t = t.getCause(); 657 causedBy = "Caused by: "; 658 } while (t != null && y < height); 659 image = img; 660 } 661 catch (Throwable t2) 662 { 663 t2.printStackTrace(); 664 } 665 } 666 else 667 { 668 // Let servlet container redirect to appropriate error page 669 throw new ServletException(t); 670 } 671 } 672 673 if (image != null || cachedImageIn != null) 674 { 675 // Send image on HTTP response 676 if (download) 677 { 678 response.setHeader("Content-Disposition", "attachment;filename="+HTML.urlEncode(title)+"." + format); 679 } 680 response.setContentType("image/" + format); 681 response.setHeader("Cache-Control", "max-age=3600"); 682 OutputStream out = response.getOutputStream(); 683 if (cachedImageIn != null) 684 { 685 FileUtil.copy(cachedImageIn, out); 686 } 687 else if (image != null) 688 { 689 if (cachedImageOut != null && !wasError) 690 { 691 out = new TeeOutputStream(out, cachedImageOut); 692 } 693 ImageIO.write(image, format, out); 694 } 695 out.flush(); 696 out.close(); 697 } 698 else 699 { 700 if (saveAs != null) 701 { 702 // Image was save to BASE filesystem, redirect to close popup page 703 response.sendRedirect(request.getContextPath()+"/common/close_popup.jsp?message=Plot+saved+successfully"); 704 } 705 else 706 { 707 // Something went wrong when genering the error image - send redirect to a predefined image 708 response.sendRedirect(request.getContextPath() + "/images/plot_error.gif"); 709 } 710 } 711 } 712 finally 626 713 { 627 714 if (dc != null) dc.close(); 628 } 629 630 if (image != null) 631 { 632 if (download) 633 { 634 response.setHeader("Content-Disposition", "attachment;filename="+HTML.urlEncode(title)+"." + format); 635 } 636 response.setContentType("image/" + format); 637 response.setHeader("Cache-Control", "max-age=3600"); 638 OutputStream out = response.getOutputStream(); 639 ImageIO.write(image, format, out); 640 out.flush(); 641 out.close(); 642 } 643 else 644 { 645 if (saveAs != null) 646 { 647 // Image was save to BASE filesystem, redirect to close popup page 648 response.sendRedirect(request.getContextPath()+"/common/close_popup.jsp?message=Plot+saved+successfully"); 649 } 650 else 651 { 652 // Something went wrong when genering the error image - send redirect to a predefined image 653 response.sendRedirect(request.getContextPath() + "/images/plot_error.gif"); 654 } 715 if (cachedImageIn != null) cachedImageIn.close(); 716 if (cachedImageOut != null) cachedImageOut.close(); 655 717 } 656 718 } -
trunk/www/views/experiments/bioassaysets/view_bioassayset.jsp
r4669 r4825 524 524 String url = "../plotter/plot?ID="+ID+"&bioassay_id="+bioAssay.getId(); 525 525 url += "&type=scatter&width=400&height=300"; 526 url += "&cache=overview/bioassay." + bioAssay.getId() + "/maplot.png"; 526 527 url += "&x="+A+"&y="+M+"&xLabel="+xLabel+"&yLabel="+yLabel; 527 528 url += "&filter="+filter; … … 562 563 String url = "../plotter/plot?ID="+ID+"&bioassay_id="+bioAssay.getId(); 563 564 url += "&type=cfplot&width=400&height=300"; 565 url += "&cache=overview/bioassay." + bioAssay.getId() + "/cfplot.png"; 564 566 url += "&xLabel="+xLabel+"&yLabel="+yLabel; 565 567 url += "&title="+HTML.urlEncode(bioAssay.getName());
Note: See TracChangeset
for help on using the changeset viewer.