org.drools.guvnor.server.util.FileManagerUtilsTest.java Source code

Java tutorial

Introduction

Here is the source code for org.drools.guvnor.server.util.FileManagerUtilsTest.java

Source

package org.drools.guvnor.server.util;

/*
 * Copyright 2005 JBoss Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

import org.apache.commons.fileupload.FileItem;
import org.drools.guvnor.client.common.AssetFormats;
import org.drools.guvnor.client.common.Snapshot;
import org.drools.guvnor.server.ServiceImplementation;
import org.drools.guvnor.server.files.FileManagerUtils;
import org.drools.repository.AssetItem;
import org.drools.repository.PackageItem;
import org.drools.repository.RulesRepository;

public class FileManagerUtilsTest extends TestCase {

    public void testAttachFile() throws Exception {

        FileManagerUtils uploadHelper = new FileManagerUtils();

        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        uploadHelper.repository = repo;
        AssetItem item = repo.loadDefaultPackage().addAsset("testUploadFile", "description");
        item.updateFormat("drl");
        FormData upload = new FormData();

        upload.setFile(new MockFile());
        upload.setUuid(item.getUUID());

        uploadHelper.attachFile(upload);

        AssetItem item2 = repo.loadDefaultPackage().loadAsset("testUploadFile");
        byte[] data = item2.getBinaryContentAsBytes();

        assertNotNull(data);
        assertEquals("foo bar", new String(data));
        assertEquals("foo.bar", item2.getBinaryContentAttachmentFileName());
    }

    public void testAttachModel() throws Exception {
        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        PackageItem pkg = repo.createPackage("testAttachModelImports", "heh");
        AssetItem asset = pkg.addAsset("MyModel", "");
        asset.updateFormat(AssetFormats.MODEL);
        asset.checkin("");

        pkg.updateBinaryUpToDate(true);
        repo.save();

        assertTrue(pkg.isBinaryUpToDate());
        assertEquals("", ServiceImplementation.getDroolsHeader(pkg));
        FileManagerUtils fm = new FileManagerUtils();
        fm.repository = repo;

        fm.attachFileToAsset(asset.getUUID(), this.getClass().getResourceAsStream("/billasurf.jar"),
                "billasurf.jar");

        pkg = repo.loadPackage("testAttachModelImports");

        assertFalse(pkg.isBinaryUpToDate());
        assertNotNull(ServiceImplementation.getDroolsHeader(pkg));
        assertTrue(ServiceImplementation.getDroolsHeader(pkg).indexOf("import com.billasurf.Board") > -1);
        assertTrue(ServiceImplementation.getDroolsHeader(pkg).indexOf("import com.billasurf.Person") > -1);

        ServiceImplementation.updateDroolsHeader("goo wee", pkg);
        pkg.checkin("");

        fm.attachFileToAsset(asset.getUUID(), this.getClass().getResourceAsStream("/billasurf.jar"),
                "billasurf.jar");
        pkg = repo.loadPackage("testAttachModelImports");
        assertEquals("goo wee", ServiceImplementation.getDroolsHeader(pkg));

    }

    public void testUploadXmlFile() throws Exception {
        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());

        repo.createPackage("testUploadXmlFile", "comment");
        repo.importRulesRepository(repo.dumpRepositoryXml());
        assertTrue(repo.containsPackage("testUploadXmlFile"));
    }

    public void testGetFilebyUUID() throws Exception {
        FileManagerUtils uploadHelper = new FileManagerUtils();
        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        uploadHelper.repository = repo;
        AssetItem item = repo.loadDefaultPackage().addAsset("testGetFilebyUUID", "description");
        item.updateFormat("drl");
        FormData upload = new FormData();

        upload.setFile(new MockFile());
        upload.setUuid(item.getUUID());
        uploadHelper.attachFile(upload);

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        String filename = uploadHelper.loadFileAttachmentByUUID(item.getUUID(), out);

        assertNotNull(out.toByteArray());
        assertEquals("foo bar", new String(out.toByteArray()));
        assertEquals("testGetFilebyUUID.drl", filename);
    }

    public void testGetPackageBinaryAndSource() throws Exception {

        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        ServiceImplementation impl = new ServiceImplementation();
        impl.repository = repo;

        long before = System.currentTimeMillis();
        Thread.sleep(20);
        FileManagerUtils uploadHelper = new FileManagerUtils();

        uploadHelper.repository = repo;
        PackageItem pkg = repo.createPackage("testGetBinaryPackageServlet", "");
        ServiceImplementation.updateDroolsHeader("import java.util.List", pkg);
        pkg.updateCompiledPackage(new ByteArrayInputStream("foo".getBytes()));
        pkg.checkin("");

        assertTrue(before < uploadHelper.getLastModified(pkg.getName(), "LATEST"));

        impl.createPackageSnapshot(pkg.getName(), "SNAPPY 1", false, "");

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        String fileName = uploadHelper.loadBinaryPackage(pkg.getName(), Snapshot.LATEST_SNAPSHOT, true, out);
        assertEquals("testGetBinaryPackageServlet.pkg", fileName);
        byte[] file = out.toByteArray();
        assertNotNull(file);
        assertEquals("foo", new String(file));

        out = new ByteArrayOutputStream();
        String drlName = uploadHelper.loadSourcePackage(pkg.getName(), Snapshot.LATEST_SNAPSHOT, true, out);
        String drl = new String(out.toByteArray());
        assertEquals(pkg.getName() + ".drl", drlName);
        assertNotNull(drl);
        assertTrue(drl.indexOf("import java.util.List") > -1);

        out = new ByteArrayOutputStream();
        fileName = uploadHelper.loadBinaryPackage(pkg.getName(), "SNAPPY 1", false, out);
        assertEquals("testGetBinaryPackageServlet_SNAPPY+1.pkg", fileName);
        file = out.toByteArray();
        assertNotNull(file);
        assertEquals("foo", new String(file));

        out = new ByteArrayOutputStream();
        fileName = uploadHelper.loadSourcePackage(pkg.getName(), "SNAPPY 1", false, out);
        assertEquals("testGetBinaryPackageServlet_SNAPPY+1.drl", fileName);
        drl = new String(out.toByteArray());
        assertTrue(drl.indexOf("import java.util.List") > -1);

        Thread.sleep(100);
        impl.createPackageSnapshot(pkg.getName(), "SNAPX", false, "");

        long lastMod = uploadHelper.getLastModified(pkg.getName(), "SNAPPY 1");
        assertTrue(pkg.getLastModified().getTimeInMillis() < lastMod);

        Thread.sleep(100);

        impl.createPackageSnapshot(pkg.getName(), "SNAPX", true, "yeah");

        long lastMod2 = uploadHelper.getLastModified(pkg.getName(), "SNAPX");
        assertTrue(lastMod < lastMod2);

    }

    /**
     * 
     * Tests importing when an archived package with the same name exists.
     */
    public void testImportArchivedPackage() throws Exception {
        FileManagerUtils fm = new FileManagerUtils();
        fm.repository = new RulesRepository(TestEnvironmentSessionHelper.getSession());

        // Import package
        String drl = "package testClassicDRLImport\n import blah \n rule 'ola' \n when \n then \n end \n rule 'hola' \n when \n then \n end";
        InputStream in = new ByteArrayInputStream(drl.getBytes());
        fm.importClassicDRL(in);

        PackageItem pkg = fm.repository.loadPackage("testClassicDRLImport");
        assertNotNull(pkg);
        assertFalse(pkg.isArchived());

        // Archive it
        pkg.archiveItem(true);

        pkg = fm.repository.loadPackage("testClassicDRLImport");
        assertNotNull(pkg);
        assertTrue(pkg.isArchived());

        // Import it again
        InputStream in2 = new ByteArrayInputStream(drl.getBytes());
        fm.importClassicDRL(in2);

        pkg = fm.repository.loadPackage("testClassicDRLImport");
        assertNotNull(pkg);
        assertFalse(pkg.isArchived());

    }

    public void testClassicDRLImport() throws Exception {
        FileManagerUtils fm = new FileManagerUtils();
        fm.repository = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        String drl = "package testClassicDRLImport\n import blah \n rule 'ola' \n when \n then \n end \n rule 'hola' \n when \n then \n end";
        InputStream in = new ByteArrayInputStream(drl.getBytes());
        fm.importClassicDRL(in);

        PackageItem pkg = fm.repository.loadPackage("testClassicDRLImport");
        assertNotNull(pkg);

        List<AssetItem> rules = iteratorToList(pkg.getAssets());
        assertEquals(3, rules.size());

        AssetItem pkgConf = rules.get(0);
        assertEquals("drools", pkgConf.getName());
        rules.remove(0);

        final AssetItem rule1 = rules.get(0);
        assertEquals("ola", rule1.getName());
        assertNotNull(rule1.getContent());
        assertEquals(AssetFormats.DRL, rule1.getFormat());
        assertTrue(rule1.getContent().indexOf("when") > -1);

        final AssetItem rule2 = rules.get(1);
        assertEquals("hola", rule2.getName());
        assertNotNull(rule2.getContent());
        assertEquals(AssetFormats.DRL, rule2.getFormat());
        assertTrue(rule2.getContent().indexOf("when") > -1);

        assertNotNull(ServiceImplementation.getDroolsHeader(pkg));
        assertTrue(ServiceImplementation.getDroolsHeader(pkg).indexOf("import") > -1);

        // now lets import an existing thing
        drl = "package testClassicDRLImport\n import should not see \n rule 'ola2' \n when \n then \n end \n rule 'hola' \n when \n then \n end";
        in = new ByteArrayInputStream(drl.getBytes());
        fm.importClassicDRL(in);

        pkg = fm.repository.loadPackage("testClassicDRLImport");
        assertNotNull(pkg);

        // it should not overwrite this.
        String hdr = ServiceImplementation.getDroolsHeader(pkg);
        assertTrue(hdr.indexOf("import should not see") > -1);
        assertTrue(hdr.indexOf("import blah") > -1);
        assertTrue(hdr.indexOf("import should not see") > hdr.indexOf("import blah"));

        rules = iteratorToList(pkg.getAssets());
        assertEquals(4, rules.size());

        // now we will import a change, check that it appears. a change to the
        // "ola" rule
        AssetItem assetOriginal = fm.repository.loadPackage("testClassicDRLImport").loadAsset("ola");
        long ver = assetOriginal.getVersionNumber();

        drl = "package testClassicDRLImport\n import blah \n rule 'ola' \n when CHANGED\n then \n end \n rule 'hola' \n when \n then \n end";
        in = new ByteArrayInputStream(drl.getBytes());
        fm.importClassicDRL(in);
        pkg = fm.repository.loadPackage("testClassicDRLImport");
        AssetItem asset = pkg.loadAsset("ola");

        assertTrue(asset.getContent().indexOf("CHANGED") > 0);
        assertEquals(ver + 1, asset.getVersionNumber());

    }

    public void testClassicDRLImportWithDSL() throws Exception {
        FileManagerUtils fm = new FileManagerUtils();
        fm.repository = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        String drl = "package testClassicDRLImportDSL\n import blah \n expander goo \n rule 'ola' \n when \n then \n end \n rule 'hola' \n when \n then \n end";
        InputStream in = new ByteArrayInputStream(drl.getBytes());
        fm.importClassicDRL(in);

        PackageItem pkg = fm.repository.loadPackage("testClassicDRLImportDSL");
        assertNotNull(pkg);

        List<AssetItem> rules = iteratorToList(pkg.getAssets());
        assertEquals(3, rules.size()); //its 3 cause there is the drools.package file
        AssetItem pkgConf = rules.get(0);
        assertEquals("drools", pkgConf.getName());
        assertEquals("package", pkgConf.getFormat());
        rules.remove(0);//now lets get rid of it

        final AssetItem rule1 = rules.get(0);
        assertEquals("ola", rule1.getName());
        assertNotNull(rule1.getContent());
        assertEquals(AssetFormats.DSL_TEMPLATE_RULE, rule1.getFormat());
        assertTrue(rule1.getContent().indexOf("when") > -1);

        final AssetItem rule2 = rules.get(1);
        assertEquals("hola", rule2.getName());
        assertNotNull(rule2.getContent());
        assertEquals(AssetFormats.DSL_TEMPLATE_RULE, rule2.getFormat());
        assertTrue(rule2.getContent().indexOf("when") > -1);

        assertTrue(ServiceImplementation.getDroolsHeader(pkg).indexOf("import") > -1);

    }

    public void XXtestHeadOOME() throws Exception {
        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        PackageItem pkg = repo.createPackage("testHeadOOME", "");
        ServiceImplementation.updateDroolsHeader("import java.util.List", pkg);
        pkg.updateCompiledPackage(new ByteArrayInputStream("foo".getBytes()));
        pkg.checkin("");
        repo.logout();

        int iterations = 0;

        while (true) {
            iterations++;
            FileManagerUtils fm = new FileManagerUtils();
            fm.repository = new RulesRepository(TestEnvironmentSessionHelper.getSession());

            if (iterations % 50 == 0) {
                updatePackage("testHeadOOME");
            }

            //fm.repository = new RulesRepository(TestEnvironmentSessionHelper.getSession());
            fm.getLastModified("testHeadOOME", "LATEST");
            fm.repository.logout();
            System.err.println("Number " + iterations + " free mem : " + Runtime.getRuntime().freeMemory());
        }

    }

    private void updatePackage(String nm) throws Exception {
        System.err.println("---> Updating the package ");
        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        PackageItem pkg = repo.loadPackage(nm);
        pkg.updateDescription(System.currentTimeMillis() + "");
        pkg.checkin("a change");
        repo.logout();

    }

    private List iteratorToList(Iterator assets) {
        List<AssetItem> list = new ArrayList<AssetItem>();
        for (Iterator iter = assets; iter.hasNext();) {
            AssetItem rule = (AssetItem) iter.next();
            list.add(rule);
        }
        return list;

    }

}

class MockFile implements FileItem {

    private static final long serialVersionUID = 400L;

    InputStream stream = new ByteArrayInputStream("foo bar".getBytes());

    public void setInputStream(InputStream is) throws IOException {
        stream.close();
        stream = is;
    }

    public void delete() {
    }

    public byte[] get() {

        return null;
    }

    public String getContentType() {

        return null;
    }

    public String getFieldName() {

        return null;
    }

    public InputStream getInputStream() throws IOException {
        return stream;
    }

    public String getName() {
        return "foo.bar";
    }

    public OutputStream getOutputStream() throws IOException {

        return null;
    }

    public long getSize() {
        return 0;
    }

    public String getString() {
        return null;
    }

    public String getString(String arg0) throws UnsupportedEncodingException {
        return null;
    }

    public boolean isFormField() {
        return false;
    }

    public boolean isInMemory() {
        return false;
    }

    public void setFieldName(String arg0) {

    }

    public void setFormField(boolean arg0) {

    }

    public void write(File arg0) throws Exception {

    }

}