blob: e940fd24b733edf0baa06f69d54c18d1af2bc70a [file] [log] [blame]
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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.
*/
/*
* XSD/DTD Model generator tool
*
* By Gregory Shrago
* 2002 - 2006
*/
package org.jetbrains.idea.devkit.dom.generator;
import org.apache.xerces.xs.XSObject;
import javax.xml.namespace.QName;
import java.io.PrintWriter;
import java.util.*;
/**
* @author Gregory.Shrago
* @author Konstantin Bulenkov
*/
public class ModelDesc {
final Map<String, String> name2replaceMap = new HashMap<String, String>();
final Map<QName, String> qname2FileMap = new HashMap<QName, String>();
final Map<String, NamespaceDesc> nsdMap = new HashMap<String, NamespaceDesc>();
final Map<String, TypeDesc> jtMap = new TreeMap<String, TypeDesc>();
public String getNSDPrefix(TypeDesc td) {
return getNSDPrefix(td.xsNamespace, td.name, td.type == TypeDesc.TypeEnum.ENUM);
}
public String getNSDPrefix(String namespace, String name, boolean isEnum) {
final int lastIdx = name.lastIndexOf(".");
if (lastIdx > -1) return name.substring(0, lastIdx + 1);
final NamespaceDesc nsd = getNSD(namespace);
if (isEnum && nsd.enumPkg != null) {
return nsd.enumPkg + ".";
}
if (nsd.pkgNames != null) {
final QName qname = new QName(namespace, name);
final String files = qname2FileMap.get(qname);
if (files != null) {
for (int i = 0; i < nsd.pkgNames.length; i += 2) {
String file = nsd.pkgNames[i];
String pkg = nsd.pkgNames[i + 1];
if (files.contains(":" + file + ":")) {
return pkg + ".";
}
}
}
}
return nsd.pkgName != null && nsd.pkgName.length() > 0 ? nsd.pkgName + "." : "";
}
public NamespaceDesc getNSD(String namespace) {
NamespaceDesc nsd = nsdMap.get(namespace);
if (nsd == null) {
nsd = nsdMap.get("");
}
return nsd;
}
public String toJavaTypeName(String tname, String ns) {
final int lastIndex = tname.lastIndexOf('.');
String xmlName = lastIndex>-1? tname.substring(lastIndex+1): tname;
NamespaceDesc nsd = getNSD(ns);
if (ns == null || !ns.endsWith(".dtd")) {
if (xmlName.endsWith(Util.ANONYMOUS_ELEM_TYPE_SUFFIX)) xmlName = xmlName.substring(0, xmlName.length() - Util.ANONYMOUS_ELEM_TYPE_SUFFIX.length());
else if (xmlName.endsWith(Util.ANONYMOUS_ATTR_TYPE_SUFFIX)) xmlName = xmlName.substring(0, xmlName.length() - Util.ANONYMOUS_ATTR_TYPE_SUFFIX.length());
else if (xmlName.endsWith(Util.TYPE_SUFFIX)) xmlName = xmlName.substring(0, xmlName.length() - Util.TYPE_SUFFIX.length());
}
String rc = Util.capitalize(Util.toJavaName(xmlName));
if (nsd.prefix != null && nsd.prefix.length()>0 && !rc.startsWith(nsd.prefix)) {
rc = nsd.prefix + rc;
}
if (Util.RESERVED_NAMES_MAP.containsKey(rc)) {
rc = Util.RESERVED_NAMES_MAP.get(rc);
}
if (name2replaceMap.containsKey(rc)) {
rc = Util.expandProperties(name2replaceMap.get(rc), nsd.props);
}
return rc;
}
public String toJavaQualifiedTypeName(XSObject xs, Map<String, NamespaceDesc> nsdMap, boolean isEnum) {
String typeName = toJavaTypeName(xs.getName(), xs.getNamespace());
return getNSDPrefix(xs.getNamespace(), xs.getName(), isEnum) + typeName;
}
public String toJavaQualifiedTypeName(String namespace, String xmlname, boolean isEnum) {
return getNSDPrefix(namespace, xmlname, isEnum) + toJavaTypeName(xmlname, namespace);
}
void dump(final PrintWriter out) {
// out.println("-- qname2FileMap ---");
// out.println(qname2FileMap);
out.println("-- nsdMap ---");
for (Map.Entry<String, NamespaceDesc> entry : nsdMap.entrySet()) {
out.println("namespace key: "+entry.getKey());
dumpNamespace(entry.getValue(), out);
}
out.println("-- jtMap ---");
for (Map.Entry<String, TypeDesc> entry : jtMap.entrySet()) {
out.println("type key: "+entry.getKey());
dumpTypeDesc(entry.getValue(), out);
}
}
private void dumpTypeDesc(TypeDesc td, PrintWriter out) {
final ArrayList<String> superList;
if (td.supers !=null) {
superList = new ArrayList<String>();
for (TypeDesc aSuper : td.supers) {
superList.add(getNSDPrefix(aSuper)+aSuper.name);
}
} else superList = null;
out.println(" name " + td.name);
out.println(" type " + td.type);
out.println(" xsName " + td.xsName);
out.println(" xsNS " + td.xsNamespace);
out.println(" dups " + td.duplicates);
out.println(" supers " + (superList!=null?superList:"null"));
out.println(" doc " + (td.documentation != null ? td.documentation.length() : "null"));
for (Map.Entry<String, FieldDesc> entry : td.fdMap.entrySet()) {
out.println(" field key: " + entry.getKey());
dumpFieldDesc(td, entry.getValue(), out);
}
}
private void dumpFieldDesc(TypeDesc td, FieldDesc fd, PrintWriter out) {
out.println(" name " + fd.name);
if (td.type == TypeDesc.TypeEnum.ENUM) return;
out.println(" clType " + fd.clType);
out.println(" required " + fd.required);
out.println(" index " + fd.idx+"/"+fd.realIndex);
out.println(" choiceOpt " + fd.choiceOpt);
out.println(" choice " + (fd.choice!=null?fd.choice.length:"null"));
out.println(" content " + fd.contentQualifiedName);
out.println(" dupIdx " + fd.duplicateIndex);
out.println(" elName " + fd.elementName);
out.println(" elType " + fd.elementType);
out.println(" def " + fd.def);
out.println(" doc " + (fd.documentation != null? fd.documentation.length(): "null"));
}
private void dumpNamespace(NamespaceDesc value, PrintWriter out) {
if (value.skip) return;
out.println(" name "+value.name);
out.println(" prefix "+value.prefix);
out.println(" pkgName "+value.pkgName);
out.println(" pkgNames "+(value.pkgNames != null?Arrays.asList(value.pkgNames):"null"));
out.println(" enumPkg "+value.enumPkg);
out.println(" super "+value.superClass);
}
}