package org.anodyneos.xpImpl.translater;
import java.io.StringWriter;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.Properties;
import java.util.Stack;
import org.anodyneos.commons.xml.sax.BaseContext;
import org.anodyneos.xp.tagext.TagLibraryRegistry;
import org.anodyneos.xpImpl.util.CodeWriter;
import org.xml.sax.InputSource;
public class TranslaterContext extends BaseContext implements TranslaterResult {
public static final String DEFAULT_PACKAGE = "xp";
private CodeWriter mainCodeWriter;
private TagLibraryRegistry taglibRegistry;
private String className;
private String packageName;
private Stack fragmentCodeWriters = new Stack();
private ArrayList fragments = new ArrayList();
private int tagVariableCounter = 0;
private int savedXPOutVariableCounter = 0;
private Properties outputProperties;
private Map bufferedStartPrefixMappings = new HashMap();
// A list of files on which this current file depends
private List dependents = new ArrayList();
public TranslaterContext(InputSource is, CodeWriter codeWriter, TagLibraryRegistry taglibRegistry) {
super(is);
this.mainCodeWriter = codeWriter;
this.taglibRegistry = taglibRegistry;
}
public void setFullClassName(String fullClassName) {
if (null == fullClassName) {
this.packageName = null;
this.className = null;
} else {
fullClassName = fullClassName.trim();
int lastDot = fullClassName.lastIndexOf(".");
if (lastDot != -1) {
this.packageName = fullClassName.substring(0, lastDot);
this.className = fullClassName.substring(lastDot + 1);
} else {
this.packageName = null;
this.className = fullClassName;
}
}
}
public String getFullClassName() {
if (packageName != null) {
return packageName + "." + className;
} else {
return className;
}
}
public void setPackageName(String packageName) {
packageName = packageName.trim();
this.packageName = packageName;
}
public String getPackageName() {
return this.packageName;
}
public void setClassName(String className) {
className = className.trim();
this.className = className;
}
public String getClassName() {
return this.className;
}
/**
* @return the current codewriter. Each fragment will have its own
* codewriter.
*/
public CodeWriter getCodeWriter() {
if (! fragmentCodeWriters.empty()) {
return (CodeWriter) fragmentCodeWriters.peek();
} else {
return mainCodeWriter;
}
}
public TagLibraryRegistry getTagLibraryRegistry() {
return taglibRegistry;
}
public int startFragment() {
int num = fragments.size();
StringWriter sw = new StringWriter();
fragments.add(sw);
CodeWriter cw = new CodeWriter(sw);
cw.indentPlus().indentPlus().indentPlus();
fragmentCodeWriters.push(cw);
return num;
}
public void endFragment() {
CodeWriter cw = (CodeWriter) fragmentCodeWriters.pop();
cw.flush();
cw.close();
}
public int getFragmentCount() {
return fragments.size();
}
public String getFragment(int index) {
return ((StringWriter) fragments.get(index)).toString();
}
public String getVariableForTag(String newClassName) {
return "tag" + tagVariableCounter++;
}
public String getVariableForSavedXPOut() {
return "savedXPOut" + savedXPOutVariableCounter++;
}
public boolean inFragment() {
return fragmentCodeWriters.size() > 0;
}
public void addDependent(String dependent){
dependents.add(dependent);
}
public List getDependents(){
return Collections.unmodifiableList(dependents);
}
public Properties getOutputProperties() {
return outputProperties;
}
public void setOutputProperties(Properties outputProperties) {
this.outputProperties = outputProperties;
}
public Map getBufferedStartPrefixMappings() {
return Collections.unmodifiableMap(bufferedStartPrefixMappings);
}
public void clearBufferedStartPrefixMappings() {
bufferedStartPrefixMappings.clear();
}
public void bufferStartPrefixMapping(String prefix, String uri) {
bufferedStartPrefixMappings.put(prefix, uri);
}
}