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.coverage.reporting.collation;
024
025import java.io.*;
026import org.apache.log4j.Logger;
027
028import com.jcoverage.coverage.reporting.collation.JavaFilePage;
029import com.jcoverage.coverage.reporting.collation.PackageSummaryPage;
030import com.jcoverage.coverage.reporting.collation.ReportSummaryPage;
031import com.jcoverage.coverage.reporting.html.MultiViewStaticHtmlFormat;
032import com.jcoverage.reporting.AbstractCollator;
033import com.jcoverage.reporting.FormattingContext;
034import com.jcoverage.reporting.MultiViewCollator;
035import com.jcoverage.reporting.Page;
036import com.jcoverage.reporting.ReportingException;
037import com.jcoverage.reporting.View;
038import com.jcoverage.reporting.ViewFormattingContext;
039import 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 */
052public 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}