/*
Copyright (c) 2009 Andr� Arnold.
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:
Andr� Arnold - initial API and implementation
*/
package org.eclipse.xtend.middleend;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.emf.mwe.core.ConfigurationException;
import org.eclipse.xtend.middleend.plugins.LanguageSpecificMiddleEnd;
import org.eclipse.xtend.middleend.plugins.LanguageSpecificMiddleEndFactory;
public class LanguageContributor {
private static final Log _log = LogFactory.getLog (LanguageContributor.class);
public final static LanguageContributor INSTANCE = new LanguageContributor ();
private final Map<String, LanguageSpecificMiddleEndFactory> _middleEndContributions = new HashMap<String, LanguageSpecificMiddleEndFactory> ();
private LanguageContributor () {
}
public void addLanguageContribution (Class<? extends LanguageSpecificMiddleEndFactory> middleEndFactoryClass) throws ConfigurationException {
try {
final LanguageSpecificMiddleEndFactory factory = middleEndFactoryClass.newInstance ();
_middleEndContributions.put (factory.getName(), factory);
} catch (InstantiationException e) {
throw new ConfigurationException(e);
} catch (IllegalAccessException e) {
throw new ConfigurationException(e);
}
}
public Collection<LanguageSpecificMiddleEndFactory> getLanguageContributions () {
return _middleEndContributions.values();
}
public LanguageSpecificMiddleEndFactory getLanguageContributionByName (String middleEndName) {
return _middleEndContributions.get (middleEndName);
}
public List<LanguageSpecificMiddleEnd> getFreshMiddleEnds (Map<Class<?>, Object> specificParams) {
final List<LanguageSpecificMiddleEnd> result = new ArrayList<LanguageSpecificMiddleEnd>();
for (LanguageSpecificMiddleEndFactory factory: _middleEndContributions.values()) {
try {
result.add (factory.create (specificParams.get (factory.getClass())));
}
catch (IllegalArgumentException exc) {
// this is the official way for an implementation to withdraw from the pool for this call
_log.debug ("middle end implementation " + factory.getName() + " says it is not available: " + exc.getMessage());
}
}
return result;
}
}