/*******************************************************************************
* Copyright (c) 2009 Vlad Dumitrescu and others. 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: Vlad Dumitrescu
*******************************************************************************/
package org.erlide.backend.internal;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Set;
import org.eclipse.xtext.xbase.lib.Pair;
import org.erlide.backend.api.ICodeBundle;
import org.erlide.backend.debug.BeamUtil;
import org.erlide.runtime.runtimeinfo.RuntimeVersion;
import org.erlide.util.ErlLogger;
import org.osgi.framework.Bundle;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
public class CodeBundle implements ICodeBundle {
private final RuntimeVersion version;
private final Multimap<CodeContext, String> paths;
private final Collection<Pair<String, String>> inits;
private final Bundle bundle;
public CodeBundle(final Bundle bundle, final RuntimeVersion version,
final Multimap<CodeContext, String> paths,
final Collection<Pair<String, String>> inits) {
this.bundle = bundle;
this.version = version;
this.paths = HashMultimap.create();
this.paths.putAll(paths);
this.inits = inits;
}
@Override
public Bundle getBundle() {
return bundle;
}
@Override
public Collection<String> getEbinDirs(final CodeContext context) {
final Collection<String> result = Lists.newArrayList();
for (final String path : getEbinPaths(context)) {
final String aPath = bundlePathToDir(path);
if (aPath != null) {
result.add(aPath);
} else {
ErlLogger.warn(
"Can't access path %s, "
+ "plugin %s may be incorrectly built (%s)",
path, bundle.getSymbolicName(), context.toString());
}
}
return result;
}
private String bundlePathToDir(final String path) {
final String entryName = path.replace(" ", "%20");
final URL entry = bundle.getEntry(entryName);
if (entry != null) {
return BeamUtil.getPathFromUrl(entry);
}
return null;
}
@Override
public Collection<Pair<String, String>> getInits() {
return Collections.unmodifiableCollection(inits);
}
@Override
public RuntimeVersion getVersion() {
return version;
}
@Override
public Collection<String> getEbinPaths(final CodeContext context) {
final Set<String> result = Sets.newHashSet();
result.addAll(paths.get(context));
result.addAll(paths.get(CodeContext.COMMON));
return result;
}
@Override
public Collection<URL> getEbinBeamURLs(final CodeContext context) {
// TODO test with spaces in path too
final Collection<URL> result = Lists.newArrayList();
for (final String path : getEbinPaths(context)) {
final Enumeration<String> beams = bundle.getEntryPaths(path);
while (beams.hasMoreElements()) {
final String beam = beams.nextElement();
result.add(bundle.getEntry(beam));
}
}
return result;
}
}