/* * Copyright 2000-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.daemon.impl.util.feeddaemon; //jetspeed stuff import org.apache.jetspeed.cache.disk.DiskCacheUtils; import org.apache.jetspeed.cache.disk.JetspeedDiskCache; import org.apache.jetspeed.om.registry.PortletEntry; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.Registry; import org.apache.jetspeed.services.PortletFactory; import org.apache.jetspeed.services.urlmanager.URLManager; import org.apache.jetspeed.services.urlmanager.URLManagerService; import org.apache.jetspeed.services.urlmanager.URLFetcher; import org.apache.jetspeed.services.resources.JetspeedResources; //Java stuff import java.io.IOException; /** <p> Given an PortletEntry use the PortletFactory to instantiate this Portlet and then place it in the cache. </p> <p> If the URL isn't </p> @author <A HREF="mailto:burton@apache.org">Kevin A. Burton</A> @version $Id: Instantiator.java,v 1.26 2004/02/23 02:47:27 jford Exp $ */ public class Instantiator implements Runnable { /** The maximum number of seconds to wait before warning that the URL took too long to download */ public static final int MAX_WARN_SECONDS = 3; /** Specify the interval to log when Portlets are instantiated */ public static final int LOG_INTERVAL = 100; private PortletEntry entry = null; private int id = 0; private boolean forcePortet = false; /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(Instantiator.class.getName()); /** Create a Instantiator with info on what to instantiate */ public Instantiator( PortletEntry entry ) { this.entry = entry; } /** @see #Instantiator( PortletEntry ) */ public Instantiator( int id, PortletEntry entry ) { this(entry); this.id = id; } /** Get the url from the net and put it on disk */ public void getURL( String url ) throws IOException { //if the user wants to download the URL and it isn't in the cache then go for it if ( JetspeedResources.getBoolean( JetspeedResources.CONTENTFEEDS_FETCHALL_KEY ) && DiskCacheUtils.isCached( url ) == false ) { long download_begin = System.currentTimeMillis(); try { //JetspeedDiskCache.getInstance().getEntry( url, true ); //SGP JetspeedDiskCache.getInstance().getEntry( url, URLFetcher.fetch(url, true)); long total = ( System.currentTimeMillis() - download_begin ) / 1000; if ( total >= MAX_WARN_SECONDS ) { logger.warn( this.getClass().getName() + " The following URL took too long (" + total + " second(s)) to download: " + url ); } } catch (IOException e) { //Not necessary to print a stack trace here because this will //generate too much output logger.error( "The following URL couldn't be downloaded " + url + " and took " + ( System.currentTimeMillis() - download_begin ) / 1000 + " seconds to download. " ); throw new IOException( e.getMessage() ); } } } /** Do work necessary to instantiate the current Entry but only do this if it is NOT already in the cache. */ public void run() { try { if(this.entry == null) { logger.error("Instantiator: Null Entry"); return; } if(this.entry.getURL() == null) { logger.error("Instantiator: Null URL"); return; } this.getURL( this.entry.getURL() ); } catch ( IOException e ) { //the real IOException is logged in getURL return; } catch ( Throwable t) { //t.printStackTrace(); logger.error( "Instantiator: Throwable", t); } org.apache.jetspeed.om.registry.Registry registry = Registry.get(Registry.PORTLET); try { if(!registry.hasEntry(this.entry.getName())) { registry.addEntry( this.entry ); if ( JetspeedResources.getBoolean( JetspeedResources.AUTOCREATE_PORTLETS_KEY ) ) { PortletFactory.getPortlet( this.entry.getName(), "0" ); } } } catch ( Exception e ) { logger.error( "InstantiatorThread: Couldn't create Portlet: ", e ); //SGP We add the URL to the BadList URLManager.register( this.entry.getURL(), URLManagerService.STATUS_BAD, e.toString() ); //remove this entry because it threw a PortletException so users //should be prevented from seeing this again. registry.removeEntry( this.entry.getName() ); } //log how many portlets we have instantiated. if ( id != 0 && id % LOG_INTERVAL == 0 ) { logger.info( "Instantiator: instanted " + id + " portlet(s)" ); } } }