1 16 package org.outerj.daisy.frontend.components.wikidatasource; 17 18 import java.io.File ; 19 import java.io.IOException ; 20 import java.net.MalformedURLException ; 21 import java.net.URL ; 22 import java.util.Map ; 23 24 import org.apache.avalon.framework.context.Context; 25 import org.apache.avalon.framework.context.ContextException; 26 import org.apache.avalon.framework.context.Contextualizable; 27 import org.apache.avalon.framework.logger.AbstractLogEnabled; 28 import org.apache.avalon.framework.thread.ThreadSafe; 29 import org.apache.avalon.framework.activity.Initializable; 30 import org.apache.cocoon.components.ContextHelper; 31 import org.apache.cocoon.environment.Request; 32 import org.apache.excalibur.source.Source; 33 import org.apache.excalibur.source.SourceFactory; 34 import org.outerj.daisy.frontend.util.WikiDataDirHelper; 35 import org.outerj.daisy.frontend.WikiHelper; 36 37 45 public class WikiDataSourceFactory extends AbstractLogEnabled implements SourceFactory, Contextualizable, ThreadSafe, Initializable { 46 47 private Context context; 48 private File wikiDataDir; 49 private volatile File wikiDataFallbackDir; 50 private final static String FALLBACK_INDICATION = "/(webapp)"; 51 52 public void contextualize(Context context) throws ContextException { 53 this.context = context; 54 } 55 56 public void initialize() throws Exception { 57 this.wikiDataDir = new File (WikiDataDirHelper.getWikiDataDir(context)).getAbsoluteFile(); 58 } 59 60 public Source getSource(String location, Map parameters) throws IOException , MalformedURLException { 61 62 if (wikiDataFallbackDir == null) { 63 synchronized(this) { 64 if (wikiDataFallbackDir == null) { 65 Request request = ContextHelper.getRequest(context); 66 wikiDataFallbackDir = new File (new URL (WikiHelper.getDaisyContextPath(request)).getPath()).getAbsoluteFile(); 67 } 68 } 69 } 70 71 String filePath = location.substring(location.indexOf(":") + 1); 72 73 if (filePath.indexOf("..") != -1) { 75 throw new MalformedURLException ("The 'wikidata:' source does not allow relative URLs."); 76 } 77 78 File resource; 79 File fallbackResource; 80 81 boolean forceFallback = filePath.startsWith(FALLBACK_INDICATION); 84 85 if (forceFallback) { 86 filePath = location.substring(FALLBACK_INDICATION.length()); 87 resource = new File (wikiDataFallbackDir, filePath); 89 fallbackResource = new File (wikiDataFallbackDir, filePath); 90 } else { 91 resource = new File (wikiDataDir, filePath); 93 fallbackResource = new File (wikiDataFallbackDir, filePath); 94 } 95 96 StringBuffer absolutePath = new StringBuffer (150); 97 absolutePath.append("wikidata:"); 98 if (forceFallback) 99 absolutePath.append("/(webapp)"); 100 absolutePath.append(filePath); 101 102 return new WikiDataSource(resource, fallbackResource, absolutePath.toString()); 103 } 104 105 public void release(Source source) {} 106 107 } 108 | Popular Tags |