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 */ 023 package com.jcoverage.reporting; 024 025 import java.util.HashMap; 026 import java.util.Map; 027 import 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 */ 035 public 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 }