blob: ab9a641c97c1d33b97f9bae53a35d0d902f28045 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Mike Norman - from Proof-of-concept, become production code
package dbws.testing.shadowddlgeneration.oldjpub;
/**
* A JavaName encapsulates the Java name of a class. A JavaName identifies the package name, the
* class name within the package, and the "generated" name of the class.
*/
public class JavaName extends LangName {
static String m_defaultPackage;
// Generated user class interface
protected String m_useItfPackage, m_useItf;
// Declared Java class interface
protected String m_declItfPackage, m_declItf;
protected String m_usePackage;
/**
* Initializes a JavaName with a package name, use name, and decl name. If the supplied package
* is null, the default package will be used. If the supplied decl name is null (the usual
* case), the decl name will be the same as the use name. The decl name is the name of the class
* that JPub generates. It is different from the use name, the name of the class that represents
* the SQL type, if the class is user-written. The user tells JPub that this is the case by
* putting the clause "GENERATE <decl class name> AS <use class name> in the input file.
*
* * @param package the package in which the class is declared
*
* @param useName
* the use name (class name for use as opposed to declaration)
* @param declName
* the decl name (class name for declaration as opposed to use)
*/
public JavaName(String packageName, String useName, String useItf, String declName,
String declItf) {
if (packageName == null) {
packageName = "";
}
int dotPos = useName.lastIndexOf('.');
if (dotPos >= 0) {
m_usePackage = packageConcat(packageName, useName.substring(0, dotPos));
m_useClass = useName.substring(dotPos + 1);
}
else {
m_usePackage = (packageName.length() > 0) ? packageName : m_defaultPackage;
m_useClass = useName;
}
try {
dotPos = useItf.lastIndexOf('.');
}
catch (Exception e) {
dotPos = -1;
}
if (dotPos >= 0) {
m_useItfPackage = packageConcat(packageName, useItf.substring(0, dotPos));
m_useItf = useItf.substring(dotPos + 1);
}
else {
m_useItfPackage = (packageName.length() > 0) ? packageName : m_defaultPackage;
m_useItf = useItf;
}
if (declName == null) {
m_context = m_usePackage;
m_name = m_useClass;
m_declItf = m_useItf;
m_declItfPackage = m_useItfPackage;
m_useItf = null;
}
else {
dotPos = declName.lastIndexOf('.');
if (dotPos >= 0) {
m_context = packageConcat(packageName, declName.substring(0, dotPos));
m_name = declName.substring(dotPos + 1);
}
else {
m_context = (packageName.length() > 0) ? packageName : m_defaultPackage;
m_name = declName;
}
try {
dotPos = declItf.lastIndexOf('.');
}
catch (Exception e) {
dotPos = -1;
}
// Only allow one interface. If both defined, use m_useItf
if (dotPos >= 0 && m_useItf == null) {
m_declItfPackage = packageConcat(packageName, declItf.substring(0, dotPos));
m_declItf = declItf.substring(dotPos + 1);
}
else {
m_declItfPackage = (packageName.length() > 0) ? packageName : m_defaultPackage;
m_declItf = declItf;
}
}
processUnicode();
}
/**
* Create a new JavaName. Do not modify the packageName, even if it is "". Both the useName and
* declName are set equal to the typeName. This constructor is used for predefined Java types.
*/
public JavaName(String packageName, String typeName) {
super(packageName = (packageName == null ? "" : packageName), typeName);
m_usePackage = packageName;
m_useClass = typeName;
processUnicode();
}
// Convert unicode in Java class/package names into ascii
private void processUnicode() {
m_name = unicode2Ascii(m_name);
m_context = unicode2Ascii(m_context);
m_declItf = unicode2Ascii(m_declItf);
m_declItfPackage = unicode2Ascii(m_declItfPackage);
m_useItf = unicode2Ascii(m_useItf);
m_useItfPackage = unicode2Ascii(m_useItfPackage);
m_useClass = unicode2Ascii(m_useClass);
m_usePackage = unicode2Ascii(m_usePackage);
}
public String toString() {
return packageConcat(getContextName(), getSimpleName());
}
/**
* Returns the package name of the decl interface
*/
@Override
public String getDeclItfPackage() {
return m_declItfPackage;
}
/**
* Returns the name of the decl interface
*/
@Override
public String getDeclItf() {
return m_declItf;
}
/**
* Returns the name of the decl interface
*/
public String getDeclItf(String currPackage) {
if (currPackage == null) {
return m_declItf;
}
return currPackage.equals(m_declItfPackage) ? m_declItf : packageConcat(m_declItfPackage,
m_declItf);
}
public String getDeclClass(String currPackage) {
if (currPackage == null) {
return m_name;
}
return currPackage.equals(m_context) ? m_useClass : packageConcat(m_context, m_name);
}
@Override
public String getUseClass() {
return m_useClass;
}
@Override
public String getUseClass(boolean full) {
if (full) {
return packageConcat(m_usePackage, m_useClass);
}
else {
return m_useClass;
}
}
/**
* Returns the package name of the use class
*/
@Override
public String getUsePackage() {
return m_usePackage;
}
/**
* Returns the package name of the use interface
*/
@Override
public String getUseItfPackage() {
return m_useItfPackage;
}
/**
* if the represented type has the user subclass
*/
@Override
public boolean hasUseClass() {
boolean has = true;
if (m_name == null || m_context == null || m_useClass == null) {
has = false;
}
else if (m_name.equals(m_useClass) && m_context.equals(m_usePackage)) {
has = false;
}
return has;
}
/**
* Returns the name to be used to refer to this class. If the package in which this class is
* mentioned is the use package of this class, return the unqualified use class name. Otherwise,
* return use package name + "." + use class name.
*
* * @param currPackage the package in which the reference occurs
*/
@Override
public String getUseClass(String currPackage) {
if (currPackage == null) {
return m_useClass;
}
return currPackage.equals(m_usePackage) ? m_useClass : packageConcat(m_usePackage,
m_useClass);
}
// Undo genpattern for SQL collections
// , which cannot have subclasses
public void ungenPattern(String simpleName) {
m_name = SqlName.sqlIdToJavaId(simpleName, true);
m_useClass = m_name;
m_usePackage = m_context;
m_useItf = null;
m_useItfPackage = m_declItfPackage;
}
/**
* Returns the name of the use interface
*/
@Override
public String getUseItf() {
return m_useItf;
}
/**
* Returns the name of the use interface
*/
public String getUseItf(String currPackage) {
if (currPackage == null) {
return packageConcat(m_useItfPackage, m_useItf);
}
return currPackage.equals(m_useItfPackage) ? m_useItf : packageConcat(m_useItfPackage,
m_useItf);
}
/**
* Initialize the JavaName class with the default package name, used when a JavaName is created
* without an explciit package name.
*
* * @param defaultPackage the name of the default package
*/
public static void setDefaultPackage(String defaultPackage) {
m_defaultPackage = defaultPackage;
}
public static String getDefaultPackage() {
return m_defaultPackage;
}
}