/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.deployer.test.modules;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.osgi.framework.Version;
/**
* A module for testing deployment/resolution problems.
* <p />
*
* <strong>Concurrent Semantics</strong><br />
* thread-safe
*
*/
public class TesterModule {
private final String moduleName;
private final Version moduleVersion;
public static final Version MINIMUM_VERSION = new Version("0");
private final Set<TesterModuleImport> moduleImports;
private final Set<TesterModuleExport> moduleExports;
public static class Builder {
private final String moduleName;
private Version moduleVersion = MINIMUM_VERSION;
private Set<TesterModuleImport> moduleImports = new HashSet<TesterModuleImport>();
private Set<TesterModuleExport> moduleExports = new HashSet<TesterModuleExport>();
public Builder(String name) {
this.moduleName = name;
}
public Builder version(String version) {
this.moduleVersion = new Version(version);
return this;
}
public Builder addImport(TesterModuleImport imp) {
this.moduleImports.add(imp);
return this;
}
public Builder addExport(TesterModuleExport exp) {
this.moduleExports.add(exp);
return this;
}
public TesterModule build() {
return new TesterModule(this);
}
}
private TesterModule(Builder builder) {
this.moduleName = builder.moduleName;
this.moduleVersion = builder.moduleVersion;
this.moduleImports = builder.moduleImports;
this.moduleExports = builder.moduleExports;
}
public String getName() {
return this.moduleName;
}
public Version getVersion() {
return this.moduleVersion;
}
public Set<TesterModuleImport> getImports() {
return this.moduleImports;
}
public Set<TesterModuleExport> getExports() {
return this.moduleExports;
}
public String getImportsEntry() {
return importsList(this.moduleImports);
}
public String getExportsEntry() {
return exportsList(this.moduleExports);
}
public List<String> getAllHeaders() {
List<String> hdrs = new ArrayList<String>();
hdrs.add("Manifest-Version: 1.0");
hdrs.add("Bundle-ManifestVersion: 2");
hdrs.add("Bundle-Name: TesterModule-" + this.moduleName);
hdrs.add("Bundle-SymbolicName: " + this.moduleName);
if (!this.moduleVersion.equals(MINIMUM_VERSION)) {
hdrs.add("Bundle-Version: " + this.moduleVersion);
}
if (!this.moduleExports.isEmpty()) {
hdrs.add("Export-Package: " + exportsList(this.moduleExports));
}
if (!this.moduleImports.isEmpty()) {
hdrs.add("Import-Package: " + importsList(this.moduleImports));
}
return hdrs;
}
private static String importsList(Set<TesterModuleImport> imports) {
boolean firstTime = true;
StringBuffer sb = new StringBuffer();
for (TesterModuleImport imp : imports) {
if (firstTime) firstTime = false;
else sb.append(",");
sb.append(imp.headerEntry());
}
return sb.toString();
}
private static String exportsList(Set<TesterModuleExport> exports) {
boolean firstTime = true;
StringBuffer sb = new StringBuffer();
for (TesterModuleExport exp : exports) {
if (firstTime) firstTime = false;
else sb.append(",");
sb.append(exp.headerEntry());
}
return sb.toString();
}
}