package codegen.codetemplates.templatecompletion.replacementrule;
import static CIAPI.Java.logging.Log.debug;
import static CIAPI.Java.logging.Log.trace;
import static CIAPI.Java.logging.Log.error;
import static CIAPI.Java.logging.Log.warn;
import java.util.List;
import codegen.codetemplates.CodeTemplate;
import codegen.codetemplates.CompoundCodeTemplate;
/**
* Represents a replacement set from the XML
*
* @author Justin Nelson
*
*/
public class ReplacementSet extends Replacement {
private String subObjName;
private List<Replacement> subPlacemnets;
private String deilm;
/**
* Creates a new replacement set with the given arguments
*
* @param templateValue
* the template name to replace with this replacement set
* @param objectValue
* the path to retrieve the sub object
* @param objName
* the name used to refer to the object
* @param subObjName
* the name used to refer to the sub object
* @param subPlacements
* the replacements to perform on the sub object
* @param delim
* the delimiter to use to separate subsequent replacements
*/
public ReplacementSet(String templateValue, String objectValue,
String objName, String subObjName, List<Replacement> subPlacements,
String delim) {
super(templateValue, objectValue, objName);
this.subObjName = subObjName;
this.subPlacemnets = subPlacements;
this.deilm = delim;
if (this.deilm == null)
this.deilm = "";
}
@Override
public String getTemplateName() {
return templateValue;
}
@Override
public void fillTemplateHole(Object obj, CodeTemplate template) {
Object objResult = resolveValue(obj);
Iterable<?> result = (Iterable<?>) objResult;
if (result == null) {
return;
}
CompoundCodeTemplate comp = (CompoundCodeTemplate) template
.getTemplateEntry(templateValue);
CodeTemplate toFill = comp.getEmptyTemplate();
for (Object o : result) {
fillSubTemplate(o, toFill, comp);
}
}
/**
* Given a sub object, will perform all sub replacements on the code
* template.
*
* @param subObj
* the object to transform
* @param subTemplateToFill
* the template to fill using the sub object's values
* @param masterTemplate
* the master template that we will add each sub mapping to
*/
protected void fillSubTemplate(Object subObj,
CodeTemplate subTemplateToFill, CompoundCodeTemplate masterTemplate) {
CodeTemplate clone = subTemplateToFill.copyEmptyTemplate();
for (Replacement r : subPlacemnets) {
r.fillTemplateHole(subObj, clone);
}
masterTemplate.addMappingSet(clone);
}
}