Index: calendar-impl/impl/pom.xml =================================================================== --- calendar-impl/impl/pom.xml (revision 104403) +++ calendar-impl/impl/pom.xml (working copy) @@ -64,21 +64,16 @@ javax.servlet servlet-api + + org.apache.xmlgraphics + fop + 1.0 + - avalon-framework - avalon-framework - 20020627 - - org.mnode.ical4j ical4j 1.0.2 - - fop - fop - 0.20.5 - Index: calendar-impl/impl/src/config/schedule.xsl =================================================================== --- calendar-impl/impl/src/config/schedule.xsl (revision 104403) +++ calendar-impl/impl/src/config/schedule.xsl (working copy) @@ -494,6 +494,7 @@ cm + @@ -558,7 +559,7 @@ - + @@ -595,7 +596,6 @@ - + @@ -60,7 +60,6 @@ - + Index: calendar-impl/impl/src/config/schlist.xsl =================================================================== --- calendar-impl/impl/src/config/schlist.xsl (revision 104403) +++ calendar-impl/impl/src/config/schlist.xsl (working copy) @@ -15,7 +15,7 @@ - + @@ -41,7 +41,6 @@ + + + + + + + + + \ No newline at end of file Index: calendar-impl/impl/src/java/org/sakaiproject/calendar/impl/BaseCalendarService.java =================================================================== --- calendar-impl/impl/src/java/org/sakaiproject/calendar/impl/BaseCalendarService.java (revision 104403) +++ calendar-impl/impl/src/java/org/sakaiproject/calendar/impl/BaseCalendarService.java (working copy) @@ -40,6 +40,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Observable; import java.util.Properties; import java.util.Set; @@ -77,15 +78,19 @@ import net.fortuna.ical4j.model.property.Uid; import net.fortuna.ical4j.model.property.Version; -import org.apache.avalon.framework.logger.ConsoleLogger; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.fop.apps.Driver; import org.apache.fop.apps.FOPException; -import org.apache.fop.apps.Options; -import org.apache.fop.configuration.Configuration; -import org.apache.fop.messaging.MessageHandler; +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.apps.Fop; +import org.apache.fop.apps.FopFactory; +import org.apache.fop.fonts.substitute.FontQualifier; +import org.apache.fop.fonts.substitute.FontSubstitution; +import org.apache.fop.fonts.substitute.FontSubstitutions; +import org.apache.xmlgraphics.util.MimeConstants; import org.sakaiproject.alias.api.Alias; import org.sakaiproject.alias.cover.AliasService; import org.sakaiproject.authz.api.AuthzPermissionException; @@ -96,6 +101,7 @@ import org.sakaiproject.calendar.api.Calendar; import org.sakaiproject.calendar.api.CalendarEdit; import org.sakaiproject.calendar.api.CalendarEvent; +import org.sakaiproject.calendar.api.CalendarEvent.EventAccess; import org.sakaiproject.calendar.api.CalendarEventEdit; import org.sakaiproject.calendar.api.CalendarEventVector; import org.sakaiproject.calendar.api.CalendarService; @@ -5427,8 +5433,9 @@ protected final static String WEEK_VIEW_XSLT_FILENAME = "schedule.xsl"; // FOP Configuration - protected final static String FOP_USERCONFIG = "fonts/userconfig.xml"; - protected final static String FOP_FONTBASEDIR = "fonts"; + protected final static String FOP_USERCONFIG = "userconfig.xml"; + protected final static String FOP_DEFAULT_FONT_KEY = "fop.pdf.default.font"; + protected final static String FOP_DEFAULT_FONT = "Helvetica"; // Mime Types protected final static String PDF_MIME_TYPE = "application/pdf"; @@ -6184,28 +6191,21 @@ */ protected void generatePDF(Document doc, String xslFileName, OutputStream streamOut) { - Driver driver = new Driver(); - - org.apache.avalon.framework.logger.Logger logger = new ConsoleLogger(ConsoleLogger.LEVEL_ERROR); - MessageHandler.setScreenLogger(logger); - driver.setLogger(logger); - + Fop fop = null; try { - String baseDir = getClass().getClassLoader().getResource(FOP_FONTBASEDIR).toString(); - Configuration.put("fontBaseDir", baseDir); - InputStream userConfig = getClass().getClassLoader().getResourceAsStream(FOP_USERCONFIG); - new Options(userConfig); + DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder(); + Configuration cfg = cfgBuilder.build(getClass().getClassLoader().getResourceAsStream(FOP_USERCONFIG)); + FopFactory fopFactory = FopFactory.newInstance(); + fopFactory.setUserConfig(cfg); + fopFactory.setStrictValidation(false); + FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); + fopFactory.getFontManager().setFontSubstitutions(getFontSubstitutions()); + fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, streamOut); } - catch (FOPException fe){ - M_log.warn(this+".generatePDF: ", fe); - } catch(Exception e){ M_log.warn(this+".generatePDF: ", e); } - driver.setOutputStream(streamOut); - driver.setRenderer(Driver.RENDER_PDF); - try { InputStream in = getClass().getClassLoader().getResourceAsStream(xslFileName); @@ -6248,7 +6248,7 @@ transformer.setParameter("from", rb.getString("event.from")); transformer.setParameter("sched", rb.getString("sched.for")); - transformer.transform(src, new SAXResult(driver.getContentHandler())); + transformer.transform(src, new SAXResult(fop.getDefaultHandler())); } catch (TransformerException e) @@ -6257,9 +6257,30 @@ M_log.warn(this+".generatePDF(): " + e); return; } + catch (FOPException e) + { + e.printStackTrace(); + M_log.warn(this+".generatePDF(): " + e); + return; + } } /** + * If a font is set in sakai.properties, then replace the default font. + * Otherwise, use FOP default font. + */ + private FontSubstitutions getFontSubstitutions() + { + FontQualifier fromQualifier = new FontQualifier(); + fromQualifier.setFontFamily("DEFAULT_FONT"); + FontQualifier toQualifier = new FontQualifier(); + toQualifier.setFontFamily(m_serverConfigurationService.getString(FOP_DEFAULT_FONT_KEY, FOP_DEFAULT_FONT)); + FontSubstitutions result = new FontSubstitutions(); + result.add(new FontSubstitution(fromQualifier, toQualifier)); + return result; + } + + /** * Make a full-day time range given a year, month, and day */ protected TimeRange getFullDayTimeRangeFromYMD(int year, int month, int day)