001/**
002 * www.jcoverage.com
003 * Copyright (C)2003 jcoverage ltd.
004 *
005 * This file is part of jcoverage.
006 *
007 * jcoverage is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published
009 * by the Free Software Foundation; either version 2 of the License,
010 * or (at your option) any later version.
011 *
012 * jcoverage is distributed in the hope that it will be useful, but
013 * WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with jcoverage; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
020 * USA
021 *
022 */
023package com.jcoverage.reporting;
024
025import java.util.HashMap;
026import java.util.Map;
027import org.apache.log4j.Logger;
028
029/**
030 * This class provides a skeletal implementation of a {@link
031 * Line}.  Subclasses should override the {@link
032 * #instantiateDetailPage} method if the line provides a
033 * deeper detail page.
034 */
035public class AbstractLine implements Line {
036  
037  static Logger logger=Logger.getLogger(AbstractLine.class);
038  
039  Report report;
040  Page owner,detailPage;
041  LineCategory category;
042  Map fieldsByColumn=new HashMap();
043  int state=Report.READY;
044
045  public Page openDetailPage() {
046    if (detailPage!=null) {
047      throw new IllegalStateException();
048    }
049    detailPage=instantiateDetailPage();
050    if (detailPage!=null) {
051      detailPage.setMasterLine(this);
052      detailPage.setReport(report);
053    }
054    return detailPage;
055  }
056  
057  /**
058   * Set the page that own's this line, in other words, the master page.
059   */
060  public void setOwner(Page owner) {
061    this.owner=owner;
062  }
063
064  public Page getOwner() {
065    return owner;
066  }
067
068  public void setReport(Report report) {
069    this.report=report;
070  }
071
072  public void setCategory(LineCategory category) {
073    this.category=category;
074  }
075
076  public Page getDetailPage() {
077    return detailPage;
078  }
079
080  /**
081   * Set a piece of information against this line.
082   */
083  public void setField(Column column,Object value) {
084    assertValidColumnForCategory(column);
085    if (column.getType() instanceof Object && column.isAcceptableValue(value)) {
086      fieldsByColumn.put(column,value);
087    } else {
088      throw new IllegalArgumentException("Column "+column+" does not accept values of type "+value.getClass());
089    }
090  }
091
092  public void setField(Column column,int value) {
093    setField(column,new Integer(value));
094  }
095
096  public void setField(Column column,double value) {
097    setField(column,new Double(value));
098  }
099
100  public void setField(Column column,boolean value) {
101    setField(column,new Boolean(value));
102  }
103
104  /**
105   * Subclasses should override this method if the line has
106   * information in a detail page.
107   */
108  protected Page instantiateDetailPage() {
109    return null;
110  }
111
112  /**
113   * Get the field value for a given column.
114   * <ul>
115   * <li>ints are returned as Integer instances.
116   * <li>doubles are returned as Double instances.
117   * <li>booleans are returned as Boolean instances.
118   * </ul>
119   * @param column the given column.
120   * @return null if no value has been set for the given column.
121   * @throws IllegalArgumentException if the column is not known to
122   * this line's category.
123   */
124  public Object getField(Column column) throws IllegalArgumentException {
125    assertValidColumnForCategory(column);
126    return fieldsByColumn.get(column);
127  }
128
129  public void close() throws ReportingException {
130    state=Report.CLOSED;
131    if (getDetailPage()!=null) {
132      getDetailPage().close();
133    }
134  }
135
136  public boolean isClosed() {
137    return state==Report.CLOSED;
138  }
139
140  protected void assertValidColumnForCategory(Column column) throws IllegalArgumentException {
141    if (category==null) {
142      return;
143    }
144    if (!category.getColumns().contains(column)) {
145      throw new IllegalArgumentException("Column "+column+" cannot be used here since it is unknown to this line's category, which is "+category+"("+category.getClass().getName()+")");
146    }
147  }
148
149}