swingx-master/swingx-demos/swingx-demos-swingxset/src/main/java/org/jdesktop/swingxset/DemoCreator.java
/*
 * $Id$
 *
 * Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
package org.jdesktop.swingxset;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.sun.swingset3.Demo;


/**
 * Reads demo classnames and creates demos. Extracted methods from Swing/X/Set3
 * 
 * @author Jeanette Winzenburg
 */
public class DemoCreator {

    @SuppressWarnings("unused")
    private static final Logger LOG = Logger.getLogger(DemoCreator.class
            .getName());
    private static final DemoCreator INSTANCE = new DemoCreator();
    
    public List<Demo> createDemos(String[] args, String metaSource) {
        List<String> demoNames = getDemoClassNames(args, metaSource);
        return createDemoList(demoNames);
    }
    
    private List<String> readDemoClassNames(Reader reader) throws IOException {
        List<String> demoClassNames = new ArrayList<String>();
        
        BufferedReader breader = new BufferedReader(reader);
        String line;
        while((line = breader.readLine()) != null) {
            if (isClassName(line))
                demoClassNames.add(line);
        }
        breader.close();
        return demoClassNames;
    }

    /**
     * @param line
     * @return
     */
    private boolean isClassName(String line) {
        if ((line == null) 
                || line.startsWith("#")
                || line.trim().length() == 0 
                ) return false;
        return true;
    }

    private List<String>getDemoClassNames(String args[], String metaSource) {
        List<String> demoList = new ArrayList<String>();
        boolean augment = false;
        Exception exception = null; 

        // First look for any demo list files specified on the command-line
        for(String arg : args) {
            if (arg.equals("-a") || arg.equals("-augment")) {
                augment = true;
            } else {
                // process argument as filename containing names of demo classes
                try {
                    demoList.addAll(readDemoClassNames(new FileReader(arg) /*filename*/));
                } catch (IOException ex) {
                    exception = ex;
                    LOG.log(Level.WARNING, "unable to read demo class names from file: "+arg, ex);
                }
            }
        }

        if (demoList.isEmpty() || augment) {
            // Load default Demos
            try {
                demoList.addAll(readDemoClassNames(
                        new InputStreamReader(getClass().getResourceAsStream(metaSource))));
            } catch (IOException ex) {
                exception = ex;
                LOG.log(Level.WARNING, "unable to read resource: " + metaSource, ex);
            }
        }

        if (demoList.isEmpty()) {
//            displayErrorMessage(resourceMap.getString("error.noDemosLoaded"), 
//                    exception);
        }        
        return demoList;
  
    }

    private List<Demo> createDemoList(List<String> demoClassNamesList) {              
        List<Demo> demoList = new ArrayList<Demo>();
        for(String demoClassName: demoClassNamesList) {
             Demo demo = createDemo(demoClassName);
            if (demo != null) {
                demoList.add(demo);
            }
        }
        return demoList;
    }
    
    /**
     */
    private Demo createDemo(String demoClassName) {        
        Class<?> demoClass = null;
        Demo demo = null;
        try {
            demoClass = Class.forName(demoClassName);
            demo = new Demo(demoClass);
        } catch (ClassNotFoundException cnfe) {
            LOG.log(Level.WARNING, "demo class not found:"+ demoClassName);
        }        
        return demo;
    }

    /**
     * @return
     */
    public static DemoCreator getInstance() {
        return INSTANCE;
    }

}
