Home | History | Annotate | Download | only in asset
      1 /*
      2  * Copyright (c) 2009-2010 jMonkeyEngine
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  * * Redistributions of source code must retain the above copyright
     10  *   notice, this list of conditions and the following disclaimer.
     11  *
     12  * * Redistributions in binary form must reproduce the above copyright
     13  *   notice, this list of conditions and the following disclaimer in the
     14  *   documentation and/or other materials provided with the distribution.
     15  *
     16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
     17  *   may be used to endorse or promote products derived from this software
     18  *   without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 package com.jme3.asset;
     34 
     35 import java.io.DataInput;
     36 import java.io.IOException;
     37 import java.io.InputStream;
     38 import java.util.Scanner;
     39 import java.util.logging.Level;
     40 import java.util.logging.Logger;
     41 
     42 /**
     43  * <code>AssetConfig</code> loads a config file to configure the asset manager.
     44  * <br/><br/>
     45  * The config file is specified with the following format:
     46  * <code>
     47  * "LOADER" <class> : (<extension> ",")* <extension>
     48  * "LOCATOR" <path> <class> : (<extension> ",")* <extension>
     49  * </code>
     50  *
     51  * @author Kirill Vainer
     52  */
     53 public class AssetConfig {
     54 
     55     private AssetManager manager;
     56 
     57     public AssetConfig(AssetManager manager){
     58         this.manager = manager;
     59     }
     60 
     61     public void loadText(InputStream in) throws IOException{
     62         Scanner scan = new Scanner(in);
     63         while (scan.hasNext()){
     64             String cmd = scan.next();
     65             if (cmd.equals("LOADER")){
     66                 String loaderClass = scan.next();
     67                 String colon = scan.next();
     68                 if (!colon.equals(":")){
     69                     throw new IOException("Expected ':', got '"+colon+"'");
     70                 }
     71                 String extensionsList = scan.nextLine();
     72                 String[] extensions = extensionsList.split(",");
     73                 for (int i = 0; i < extensions.length; i++){
     74                     extensions[i] = extensions[i].trim();
     75                 }
     76                 if (hasClass(loaderClass)) {
     77                     manager.registerLoader(loaderClass, extensions);
     78                 } else {
     79                     Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot find loader {0}", loaderClass);
     80                 }
     81             } else if (cmd.equals("LOCATOR")) {
     82                 String rootPath = scan.next();
     83                 String locatorClass = scan.nextLine().trim();
     84                 if (hasClass(locatorClass)) {
     85                     manager.registerLocator(rootPath, locatorClass);
     86                 } else {
     87                     Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot find locator {0}", locatorClass);
     88                 }
     89             } else {
     90                 throw new IOException("Expected command, got '" + cmd + "'");
     91             }
     92         }
     93     }
     94 
     95     private boolean hasClass(String name) {
     96         try {
     97             Class clazz = Class.forName(name);
     98             return clazz != null;
     99         } catch (ClassNotFoundException ex) {
    100             return false;
    101         }
    102     }
    103 
    104     private static String readString(DataInput dataIn) throws IOException{
    105         int length = dataIn.readUnsignedShort();
    106         char[] chrs = new char[length];
    107         for (int i = 0; i < length; i++){
    108             chrs[i] = (char) dataIn.readUnsignedByte();
    109         }
    110         return String.valueOf(chrs);
    111     }
    112 
    113     /*
    114     public void loadBinary(DataInput dataIn) throws IOException{
    115         // read signature and version
    116 
    117         // how many locator entries?
    118         int locatorEntries = dataIn.readUnsignedShort();
    119         for (int i = 0; i < locatorEntries; i++){
    120             String locatorClazz = readString(dataIn);
    121             String rootPath = readString(dataIn);
    122             manager.registerLocator(rootPath, locatorClazz);
    123         }
    124 
    125         int loaderEntries = dataIn.readUnsignedShort();
    126         for (int i = 0; i < loaderEntries; i++){
    127             String loaderClazz = readString(dataIn);
    128             int numExtensions = dataIn.readUnsignedByte();
    129             String[] extensions = new String[numExtensions];
    130             for (int j = 0; j < numExtensions; j++){
    131                 extensions[j] = readString(dataIn);
    132             }
    133 
    134             manager.registerLoader(loaderClazz, extensions);
    135         }
    136     }
    137     */
    138 }
    139