/*
* $Id$
*
* SARL is an general-purpose agent programming language.
* More details on http://www.sarl.io
*
* Copyright (C) 2014-2017 the original authors or authors.
*
* 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.
*/
package io.sarl.lang.mwe2.binding;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import com.google.inject.Injector;
import com.ibm.icu.text.MessageFormat;
import org.apache.log4j.Logger;
import org.eclipse.xtext.util.Strings;
import org.eclipse.xtext.xbase.lib.Pure;
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment;
import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess;
import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess.Binding;
/**
* A {@link AbstractXtextGeneratorFragment} that enables to create user-defined
* injections.
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
public class InjectionFragment2 extends AbstractXtextGeneratorFragment {
/** Logger.
*/
protected static final Logger LOG = Logger.getLogger(InjectionFragment2.class);
@Inject
private Injector injector;
private String name = getClass().getName();
private String comment;
private boolean overrideAll;
private final List<BindingElement> rtBindingElements = new ArrayList<>();
private final List<BindingElement> uiBindingElements = new ArrayList<>();
/** Set if all the injection definitions are assumed to accept overriding of
* previously defined elements.
*
* @param override <code>true</code> for accepting overriding.
*/
public void setOverrideAll(boolean override) {
this.overrideAll = override;
}
/** Replies if all the injection definitions are assumed to accept overriding of
* previously defined elements.
*
* @return <code>true</code> for accepting overriding.
*/
public boolean isOverrideAll() {
return this.overrideAll;
}
/** Change the comment for the injection fragment.
*
* @param comment the comment for the fragment.
*/
public void setComment(String comment) {
this.comment = comment;
if (!Strings.isEmpty(comment)) {
this.name = MessageFormat.format("{0} [{1}]", getClass().getName(), comment); //$NON-NLS-1$
} else {
this.name = getClass().getName();
}
}
/** Replies the name of the injection fragment.
*
* @return the name of the fragment.
*/
@Pure
public String getName() {
return this.name;
}
/** Replies the comment for the injection fragment.
*
* @return the comment for the fragment.
*/
@Pure
public String getComment() {
return this.comment;
}
/** Add runtime binding element.
*
* @param element the runtime binding element.
*/
public void addRuntime(BindingElement element) {
if (element != null) {
this.rtBindingElements.add(element);
}
}
/** Replies the runtime binding elements.
*
* @return the runtime binding elements.
*/
@Pure
public List<BindingElement> getRuntimeBindings() {
return this.rtBindingElements;
}
/** Add ui binding element.
*
* @param element the ui binding element.
*/
public void addUi(BindingElement element) {
if (element != null) {
this.uiBindingElements.add(element);
}
}
/** Replies the ui binding elements.
*
* @return the ui binding elements.
*/
@Pure
public List<BindingElement> getUiBindings() {
return this.uiBindingElements;
}
/** Add runtime/ui binding element.
*
* @param element the runtime/ui binding element.
*/
public void addBoth(BindingElement element) {
if (element != null) {
this.rtBindingElements.add(element);
this.uiBindingElements.add(element);
}
}
private void bind(GuiceModuleAccess module, List<BindingElement> bindings) {
final BindingFactory bindingFactory = this.injector.getInstance(BindingFactory.class);
bindingFactory.setName(this.name);
bindingFactory.setGuiceModule(module);
for (final BindingElement element : bindings) {
final Binding guiceBinding = bindingFactory.toBinding(element);
bindingFactory.add(guiceBinding, isOverrideAll() || element.isOverride());
}
bindingFactory.contributeToModule();
}
@Override
public void generate() {
List<BindingElement> elements;
elements = getRuntimeBindings();
if (!elements.isEmpty()) {
LOG.info(MessageFormat.format("Generating the user-defined bindings for runtime module: {0}", //$NON-NLS-1$
Strings.emptyIfNull(getComment())));
bind(getLanguage().getRuntimeGenModule(), elements);
}
elements = getUiBindings();
if (!elements.isEmpty()) {
LOG.info(MessageFormat.format("Generating the user-defined bindings for ui module: {0}", //$NON-NLS-1$
Strings.emptyIfNull(getComment())));
bind(getLanguage().getEclipsePluginGenModule(), elements);
}
}
}