
net.jangaroo.extxml.model.ComponentSuite Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ext-xml Show documentation
Show all versions of ext-xml Show documentation
Allows a declarative description of UI components
The newest version!
package net.jangaroo.extxml.model;
import net.jangaroo.extxml.ComponentSuiteRegistry;
import net.jangaroo.utils.log.Log;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Collections;
import java.util.Comparator;
/**
* A set of Ext JS components bundled under the same namespace.
* An XML schema can be defined that contains element definition for all component classes.
*/
public final class ComponentSuite {
private String ns;
private String namespace;
private File rootDir;
private File as3OutputDir;
private Map componentClassesByXtype = new HashMap();
private Map componentClassesByLocalName = new HashMap();
private Map componentClassesByFullClassName = new HashMap();
private Map usedComponentSuites;
private static final Comparator COMPONENT_CLASS_BY_ELEMENT_NAME_COMPARATOR = new Comparator() {
@Override
public int compare(ComponentClass cc1, ComponentClass cc2) {
return cc1.getElementName().compareTo(cc2.getElementName());
}
};
public ComponentSuite() {
this(null, null, null, null);
}
public ComponentSuite(String namespace, String namespacePrefix, File rootDir, File as3OutputDir) {
this.namespace = namespace;
this.ns = namespacePrefix;
this.rootDir = rootDir;
this.as3OutputDir = as3OutputDir;
ComponentSuiteRegistry.getInstance().add(this);
usedComponentSuites = new LinkedHashMap();
}
public void addImportedComponentSuite(ComponentSuite importedSuite) {
if(importedSuite != null) {
ComponentSuiteRegistry.getInstance().add(importedSuite);
}
}
public Map getUsedComponentSuitesByNs() {
return usedComponentSuites;
}
public Collection getUsedComponentSuites() {
return usedComponentSuites.values();
}
public String getUsedComponentSuiteNamespaces() {
StringBuilder builder = new StringBuilder();
for (Map.Entry usedComponentSuiteEntry : usedComponentSuites.entrySet()) {
builder
.append(" xmlns:")
.append(usedComponentSuiteEntry.getKey())
.append("='")
.append(usedComponentSuiteEntry.getValue().getNamespace())
.append("'");
}
return builder.toString();
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public String getNamespace() {
return namespace;
}
public void setNs(String ns) {
this.ns = ns;
}
public String getNs() {
return ns == null ? "" : ns;
}
public String getPrefix() {
return ns == null || ns.length() == 0 ? "" : ns + ":";
}
public void setRootDir(File rootDir) {
this.rootDir = rootDir;
}
public File getRootDir() {
return rootDir;
}
public void setAs3OutputDir(File as3OutputDir) {
this.as3OutputDir = as3OutputDir;
}
public File getAs3OutputDir() {
return as3OutputDir;
}
public void addComponentClass(ComponentClass cc) {
cc.setSuite(this);
componentClassesByXtype.put(cc.getXtype(), cc);
componentClassesByLocalName.put(cc.getElementName(), cc);
componentClassesByFullClassName.put(cc.getFullClassName(), cc);
}
public List getSortedComponentClasses() {
List components = new ArrayList(getComponentClasses());
Collections.sort(components, COMPONENT_CLASS_BY_ELEMENT_NAME_COMPARATOR);
return components;
}
public Collection getComponentClasses() {
return componentClassesByXtype.values();
}
public ComponentClass getComponentClassByXtype(String xtype) {
return componentClassesByXtype.get(xtype);
}
public ComponentClass getComponentClassByLocalName(String localName) {
return componentClassesByLocalName.get(localName);
}
public ComponentClass getComponentClassByNamespaceAndLocalName(String namespaceUri, String localName) {
ComponentClass componentClass = ComponentSuiteRegistry.getInstance().getComponentClass(namespaceUri, localName);
updateUsedComponentSuites(componentClass);
return componentClass;
}
public ComponentClass findComponentClassByXtype(String xtype) {
ComponentClass componentClass = ComponentSuiteRegistry.getInstance().findComponentClassByXtype(xtype);
updateUsedComponentSuites(componentClass);
return componentClass;
}
public ComponentClass getComponentClassByFullClassName(String className) {
return componentClassesByFullClassName.get(className);
}
public ComponentClass findComponentClassByFullClassName(String className) {
ComponentClass componentClass = ComponentSuiteRegistry.getInstance().findComponentClassByFullClassName(className);
updateUsedComponentSuites(componentClass);
return componentClass;
}
public List getComponentClassesByType(ComponentType type) {
ArrayList result = new ArrayList();
for (ComponentClass clazz : componentClassesByXtype.values()) {
if (type.equals(clazz.getType())) {
result.add(clazz);
}
}
return result;
}
private void updateUsedComponentSuites(ComponentClass componentClass) {
if (componentClass == null) {
return;
}
ComponentSuite importedComponentSuite = componentClass.getSuite();
if (importedComponentSuite!=this && !usedComponentSuites.containsValue(importedComponentSuite)) {
String suiteNs = importedComponentSuite.getNs();
if (suiteNs == null || suiteNs.length() == 0 || usedComponentSuites.containsKey(suiteNs)) {
// create a new unique prefix:
int index = 1;
while (usedComponentSuites.containsKey(suiteNs = "cs" + index)) {
++index;
}
importedComponentSuite.setNs(suiteNs);
}
usedComponentSuites.put(suiteNs, importedComponentSuite);
}
}
public void resolveSuperClasses() {
for (ComponentClass cc : getComponentClasses()) {
if (cc.getSuperClass() == null && cc.getSuperClassName() != null) {
Log.w("Super component class '" + cc.getSuperClassName() + "' not found.");
} else if (cc.getSuperClassName() == null && cc.getSuperClassNamespaceUri() != null && cc.getSuperClassLocalName() != null) {
ComponentClass supercl = this.getComponentClassByNamespaceAndLocalName(cc.getSuperClassNamespaceUri(), cc.getSuperClassLocalName());
if(supercl != null) {
cc.setSuperClassName(supercl.getFullClassName());
} else {
Log.e(String.format("Super component class with element name '%s' not found in component suite '%s'", cc.getSuperClassLocalName(), cc.getSuperClassNamespaceUri()));
}
}
}
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder
.append("namespace: ").append(namespace).append("\n")
.append("src root: ").append(rootDir).append("\n\n");
for (ComponentClass cc : getComponentClasses()) {
builder.append(cc).append("\n\n");
//builder.append(cc.getXtype()).append(": ").append(cc.getClassName()).append("\n");
}
return builder.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy