alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */
package org.openide.filesystems.multifs;

import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Map;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.Hashtable;
import java.util.Iterator;

import org.openide.*;
import org.openide.filesystems.*;
import org.openide.filesystems.localfs.LocalFSTest;
import org.openide.filesystems.xmlfs.XMLFSTest;
import org.openide.filesystems.xmlfs.XMLFSTest.ResourceComposer;

import org.netbeans.performance.DataManager;
import org.netbeans.performance.DataDescriptor;

/**
 * Base class for simulation of module layers. It creates several layers, each filled
 * with some number of .instance files. Each layer is zipped into one jar. 
 * The jars also contain class files.
 */
public class MultiXMLFSTest extends FSTest implements DataManager {
    
    public static final String XMLFS_NO_KEY = "XMLFS_NO";
    private FileWrapper[] wrappers;
    private static final String RES_EXT = ".instance";
    private MultiFileSystem mfs;
    
    protected List ddescs;
    
    // used for testCreateXMLFS
    private URL[] resources;
    
    private static final String getResource(int base) {
        return LocalFSTest.getPackage(base).replace('/', '-').concat(LocalFSTest.RES_NAME);
    }
    
    /** Creates new XMLFSGenerator */
    public MultiXMLFSTest(String name) {
        super(name);
        init();
    }

    /** Creates new XMLFSGenerator */
    public MultiXMLFSTest(String name, Object[] args) {
        super(name, args);
        init();
    }
    
    /** init */
    private void init() {
        ddescs = new ArrayList();
    }
    
    /** Set up given number of FileObjects */
    public FileObject[] setUpFileObjects(int foCount) throws Exception {
        
        int fsCount = getIntValue(XMLFS_NO_KEY);
        int foChunk = foCount / fsCount;
        int delta = foCount - (foCount / fsCount) * fsCount;
        
        int last = wrappers.length;
        FileSystem[] fss = new FileSystem[last];
        int[] bases = new int[last];
        resources = new URL[last];
        
        for (int i = 0; i < last; i++) {
            if (wrappers[i].isLocal()) {
                LocalFileSystem lfs = new LocalFileSystem();
                File mnt = wrappers[i].getMnt();
                if (mnt == null) {
                    wrappers[i] = createLocal(wrappers[i].getFoCount(), wrappers[i].getFoBase());
                }
                lfs.setRootDirectory(wrappers[i].getMnt());
                fss[i] = lfs;
            } else {
                URLClassLoader cloader = new URLClassLoader(new URL[] { wrappers[i].getMnt().toURL() });
                URL res = cloader.findResource(wrappers[i].getXResource());
                resources[i] = res;
                XMLFileSystem xmlfs = new XMLFileSystem();
                xmlfs.setXmlUrl(res, false);
                fss[i] = xmlfs;
            }
            
            if (i > 0) {
                bases[i] = bases[i - 1] + foChunk;
            }
        }
        
        FileObject[] ret = new FileObject[foCount];
        mfs = new MultiFileSystem(fss);
        for (int i = 0; i < last; i++) {
            FileObject res = mfs.findResource(LocalFSTest.getPackage(bases[i]));
            FileObject[] tmp = res.getChildren();
            int pos = i * foChunk + Math.min(i, 1) * delta;
            System.arraycopy(tmp, 0, ret, pos, tmp.length);
        }        
        
        return ret;
    }
    
    /** Empty */
    protected void postSetUp() {
    }
    
    /** Creates args for this instance of Benchmark */
    protected Map[] createArguments() {
        Map[] map = super.createArguments();
        Map[] newMap = new Map[map.length * 2];
        
        System.arraycopy(map, 0, newMap, 0, map.length);
        
        for (int i = map.length; i < newMap.length; i++) {
            newMap[i] = cloneMap(map[i - map.length]);
            newMap[i].put(XMLFS_NO_KEY, new Integer(50));
        }
        
        return newMap;
    }
    
    /** Creates a Map with default arguments values */
    protected Map createDefaultMap() {
        Map map = super.createDefaultMap();
        map.put(XMLFS_NO_KEY, new Integer(10));
        return map;
    }    
    
    /** Clones given Map by casting to a cloneable class - HashMap, Hashtable, or TreeMap */
    private static final Map cloneMap(Map toClone) {
        if (toClone instanceof HashMap) {
            return (Map) ((HashMap) toClone).clone();
        } else if (toClone instanceof Hashtable) {
            return (Map) ((Hashtable) toClone).clone();
        } else if (toClone instanceof TreeMap) {
            return (Map) ((TreeMap) toClone).clone();
        }
        
        return null;
    }
    
    /** @return this mfs */
    public MultiFileSystem getMultiFileSystem() {
        return mfs;
    }
    
    /** @return wrappers array */
    public FileWrapper[] getFileWrappers() {
        return wrappers;
    }

    /** Creates a FileWrapper suitable for mounting a LocalFileSystem */
    private static FileWrapper createLocal(int foCount, int foBase) throws Exception {
        File mnt = createTempFolder();
        LocalFSTest.createFiles(foCount, 0, mnt);
        return new FileWrapper(mnt, mnt, foCount, foBase, true, null);
    }
    
    /** Creates a FileWrapper suitable for mounting an XMLFileSystem */
    private static FileWrapper createXMLinJar(int foCount, int foBase) throws Exception {
        File tmp = createTempFolder();
        File destFolder = LocalFSTest.createFiles(foCount, foBase, tmp);
        compileFolder(tmp, destFolder);
        File xmlbase = XMLFSTest.generateXMLFile(destFolder, new ResourceComposer(getResource(foBase), RES_EXT, foCount, foBase));
        File jar = Utilities.createJar(tmp, "jarxmlfs.jar");
        String xres = LocalFSTest.getPackage(foBase) + xmlbase.getName();
        return new FileWrapper(tmp, jar, foCount, foBase, false, xres);
    }
    
    /** Compiles folder */
    private static void compileFolder(File root, File destFolder) throws Exception {
        File[] files = destFolder.listFiles();
        //StringBuffer sb = new StringBuffer(3000);
        String[] args = new String[files.length + 3];
        args[0] = "javac";
        args[1] = "-classpath";
        args[2] = System.getProperty("java.class.path");
        
        for (int i = 3; i < args.length; i++) {
            args[i] = files[i - 3].getCanonicalPath();
        }
        
        File stdlog = new File(root, "stdcompilerlog.txt");
        File errlog = new File(root, "errcompilerlog.txt");
        
        PrintStream stdps = new PrintStream(new FileOutputStream(stdlog));
        PrintStream errps = new PrintStream(new FileOutputStream(errlog));
        
        Process p = Runtime.getRuntime().exec(args);
        CopyMaker cma, cmb;
        Thread tha = new Thread(cma = new CopyMaker(p.getInputStream(), stdps));
        tha.start();
        Thread thb = new Thread(cmb = new CopyMaker(p.getErrorStream(), errps));
        thb.start();
        
        p.waitFor();
        tha.join();
        thb.join();
        
        stdps.close();
        errps.close();
        
        if (cma.e != null) {
            throw cma.e;
        }
        if (cmb.e != null) {
            throw cmb.e;
        }
    }
    
    /** Called after tearDown()  */
    public void tearDownData() throws Exception {
        for (Iterator it = ddescs.iterator(); it.hasNext(); ) {
            MFSDataDescriptor dd = (MFSDataDescriptor) it.next();
            FileWrapper[] wrappers = dd.getFileWrappers();
            if (wrappers != null) {
                for (int i = 0; i < wrappers.length; i++) {
                    delete(wrappers[i].getRootDir());
                }
            }
        }
    }
    
    /** Called before setUp()  */
    public DataDescriptor createDataDescriptor() {
        return new MFSDataDescriptor(getIntValue(FILE_NO_KEY), getIntValue(XMLFS_NO_KEY));
    }
    
    /** Called before setUp()  */
    public void setUpData(DataDescriptor ddesc) throws Exception {
        MFSDataDescriptor dd = (MFSDataDescriptor) ddesc;
        ddescs.add(dd);
        FileWrapper fwrappers[] = dd.getFileWrappers();
        
        if (fwrappers == null) {
            int foCount = dd.getFoCount();
            int fsCount = dd.getFsCount();
            int foChunk = foCount / fsCount;
            int delta = foCount - (foCount / fsCount) * fsCount;
            wrappers = new FileWrapper[fsCount];
            int[] bases = new int[fsCount];
            for (int i = 1; i < fsCount; i++) {
                int ibase = i * foChunk;
                wrappers[i] = createXMLinJar(foChunk, ibase);
                bases[i] = ibase;
            }

            wrappers[0] = createLocal(foChunk + delta, 0);
            dd.setFileWrappers(wrappers);
        } else {
            wrappers = fwrappers;
        }
    }
    
    // test method
    public void testCreateXMLFS() throws Exception {
        int iters = iterations;
        FileWrapper[] wrappers = this.wrappers;
        int len = wrappers.length;
        while (iters-- > 0) {
            // first is LocalFS
            for (int i = 1; i < len; i++) {
                XMLFileSystem xmlfs = new XMLFileSystem();
                xmlfs.setXmlUrl(resources[i], false);
            }
        }
    }
    
    static final class CopyMaker implements Runnable {
        InputStream is;
        PrintStream os;
        Exception e;
        
        CopyMaker(InputStream is, PrintStream os) {
            this.is = is;
            this.os = os;
        }
        
        public void run() {
            try {
                Utilities.copyIS(is, os);
            } catch (Exception ee) {
                e = ee;
            }
        }
    }
    
    /** Wraps Files */
    public static final class FileWrapper implements Serializable {
        private transient File rootDir;
        private transient File mnt;
        private int foCount;
        private int foBase;
        
        private boolean isLocal;
        
        // xml specific
        private String xresource;
        
        /** New FileWrapper */
        public FileWrapper(File rootDir, File mnt, int foCount, int foBase, boolean isLocal, String xresource) {
            this.rootDir = rootDir;
            this.mnt = mnt;
            this.foCount = foCount;
            this.foBase = foBase;
            this.isLocal = isLocal;
            this.xresource = xresource;
        }
        
        public File getRootDir() {
            return rootDir;
        }
        
        public File getMnt() {
            return mnt;
        }
        
        public int getFoCount() {
            return foCount;
        }
        
        public int getFoBase() {
            return foBase;
        }
        
        public boolean isLocal() {
            return isLocal;
        }
        
        public String getXResource() {
            return xresource;
        }
        
        private void writeObject(ObjectOutputStream obtos) throws IOException {
            obtos.defaultWriteObject();
            if (! isLocal()) {
                Utilities.writeFile(getMnt(), obtos);
            }
        }
        
        private void readObject(ObjectInputStream obtis) throws IOException, ClassNotFoundException {
            obtis.defaultReadObject();
            if (! isLocal()) {
                rootDir = createTempFolder();
                mnt = Utilities.readFile(rootDir, obtis);
            }
        }
    }
    
    /*
    public static void main(String[] args) throws Exception {
        MultiXMLFSTest mtest = new MultiXMLFSTest("first test");
        mtest.setUpFileObjects(500);
        System.out.println("done");
        
        System.out.println(mtest.wrappers[1].getClassLoader().loadClass("org.openide.filesystems.data50.JavaSrc55"));
    }
     */
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.