跳轉到內容

WebObjects/Web 應用程式/開發/自定義資源管理器

來自華夏公益教科書,為開放世界提供開放書籍

小蜜蜂

[編輯 | 編輯原始碼]

以下是一個關於如何編寫自己的 WOResourceManager 的簡單示例

需要實現的主要方法是 urlForResourceNamed() 和 bytesForResourceNamed()。

  • urlForResourceNamed 簡單地從您想要的任何地方(例如 jar 檔案)為資源構建一個 URL。不幸的是,urlForResourceNamed 使用 pathForResourceNamed,因此您也需要重寫它
 private URL urlForResourceNamed(String aResourceName)
 {
   return this.getClass().getResource( aResourceName );
 }
 
 public String pathForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
 {
   URL  anURL = this.urlForResourceNamed( aResourceName );
   
   if ( anURL != null )
   {
     return anURL.toExternalForm();
   }
   
   return null;
 }
 
 public String urlForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages, WORequest aRequest)
 {
   String  anURL = super.urlForResourceNamed( aResourceName, aFrameworkName, someLanguages, aRequest );
   
   this.bytesForResourceNamed( aResourceName, aFrameworkName, someLanguages );
 
   return anURL;
 }
  • bytesForResourceNamed 簡單地從您想要的任何地方(例如 jar 檔案)檢索資源
 public InputStream inputStreamForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
 {
   return this.getClass().getResourceAsStream( aResourceName );
 }
 
 public byte[] bytesForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
 {
   if ( aResourceName != null )
   {
     URL  anURL = this.urlForResourceNamed( aResourceName );
     
     if ( anURL != null )
     {
       String      aKey = anURL.toString();
       WOURLValuedElementData  anElement = (WOURLValuedElementData) _cache.get( aKey );
       
       if ( anElement == null )
       {
         synchronized( this )
         {
           InputStream  anInputStream = this.inputStreamForResourceNamed( aResourceName, null, null );
           
           if ( anInputStream != null )
           {
             try
             {
               InputStream  aBufferStream = new BufferedInputStream( anInputStream );
               byte[]    someBytes = new byte[ aBufferStream.available() ];
               
               aBufferStream.read( someBytes );
               aBufferStream.close();
               anInputStream.close();
   
               {
                 Data  someData = new Data( someBytes );
                 String  aType = this.contentTypeForResourceNamed( aKey );
                 
                 anElement = new WOURLValuedElementData( someData, aType, aKey );
                 
                 _cache.put( aKey, anElement );
               }
             }
             catch(Exception anException)
             {
               SZLog.warning( anException );
             }
           }
         }
       }
       
       return ( (Data) anElement.data() ).bytesNoCopy();
     }
     
     SZLog.debug( "Null url for resource named '" + aResourceName + "'." );
     
     return null;
   }
   
   throw new IllegalArgumentException ( "ResourceManager.bytesForResourceNamed: null resource name." );
 }
  • 最後但並非最不重要的是,您需要處理那些古怪的 WOURLValuedElementData,這樣 dataForResourceNamed 才能正常工作
 public NSData dataForResourceNamed(String aResourceName)
 {
   this.bytesForResourceNamed( aResourceName, null, null );
 
   String      aKey = this.urlForResourceNamed( aResourceName ).toString();
   WOURLValuedElementData  anElement = (WOURLValuedElementData) _cache.get( aKey );
   
   return anElement.data();
 }
  • 最後,您需要將您的資源管理器註冊到 WOApplication
 anApplication.setResourceManager( new ResourceManager() );

語言和框架的處理留給讀者作為練習。

華夏公益教科書