org.apache.cxf.dosgi.systests.common.AbstractDosgiSystemTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.cxf.dosgi.systests.common.AbstractDosgiSystemTest.java

Source

/** 
  * Licensed to the Apache Software Foundation (ASF) under one 
  * or more contributor license agreements. See the NOTICE file 
  * distributed with this work for additional information 
  * regarding copyright ownership. The ASF licenses this file 
  * to you 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. 
  */
package org.apache.cxf.dosgi.systests.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.jar.Manifest;

import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.osgi.test.AbstractConfigurableBundleCreatorTests;

public abstract class AbstractDosgiSystemTest extends AbstractConfigurableBundleCreatorTests {
    private Properties dependencies;

    // -------------------------------------------------------------------
    // These methods are copied from the SMX Kernel Testing component. They
    // are copied from the 
    // org.apache.servicemix.kernel.testing.support.AbstractIntegrationTest 
    // class. SMX Kernel 1.0 doesn't seem to work with Spring-DM 1.2, so 
    // thats why these methods are duplicated here for the moment...
    // -------------------------------------------------------------------
    protected String getBundle(String groupId, String artifactId) {
        return groupId + "," + artifactId + "," + getBundleVersion(groupId, artifactId);
    }

    protected String getBundleVersion(String groupId, String artifactId) {
        if (dependencies == null) {
            try {
                File f = new File(System.getProperty("basedir"),
                        "target/classes/META-INF/maven/dependencies.properties");
                Properties prop = new Properties();
                prop.load(new FileInputStream(f));
                dependencies = prop;
            } catch (IOException e) {
                throw new IllegalStateException("Unable to load dependencies informations", e);
            }
        }
        String version = dependencies.getProperty(groupId + "/" + artifactId + "/version");
        if (version == null) {
            throw new IllegalStateException(
                    "Unable to find dependency information for: " + groupId + "/" + artifactId + "/version");
        }
        return version;
    }

    protected File localMavenBundle(String groupId, String artifact, String version, String classifier,
            String type) {
        String defaultHome = new File(new File(System.getProperty("user.home")), ".m2/repository")
                .getAbsolutePath();
        File repositoryHome = new File(System.getProperty("localRepository", defaultHome));

        StringBuffer location = new StringBuffer(groupId.replace('.', '/'));
        location.append('/');
        location.append(artifact);
        location.append('/');
        location.append(getSnapshot(version));
        location.append('/');
        location.append(artifact);
        location.append('-');
        location.append(version);
        if (classifier != null) {
            location.append('-');
            location.append(classifier);
        }
        location.append(".");
        location.append(type);

        return new File(repositoryHome, location.toString());
    }

    protected static boolean isTimestamped(String version) {
        return version.matches(".+-\\d\\d\\d\\d\\d\\d\\d\\d\\.\\d\\d\\d\\d\\d\\d-\\d+");
    }

    protected static String getSnapshot(String version) {
        if (isTimestamped(version)) {
            return version.substring(0, version.lastIndexOf('-', version.lastIndexOf('-') - 1)) + "-SNAPSHOT";
        }
        return version;
    }

    protected void installBundle(String groupId, String artifactId, String classifier, String type)
            throws Exception {
        String version = getBundleVersion(groupId, artifactId);
        File loc = localMavenBundle(groupId, artifactId, version, classifier, type);
        Bundle bundle = bundleContext.installBundle(loc.toURI().toString());
        bundle.start();
    }
    // -------------------------------------------------------------------
    // End of SMX Kernel methods.
    // -------------------------------------------------------------------

    protected Manifest getManifest() {
        // let the testing framework create/load the manifest
        Manifest mf = super.getManifest();
        String importP = mf.getMainAttributes().getValue(Constants.IMPORT_PACKAGE);
        mf.getMainAttributes().putValue(Constants.IMPORT_PACKAGE, importP);
        mf.getMainAttributes().putValue(Constants.DYNAMICIMPORT_PACKAGE, "*");

        return mf;
    }

    @Override
    protected String[] getTestFrameworkBundlesNames() {
        List<String> names = new ArrayList<String>(Arrays.asList(super.getTestFrameworkBundlesNames()));
        fixLog4J(names);
        names.add(getBundle("org.apache.felix", "org.osgi.compendium"));
        return names.toArray(new String[names.size()]);
    }

    private void fixLog4J(List<String> names) {
        for (Iterator<String> it = names.iterator(); it.hasNext();) {
            if (it.next().equals("org.springframework.osgi,log4j.osgi,1.2.15-SNAPSHOT")) {
                it.remove();
                break;
            }
        }
        // replace it with a better version
        names.add("org.apache.log4j,com.springsource.org.apache.log4j,1.2.15");
    }

    @Override
    protected Resource[] getTestBundles() {
        // Return the bundles for the current distribution, filtering out the 
        // ones that are already installed as part of the testing framework.
        // At the end the test subclass is called to obtain the test bundles.

        List<String> frameworkBundleNames = new ArrayList<String>();
        for (Resource r : getTestFrameworkBundles()) {
            frameworkBundleNames.add(r.getFilename());
        }

        try {
            List<Resource> resources = new ArrayList<Resource>();
            for (File file : getDistributionBundles()) {
                if (!frameworkBundleNames.contains(file.getName())) {
                    resources.add(new FileSystemResource(file));
                }
            }

            resources.addAll(Arrays.asList(super.getTestBundles()));
            return resources.toArray(new Resource[resources.size()]);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    protected abstract File[] getDistributionBundles() throws Exception;
}