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.coverage.reporting.collation;
024
025 import java.io.*;
026 import org.apache.log4j.Logger;
027
028 import com.jcoverage.coverage.reporting.collation.JavaFilePage;
029 import com.jcoverage.coverage.reporting.collation.PackageSummaryPage;
030 import com.jcoverage.coverage.reporting.collation.ReportSummaryPage;
031 import com.jcoverage.coverage.reporting.html.MultiViewStaticHtmlFormat;
032 import com.jcoverage.reporting.AbstractCollator;
033 import com.jcoverage.reporting.FormattingContext;
034 import com.jcoverage.reporting.MultiViewCollator;
035 import com.jcoverage.reporting.Page;
036 import com.jcoverage.reporting.ReportingException;
037 import com.jcoverage.reporting.View;
038 import com.jcoverage.reporting.ViewFormattingContext;
039 import com.jcoverage.reporting.staticgen.StaticView;
040
041 /**
042 * This class provides an implementation of a collator which
043 * constructs filename paths suitable for a statically generated set
044 * of files.
045 *
046 * <p>
047 *
048 * As it deals with static files, views must be of type {@link
049 * com.jcoverage.reporting.staticgen.StaticView}, since the view's
050 * filename modifier is used to construct a unique filename.
051 */
052 public class StaticFileCollator extends AbstractCollator implements MultiViewCollator {
053
054 static Logger logger=Logger.getLogger(StaticFileCollator.class);
055
056 String suffix;
057
058 public StaticFileCollator(String suffix) {
059 if (suffix.startsWith(".")) {
060 this.suffix=suffix;
061 } else {
062 this.suffix="."+suffix;
063 }
064 }
065
066 String getFilenameModifier(View view,Page page) {
067 String result="";
068 if (view!=null) {
069 if (view instanceof StaticView) {
070 if (!view.equals(MultiViewStaticHtmlFormat.ALPHABETICAL_VIEW)) {
071 String modifier=((StaticView)view).getFilenameModifier(page);
072 if (modifier!=null) {
073 result=modifier+"/"; // put the view in it's own subdirectory
074 }
075 }
076 } else {
077 throw new IllegalStateException("Views given to this StaticFileCollator must be of type StaticView, this one is "+view.getClass());
078 }
079 }
080 return result;
081 }
082
083 String getUniquePathFromComponents(View view,Page page,String name,String suffix) {
084 return getFilenameModifier(view,page)+name+suffix;
085 }
086
087 String getPathToPageView(View view,Page page) {
088
089 if (page instanceof ReportSummaryPage) {
090 return getUniquePathFromComponents(view,page,"index",suffix);
091
092 } else if (page instanceof PackageSummaryPage) {
093 String packageName=(String)page.getMasterLine().getField(ReportSummaryPackageLine.COLUMN_PACKAGE_NAME);
094 return getUniquePathFromComponents(view,page,packageName,suffix);
095
096 } else if (page instanceof JavaFilePage) {
097 String clzName=(String)page.getMasterLine().getField(JavaFileLine.COLUMN_FILE_NAME);
098 return getUniquePathFromComponents(view,page,clzName,suffix);
099
100 }
101 return null;
102 }
103
104 public String getPathToPage(FormattingContext ctx,Page page) {
105 if (ctx instanceof ViewFormattingContext) {
106 return getPathToPageView(((ViewFormattingContext)ctx).getCurrentView(),page);
107 } else {
108 return getPathToPageView(null,page);
109 }
110 }
111
112 /**
113 *
114 */
115 public String getPathToPage(FormattingContext ctx,Page page,Page from) {
116 return getRelativePath(getPathToPage(ctx,from),getPathToPage(ctx,page));
117 }
118
119 public String getPathToResource(FormattingContext ctx,String resource,Page from) {
120 return getRelativePath(getPathToPage(ctx,from),resource);
121 }
122
123 public String getPathToPage(ViewFormattingContext ctx,Page page,Page from,View toView) {
124 return getRelativePath(getPathToPage(ctx,from),getPathToPageView(toView,page));
125 }
126
127 }