package org.dresdenocl.tools.codegen.declarativ.code.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.dresdenocl.tools.codegen.declarativ.IOcl2DeclSettings;
import org.dresdenocl.tools.codegen.declarativ.code.ICode;
import org.dresdenocl.tools.codegen.declarativ.code.IComplexCode;
import org.dresdenocl.tools.codegen.declarativ.mapping.Guide;
import org.dresdenocl.tools.template.ITemplate;
public class Code implements IComplexCode {
private ITemplate template;
private final static String aliasName = "temp";
private final static String selfName = "self";
private final static String[] aliase = { "alias", "alias1", "alias2" };
private Map<String, List<ICode>> attributes;
private Guide guide;
private final static List<String> aliasList = new LinkedList<String>();
public Code(IComplexCode code,String templateName, IOcl2DeclSettings mySettings) {
this(templateName,mySettings);
if (code instanceof Code) {
attributes.putAll(((Code)code).attributes);
this.guide = ((Code)code).guide;
guide.reset();
}
}
public Code (String templateName, IOcl2DeclSettings mySettings,Guide guide) {
this(templateName,mySettings);
this.guide = guide;
}
public Code (String templateName, IOcl2DeclSettings mySettings) {
ITemplate template = mySettings.getTemplateGroup().getTemplate(templateName);
if (template == null)
throw new NullPointerException();
setTemplate(template);
attributes = new TreeMap<String, List<ICode>>();
guide = null;
}
public String getTemplateName() {
return template.getName();
}
public String getResult() {
this.readAllAlias();
String result = toString();
aliasList.clear();
return result;
}
private String readAlias(String name) {
if (aliasList.contains(name))
return aliasName + (aliasList.indexOf(name) + 1);
else
return name;
}
public void setTemplate(ITemplate template) {
this.template = template;
}
public void addCode(String text, ICode code) {
if (attributes.containsKey(text)) {
attributes.get(text).add(code);
}
else {
changeCode(text, code);
}
}
public void changeCode(String text, ICode code) {
List<ICode> codes = new LinkedList<ICode>();
codes.add(code);
attributes.put(text, codes);
}
public String toString() {
template.reset();
for (String s : attributes.keySet()) {
for (ICode code : attributes.get(s)) {
if (code != null) {
String text = code.toString();
if (text != null) {
if (Arrays.asList(aliase).contains(s)) {
template.setAttribute(s, readAlias(text));
}
else {
template.setAttribute(s, text);
}
}
}
}
}
return template.toString();
}
public IComplexCode getComplexCode(String name) {
if (!attributes.containsKey(name) || !(attributes.get(name).get(0) instanceof IComplexCode))
return null;
return (IComplexCode)attributes.get(name).get(0);
}
public ICode getCode(String name) {
if (!attributes.containsKey(name))
return null;
return attributes.get(name).get(0);
}
protected void readAllAlias() {
for (String s : aliase) {
if (attributes.containsKey(s)) {
if (getCode(s) != null
&& !aliasList.contains(getCode(s).getResult())) {
if (attributes.get(s).size() != 0) {
if (!getCode(s).toString().equals(selfName))
aliasList.add(getCode(s).toString());
}
}
}
}
for (List<ICode> codes : attributes.values()) {
for (ICode code : codes) {
if (code instanceof Code)
((Code) code).readAllAlias();
}
}
}
public void moveCode(String oldName, String newName) {
attributes.put(newName, removeCode(oldName));
}
public List<ICode> removeCode(String name) {
return attributes.remove(name);
}
public ICode getAlias() {
return getCode("alias");
}
public List<ICode> getWhere() {
if (guide != null) {
List<ICode> returnValue = new ArrayList<ICode>();
for (String where : guide.getWhere()) {
returnValue.add(new CodeString(where));
}
}
return null;
}
public List<ICode> getSelect() {
if (guide != null) {
List<ICode> returnValue = new ArrayList<ICode>();
for (String select : guide.getSelect()) {
returnValue.add(new CodeString(select));
}
}
return null;
}
public ICode getFrom() {
if (guide != null) {
return new CodeString(guide.getFrom());
}
return null;
}
}