| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| import com.sun.star.beans.UnknownPropertyException; |
| import com.sun.star.beans.XPropertySet; |
| import com.sun.star.container.XNameAccess; |
| import com.sun.star.lang.Locale; |
| import com.sun.star.lang.WrappedTargetException; |
| import com.sun.star.lang.XServiceInfo; |
| import com.sun.star.reflection.ParamInfo; |
| import com.sun.star.reflection.XIdlClass; |
| import com.sun.star.reflection.XIdlMethod; |
| import com.sun.star.reflection.XTypeDescription; |
| import com.sun.star.text.XTextTablesSupplier; |
| import com.sun.star.uno.Any; |
| import com.sun.star.uno.AnyConverter; |
| import com.sun.star.uno.Type; |
| import com.sun.star.uno.TypeClass; |
| import com.sun.star.uno.UnoRuntime; |
| import java.util.Enumeration; |
| import java.util.Hashtable; |
| import java.util.Vector; |
| |
| |
| |
| public class SourceCodeGenerator { |
| private Vector sExceptions = new Vector(); |
| Vector sHeaderStatements = new HeaderStatements(); |
| private XLanguageSourceCodeGenerator m_xLanguageSourceCodeGenerator; |
| private String sHeaderCode = ""; |
| private String sStatementCode = ""; |
| private String sMainMethodSignature = ""; |
| |
| private Hashtable aVariables = new Hashtable(); |
| private final String SSUFFIXSEPARATOR = "_"; |
| private final String SVARIABLENAME = "VariableName"; |
| private final String SARRAYVARIABLENAME = "VariableNameList"; |
| private final String SUNOOBJECTNAME = "oUnobject"; |
| private final String SUNOSTRUCTNAME = "aUnoStruct"; |
| private Introspector m_oIntrospector; |
| private Vector aTreepathProviders = new Vector(); |
| private XTreePathProvider xTreepathProvider = null; |
| private boolean baddExceptionHandling = false; |
| private boolean bXPropertySetExceptionsAreAdded = false; |
| private XUnoNode oInitialUnoNode = null; |
| private final String sINITIALVARIABLENAME = "_oUnoEntryObject"; |
| |
| |
| /** Creates a new instance of SourceCodeGenerator */ |
| public SourceCodeGenerator(int _nLanguage) { |
| this.setLanguage(_nLanguage); |
| m_oIntrospector = Introspector.getIntrospector(); |
| } |
| |
| |
| public String addSourceCodeOfUnoObject(XTreePathProvider _xTreepathProvider, boolean _brememberPath, boolean _bAddMethodSignature, boolean _baddHeader){ |
| String sSourceCode = ""; |
| String sVariableName = ""; |
| if (_xTreepathProvider != null) { |
| for (int i = 0; i < _xTreepathProvider.getPathCount(); i++){ |
| XUnoNode oUnoNode = _xTreepathProvider.getPathComponent(i); |
| if (i == 0){ |
| sVariableName = sINITIALVARIABLENAME; |
| oInitialUnoNode = oUnoNode; |
| } |
| else{ |
| if (oUnoNode instanceof XUnoMethodNode){ |
| XUnoMethodNode oUnoMethodNode = (XUnoMethodNode) oUnoNode; |
| if (oUnoMethodNode.isInvoked()){ |
| UnoObjectDefinition oUnoReturnObjectDefinition = getUnoObjectDefinition(_xTreepathProvider, oUnoMethodNode, i); |
| if (!isVariableDeclared(oUnoReturnObjectDefinition, this.generateVariableNameFromMethod(oUnoMethodNode.getXIdlMethod()))){ |
| // sStatementCode += "\n"; |
| sStatementCode += "\n" + getMethodStatementSourceCode(oUnoMethodNode, sVariableName, oUnoReturnObjectDefinition); |
| } |
| sVariableName = oUnoReturnObjectDefinition.getVariableName(); |
| } |
| } |
| else if (oUnoNode instanceof XUnoPropertyNode){ |
| XUnoPropertyNode oUnoPropertyNode = (XUnoPropertyNode) oUnoNode; |
| Any oReturnObject = com.sun.star.uno.Any.complete(oUnoPropertyNode.getUnoReturnObject()); |
| UnoObjectDefinition oUnoReturnObjectDefinition = new UnoObjectDefinition(oReturnObject); |
| if (!isVariableDeclared(oUnoReturnObjectDefinition, oUnoPropertyNode.getProperty().Name)){ |
| // sStatementCode += "\n"; |
| sStatementCode += "\n" + getPropertyStatementSourceCode(oUnoPropertyNode, sVariableName, oUnoReturnObjectDefinition); |
| } |
| sVariableName = oUnoReturnObjectDefinition.getVariableName(); |
| } |
| } |
| } |
| } |
| String sCompleteCode = combineCompleteSourceCode(sMainMethodSignature, _baddHeader); |
| xTreepathProvider = _xTreepathProvider; |
| if (_brememberPath){ |
| aTreepathProviders.add(_xTreepathProvider); |
| } |
| return sCompleteCode; |
| } |
| |
| |
| private void setLanguage(int _nLanguage){ |
| XLanguageSourceCodeGenerator xLanguageSourceCodeGenerator = null; |
| switch(_nLanguage){ |
| case XLanguageSourceCodeGenerator.nJAVA: |
| xLanguageSourceCodeGenerator = new JavaCodeGenerator(); |
| break; |
| case XLanguageSourceCodeGenerator.nCPLUSPLUS: |
| xLanguageSourceCodeGenerator = new CPlusPlusCodeGenerator(); |
| break; |
| case XLanguageSourceCodeGenerator.nBASIC: |
| xLanguageSourceCodeGenerator = new BasicCodeGenerator(); |
| break; |
| default: |
| System.out.println("Unknown Sourcecode Language. Check Menus!"); |
| } |
| if (xLanguageSourceCodeGenerator != null){ |
| m_xLanguageSourceCodeGenerator = xLanguageSourceCodeGenerator; |
| } |
| } |
| |
| private void resetSourceCodeGeneration(int _nLanguage){ |
| aVariables.clear(); |
| this.sHeaderStatements.clear(); |
| setLanguage(_nLanguage); |
| String sHeaderCode = ""; |
| sStatementCode = ""; |
| } |
| |
| private String generateVariableNameFromMethod(String _sMethodName, String _sPrefix, boolean _bConsiderAll){ |
| String sReturn = ""; |
| if (_sMethodName.startsWith(_sPrefix)){ |
| int nPrefixLength = _sPrefix.length(); |
| if (_sMethodName.length() > nPrefixLength){ |
| String sChar = _sMethodName.substring(nPrefixLength, nPrefixLength + 1); |
| String sUpperChar = sChar.toUpperCase(); |
| if (sUpperChar.equals(sChar)){ |
| if (_bConsiderAll){ |
| sReturn = _sMethodName; |
| } |
| else{ |
| sReturn = _sMethodName.substring(nPrefixLength, _sMethodName.length()); |
| } |
| } |
| } |
| } |
| return sReturn; |
| } |
| |
| |
| private String generateVariableNameFromMethod(XIdlMethod _xIdlMethod){ |
| // todo: refactor this!!! |
| String sMethodName = _xIdlMethod.getName(); |
| String sReturn = ""; |
| sReturn = generateVariableNameFromMethod(sMethodName, "getBy", false); |
| if (sReturn.equals("")){ |
| sReturn = generateVariableNameFromMethod(sMethodName, "get", false); |
| } |
| if (sReturn.equals("")){ |
| sReturn = generateVariableNameFromMethod(sMethodName, "attach", false); |
| } |
| if (sReturn.equals("")){ |
| sReturn = generateVariableNameFromMethod(sMethodName, "assign", false); |
| } |
| if (sReturn.equals("")){ |
| sReturn = generateVariableNameFromMethod(sMethodName, "attach", false); |
| } |
| if (sReturn.equals("")){ |
| sReturn = generateVariableNameFromMethod(sMethodName, "create", false); |
| } |
| if (sReturn.equals("")){ |
| sReturn = generateVariableNameFromMethod(sMethodName, "is", true); |
| } |
| if (sReturn.equals("")){ |
| sReturn = generateVariableNameFromMethod(sMethodName, "has", true); |
| } |
| if (sReturn.equals("")){ |
| sReturn = sMethodName; |
| } |
| return sReturn; |
| } |
| |
| |
| public String convertAllUnoObjects(int _nLanguage){ |
| String sSourceCode = ""; |
| resetSourceCodeGeneration(_nLanguage); |
| int ncount = aTreepathProviders.size(); |
| for (int i=0; i< ncount; i++){ |
| sSourceCode = addSourceCodeOfUnoObject((XTreePathProvider) aTreepathProviders.get(i), false, (i==0), (i == (ncount-1))); |
| } |
| return sSourceCode; |
| } |
| |
| private UnoObjectDefinition getUnoObjectDefinition(XTreePathProvider _xTreePathProvider, XUnoMethodNode _oUnoMethodNode, int _nindex){ |
| XUnoNode oUnoNode = null; |
| Object oUnoReturnObject = null; |
| Object[] oParamObjects = null; |
| XIdlClass xIdlClass = _oUnoMethodNode.getXIdlMethod().getReturnType(); |
| String sTypeName = xIdlClass.getName(); |
| TypeClass aTypeClass = xIdlClass.getTypeClass(); |
| if (aTypeClass.getValue() != TypeClass.VOID_value){ |
| if (_xTreePathProvider.getPathCount() > _nindex + 1){ |
| oUnoNode = _xTreePathProvider.getPathComponent(_nindex + 1); |
| oUnoReturnObject = oUnoNode.getUnoObject(); |
| } |
| } |
| if (oUnoReturnObject == null){ |
| oUnoReturnObject = _oUnoMethodNode.getLastUnoReturnObject(); |
| } |
| UnoObjectDefinition oUnoObjectDefinition = new UnoObjectDefinition(oUnoReturnObject, sTypeName, aTypeClass); |
| if (_oUnoMethodNode.hasParameters()){ |
| if (oUnoNode != null){ |
| oParamObjects = oUnoNode.getParameterObjects(); |
| } |
| else{ |
| oParamObjects = _oUnoMethodNode.getLastParameterObjects(); |
| } |
| } |
| if (oParamObjects != null){ |
| oUnoObjectDefinition.addParameterObjects(oParamObjects); |
| } |
| return oUnoObjectDefinition; |
| } |
| |
| |
| private String combineCompleteSourceCode(String _sMethodSignature, boolean _bAddHeader){ |
| String sCompleteCode = ""; |
| if (_bAddHeader){ |
| sMainMethodSignature = m_xLanguageSourceCodeGenerator.getMainMethodSignatureSourceCode(oInitialUnoNode, sINITIALVARIABLENAME); |
| m_xLanguageSourceCodeGenerator.assignqueryInterfaceHeaderSourceCode(); |
| sCompleteCode += getHeaderSourceCode(); |
| } |
| sCompleteCode += sMainMethodSignature; |
| sCompleteCode += sStatementCode; |
| if (_bAddHeader){ |
| sCompleteCode += m_xLanguageSourceCodeGenerator.getMethodTerminationSourceCode(); |
| sCompleteCode += "\n" + m_xLanguageSourceCodeGenerator.getCommentSign() + "..."; |
| } |
| return sCompleteCode; |
| } |
| |
| |
| public String getPropertyStatementSourceCode(XUnoPropertyNode _oUnoPropertyNode, String _sVariableName, UnoObjectDefinition _oUnoReturnObjectDefinition){ |
| String sReturnObjectVariableDefinition = ""; |
| String sStatement = ""; |
| String sPropertyName = _oUnoPropertyNode.getProperty().Name; |
| UnoObjectDefinition oUnoObjectDefinition = new UnoObjectDefinition(_oUnoPropertyNode.getUnoObject(), "com.sun.star.beans.XPropertySet"); |
| if (!m_xLanguageSourceCodeGenerator.needsqueryInterface() || (oUnoObjectDefinition.getTypeClass().getValue() == TypeClass.STRUCT_value)){ |
| oUnoObjectDefinition.setVariableName(_sVariableName); |
| if (oUnoObjectDefinition.getTypeClass().getValue() == TypeClass.STRUCT_value){ |
| sReturnObjectVariableDefinition = getVariableInitialization(_oUnoReturnObjectDefinition, false); |
| sStatement += m_xLanguageSourceCodeGenerator.getStructSourceCode(sReturnObjectVariableDefinition, oUnoObjectDefinition.getVariableName(), sPropertyName); |
| return sStatement; |
| } |
| } |
| sStatement += addQueryInterfaceSourceCode(oUnoObjectDefinition, _sVariableName, "com.sun.star.beans.XPropertySet"); |
| if (_oUnoReturnObjectDefinition.getTypeClass().getValue() != TypeClass.VOID_value){ |
| sReturnObjectVariableDefinition = getVariableInitialization(_oUnoReturnObjectDefinition, true); |
| } |
| sStatement += m_xLanguageSourceCodeGenerator.getPropertyValueGetterSourceCode(sPropertyName, sReturnObjectVariableDefinition, oUnoObjectDefinition.getVariableName(), _oUnoReturnObjectDefinition.getTypeClass(), _oUnoReturnObjectDefinition.getTypeName()); |
| addXPropertySetRelatedExceptions(); |
| return sStatement; |
| } |
| |
| |
| public String getMethodStatementSourceCode(XUnoMethodNode _oUnoMethodNode, String _sVariableName, UnoObjectDefinition _oUnoReturnObjectDefinition){ |
| String sReturnObjectVariableDefinition = ""; |
| String sStatement = ""; |
| XIdlMethod xIdlMethod = _oUnoMethodNode.getXIdlMethod(); |
| TypeClass aReturnTypeClass = xIdlMethod.getReturnType().getTypeClass(); |
| UnoObjectDefinition oUnoObjectDefinition = new UnoObjectDefinition(_oUnoMethodNode.getUnoObject(), _oUnoMethodNode.getClassName()); |
| String sVariableStemName = this.generateVariableNameFromMethod(xIdlMethod); |
| sStatement += addQueryInterfaceSourceCode(oUnoObjectDefinition, _sVariableName, oUnoObjectDefinition.getTypeName()); |
| if (_oUnoReturnObjectDefinition.getTypeClass().getValue() != TypeClass.VOID_value){ |
| sReturnObjectVariableDefinition = getVariableInitialization(_oUnoReturnObjectDefinition, false) + " = "; |
| } |
| Object[] oParamObjects = _oUnoReturnObjectDefinition.getParameterObjects(); |
| String sParameterCode = getMethodParameterValueDescription(_oUnoMethodNode, oParamObjects, false); |
| String sSeparator = m_xLanguageSourceCodeGenerator.getMethodSeparator(); |
| sStatement += "\t" + sReturnObjectVariableDefinition + oUnoObjectDefinition.getVariableName() + sSeparator + xIdlMethod.getName() + "(" + sParameterCode + ")"; |
| sStatement += m_xLanguageSourceCodeGenerator.getStatementTerminationCharacter(); |
| addExceptions(xIdlMethod); |
| return sStatement; |
| } |
| |
| |
| private String addQueryInterfaceSourceCode(UnoObjectDefinition _oUnoObjectDefinition, String _sVariableName, String _sTypeName){ |
| String sLocStatement = ""; |
| if (m_xLanguageSourceCodeGenerator.needsqueryInterface()){ |
| if (!isVariableDeclared(_oUnoObjectDefinition, "")){ |
| String sObjectVariableDefinition = getVariableDeclaration(_oUnoObjectDefinition, false, ""); |
| sLocStatement += m_xLanguageSourceCodeGenerator.getqueryInterfaceSourceCode(_sTypeName, sObjectVariableDefinition, _sVariableName); |
| } |
| } |
| else{ |
| _oUnoObjectDefinition.setVariableName(_sVariableName); |
| } |
| return sLocStatement; |
| } |
| |
| |
| private void addXPropertySetRelatedExceptions(){ |
| if (!bXPropertySetExceptionsAreAdded){ |
| sExceptions.add("com.sun.star.beans.UnknownPropertyException"); |
| sExceptions.add("com.sun.star.lang.WrappedTargetException"); |
| sExceptions.add("com.sun.star.lang.IllegalArgumentException"); |
| bXPropertySetExceptionsAreAdded = true; |
| baddExceptionHandling = true; |
| } |
| } |
| |
| |
| private void addExceptions(XIdlMethod _xIdlMethod){ |
| XIdlClass[] xIdlClasses = _xIdlMethod.getExceptionTypes(); |
| for (int i = 0; i > xIdlClasses.length; i++){ |
| sExceptions.add(xIdlClasses[0].getName()); |
| baddExceptionHandling = true; |
| } |
| } |
| |
| private String getRootDescription(XUnoNode _oUnoNode){ |
| return "_o" + _oUnoNode.toString(); |
| } |
| |
| |
| private String getHeaderSourceCode(){ |
| Enumeration aEnumeration = aVariables.elements(); |
| while(aEnumeration.hasMoreElements()){ |
| UnoObjectDefinition oUnoObjectDefinition = (UnoObjectDefinition) aEnumeration.nextElement(); |
| String sCurHeaderStatement = m_xLanguageSourceCodeGenerator.getHeaderSourceCode(oUnoObjectDefinition.getUnoObject(), oUnoObjectDefinition.getTypeName(), oUnoObjectDefinition.getTypeClass()); |
| sHeaderStatements.add(sCurHeaderStatement); |
| } |
| String sHeaderSourcecode = ""; |
| String[] sHeaderStatementArray = new String[sHeaderStatements.size()]; |
| sHeaderStatements.toArray(sHeaderStatementArray); |
| java.util.Arrays.sort(sHeaderStatementArray); |
| for (int i = 0; i < sHeaderStatementArray.length; i++){ |
| sHeaderSourcecode += sHeaderStatementArray[i]; |
| } |
| sHeaderSourcecode += m_xLanguageSourceCodeGenerator.getFinalHeaderStatements(); |
| return sHeaderSourcecode +"\n" + m_xLanguageSourceCodeGenerator.getCommentSign() + "...\n"; |
| } |
| |
| |
| private class HeaderStatements extends Vector{ |
| |
| public boolean contains(Object _oElement){ |
| String sCompName = (String) _oElement; |
| for (int i = 0; i < this.size(); i++){ |
| String sElement = (String) this.get(i); |
| if (sElement.equals(sCompName)){ |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| |
| public boolean add(Object _oElement){ |
| if (_oElement instanceof String){ |
| if (!contains(_oElement)){ |
| super.add(_oElement); |
| return true; |
| } |
| } |
| return false; |
| } |
| } |
| |
| |
| private boolean isVariableDeclared(UnoObjectDefinition _oUnoObjectDefinition, String _sDefaultStemName){ |
| boolean bisDeclared = false; |
| if (!_sDefaultStemName.equals("")){ |
| _oUnoObjectDefinition.setCentralVariableStemName(_sDefaultStemName); |
| } |
| String sVariableStemName = _oUnoObjectDefinition.getVariableStemName(); |
| bisDeclared = aVariables.containsKey(sVariableStemName); |
| if (bisDeclared){ |
| Object oUnoObject = _oUnoObjectDefinition.getUnoObject(); |
| if (m_oIntrospector.isObjectPrimitive(oUnoObject)){ |
| bisDeclared = false; |
| } |
| else if (m_oIntrospector.isObjectSequence(oUnoObject)){ |
| bisDeclared = false; |
| } |
| else{ |
| String sCompVariableName = sVariableStemName; |
| String sUnoObjectIdentity = oUnoObject.toString(); |
| boolean bleaveloop = false; |
| int a = 2; |
| while (!bleaveloop){ |
| if (aVariables.containsKey(sCompVariableName)){ |
| Object oUnoCompObject = ((UnoObjectDefinition) aVariables.get(sCompVariableName)).getUnoObject(); |
| String sUnoCompObjectIdentity = oUnoCompObject.toString(); |
| bleaveloop = sUnoCompObjectIdentity.equals(sUnoObjectIdentity); |
| bisDeclared = bleaveloop; |
| if (!bleaveloop){ |
| sCompVariableName = sVariableStemName + SSUFFIXSEPARATOR + a++; |
| } |
| } |
| else{ |
| bleaveloop = true; |
| bisDeclared = false; |
| } |
| } |
| } |
| } |
| return bisDeclared; |
| } |
| |
| |
| private String addUniqueVariableName(String _sStemVariableName, UnoObjectDefinition _oUnoObjectDefinition){ |
| boolean bElementexists = true; |
| int a = 2; |
| String sCompName = _sStemVariableName; |
| while (bElementexists){ |
| if (! aVariables.containsKey(sCompName)){ |
| aVariables.put(sCompName, _oUnoObjectDefinition); |
| break; |
| } |
| sCompName = _sStemVariableName + SSUFFIXSEPARATOR + a++; |
| } |
| return sCompName; |
| } |
| |
| |
| |
| private String getTypeString(String _sTypeName, TypeClass _aTypeClass, boolean _bAsHeaderSourceCode){ |
| String sTypeString = ""; |
| switch (_aTypeClass.getValue()){ |
| case TypeClass.BOOLEAN_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getbooleanTypeDescription(); |
| break; |
| case TypeClass.BYTE_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getbyteTypeDescription(); |
| break; |
| case TypeClass.CHAR_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getcharTypeDescription(); |
| break; |
| case TypeClass.DOUBLE_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getdoubleTypeDescription(); |
| break; |
| case TypeClass.FLOAT_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getfloatTypeDescription(); |
| break; |
| case TypeClass.HYPER_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.gethyperTypeDescription(); |
| break; |
| case TypeClass.LONG_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getlongTypeDescription(); |
| break; |
| case TypeClass.SHORT_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getshortTypeDescription(); |
| break; |
| case TypeClass.STRING_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getstringTypeDescription(_bAsHeaderSourceCode); |
| break; |
| case TypeClass.UNSIGNED_HYPER_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getunsignedhyperTypeDescription(); |
| break; |
| case TypeClass.UNSIGNED_LONG_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getunsignedlongTypeDescription(); |
| break; |
| case TypeClass.UNSIGNED_SHORT_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getdoubleTypeDescription(); |
| break; |
| case TypeClass.SEQUENCE_value: |
| //TODO consider mulitdimensional Arrays |
| XTypeDescription xTypeDescription = Introspector.getIntrospector().getReferencedType(_sTypeName); |
| if (xTypeDescription != null){ |
| sTypeString = getTypeString(xTypeDescription.getName(), xTypeDescription.getTypeClass(), _bAsHeaderSourceCode); |
| } |
| break; |
| case TypeClass.ANY_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getanyTypeDescription(_bAsHeaderSourceCode); |
| break; |
| case TypeClass.TYPE_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getObjectTypeDescription("com.sun.star.uno.Type", _bAsHeaderSourceCode); |
| break; |
| case TypeClass.ENUM_value: |
| case TypeClass.STRUCT_value: |
| case TypeClass.INTERFACE_ATTRIBUTE_value: |
| case TypeClass.INTERFACE_METHOD_value: |
| case TypeClass.INTERFACE_value: |
| case TypeClass.PROPERTY_value: |
| sTypeString = m_xLanguageSourceCodeGenerator.getObjectTypeDescription(_sTypeName, _bAsHeaderSourceCode); |
| break; |
| default: |
| } |
| return sTypeString; |
| } |
| |
| |
| private String getVariableDeclaration(UnoObjectDefinition _oUnoObjectDefinition, boolean _bInitialize, String _sVariableDefaultName){ |
| TypeClass aTypeClass = _oUnoObjectDefinition.getTypeClass(); |
| TypeClass aLocTypeClass = aTypeClass; |
| boolean bIsArray = false; |
| if (_oUnoObjectDefinition.getUnoObject() != null){ |
| bIsArray = m_oIntrospector.isObjectSequence(_oUnoObjectDefinition.getUnoObject()); |
| } |
| else{ |
| bIsArray = _oUnoObjectDefinition.getTypeClass().getValue() == TypeClass.SEQUENCE_value; |
| } |
| String sVariableName = _oUnoObjectDefinition.getVariableName(_sVariableDefaultName); |
| String sTypeName = _oUnoObjectDefinition.getTypeName(); |
| String sTypeString = getTypeString(sTypeName, aLocTypeClass, false); |
| if (bIsArray){ |
| XTypeDescription xTypeDescription = Introspector.getIntrospector().getReferencedType(sTypeName); |
| if (xTypeDescription != null){ |
| aLocTypeClass = xTypeDescription.getTypeClass(); |
| } |
| } |
| String sVariableDeclaration = m_xLanguageSourceCodeGenerator.getVariableDeclaration(sTypeString, sVariableName, bIsArray, aLocTypeClass, _bInitialize); |
| addUniqueVariableName(sVariableName, _oUnoObjectDefinition); |
| return sVariableDeclaration; |
| } |
| |
| |
| public String getVariableInitialization(UnoObjectDefinition _oUnoObjectDefinition, boolean _bInitialize){ |
| String sObjectVariableDeclaration = ""; |
| String sVariableName = _oUnoObjectDefinition.getVariableName(); |
| if (isVariableDeclared(_oUnoObjectDefinition, "")){ |
| sObjectVariableDeclaration = sVariableName; |
| } |
| else{ |
| sObjectVariableDeclaration = getVariableDeclaration(_oUnoObjectDefinition, _bInitialize, ""); |
| } |
| return sObjectVariableDeclaration; |
| } |
| |
| |
| |
| public String getVariableNameforUnoObject(String _sShortClassName){ |
| if (_sShortClassName.startsWith("X")){ |
| return "x" + _sShortClassName.substring(1); |
| } |
| else{ |
| return _sShortClassName; |
| } |
| } |
| |
| |
| class UnoObjectDefinition{ |
| Object m_oUnoObject = null; |
| Type aType = null; |
| String sVariableStemName = ""; |
| String m_sCentralVariableStemName = ""; |
| String sVariableName = ""; |
| String m_sTypeName = ""; |
| TypeClass m_aTypeClass = null; |
| Object[] m_oParameterObjects = null; |
| |
| |
| public UnoObjectDefinition(Any _oUnoObject){ |
| m_sTypeName = _oUnoObject.getType().getTypeName(); |
| m_aTypeClass = _oUnoObject.getType().getTypeClass(); |
| m_oUnoObject = _oUnoObject; |
| m_sCentralVariableStemName = getCentralVariableStemName(m_aTypeClass); |
| } |
| |
| |
| public UnoObjectDefinition(Object _oUnoObject, String _sTypeName, TypeClass _aTypeClass){ |
| m_oUnoObject = _oUnoObject; |
| m_sTypeName = _sTypeName; |
| m_aTypeClass = _aTypeClass; |
| m_sCentralVariableStemName = getCentralVariableStemName(m_aTypeClass); |
| } |
| |
| |
| public UnoObjectDefinition(Object _oUnoObject, String _sTypeName){ |
| m_oUnoObject = _oUnoObject; |
| m_sTypeName = _sTypeName; |
| m_aTypeClass = AnyConverter.getType(_oUnoObject).getTypeClass(); |
| m_sCentralVariableStemName = getCentralVariableStemName(m_aTypeClass); |
| } |
| |
| |
| private String getCentralVariableStemName(TypeClass _aTypeClass){ |
| String sCentralVariableStemName = ""; |
| int nTypeClass = _aTypeClass.getValue(); |
| switch(nTypeClass){ |
| case TypeClass.SEQUENCE_value: |
| //TODO consider mulitdimensional Arrays |
| XTypeDescription xTypeDescription = Introspector.getIntrospector().getReferencedType(getTypeName()); |
| if (xTypeDescription != null){ |
| sCentralVariableStemName = getCentralVariableStemName(xTypeDescription.getTypeClass()); |
| } |
| break; |
| case TypeClass.TYPE_value: |
| sCentralVariableStemName = SVARIABLENAME; |
| break; |
| case TypeClass.STRUCT_value: |
| sCentralVariableStemName = Introspector.getShortClassName(getTypeName()); |
| break; |
| case TypeClass.INTERFACE_ATTRIBUTE_value: |
| case TypeClass.INTERFACE_METHOD_value: |
| case TypeClass.INTERFACE_value: |
| case TypeClass.PROPERTY_value: |
| String sShortClassName = m_oIntrospector.getShortClassName(getTypeName()); |
| sCentralVariableStemName = getVariableNameforUnoObject(sShortClassName); |
| default: |
| sCentralVariableStemName = SVARIABLENAME; |
| } |
| return sCentralVariableStemName; |
| } |
| |
| /** may return null |
| */ |
| public Object getUnoObject(){ |
| return m_oUnoObject; |
| } |
| |
| |
| public void setTypeClass(TypeClass _aTypeClass){ |
| sVariableStemName = ""; |
| m_aTypeClass = _aTypeClass; |
| } |
| |
| |
| public TypeClass getTypeClass(){ |
| return m_aTypeClass; |
| } |
| |
| |
| public void setTypeName(String _sTypeName){ |
| sVariableStemName = ""; |
| m_sTypeName = _sTypeName; |
| } |
| |
| |
| public String getTypeName(){ |
| return m_sTypeName; |
| } |
| |
| |
| public void setCentralVariableStemName(String _sCentralVariableStemName){ |
| m_sCentralVariableStemName = _sCentralVariableStemName; |
| } |
| |
| |
| public String getVariableStemName(){ |
| if (sVariableStemName.equals("")){ |
| sVariableStemName = getVariableStemName(m_aTypeClass); |
| } |
| return sVariableStemName; |
| } |
| |
| |
| public void addParameterObjects(Object[] _oParameterObjects){ |
| m_oParameterObjects = _oParameterObjects; |
| } |
| |
| |
| public Object[] getParameterObjects(){ |
| return m_oParameterObjects; |
| } |
| |
| |
| public boolean hasParameterObjects(){ |
| boolean breturn = false; |
| if (m_oParameterObjects != null){ |
| breturn = m_oParameterObjects.length > 0; |
| } |
| return breturn; |
| } |
| |
| |
| public String getVariableStemName(TypeClass _aTypeClass){ |
| int nTypeClass = _aTypeClass.getValue(); |
| switch(nTypeClass){ |
| case TypeClass.BOOLEAN_value: |
| sVariableStemName = "b" + m_sCentralVariableStemName; |
| break; |
| case TypeClass.DOUBLE_value: |
| case TypeClass.FLOAT_value: |
| sVariableStemName = "f" + m_sCentralVariableStemName; |
| break; |
| case TypeClass.BYTE_value: |
| case TypeClass.HYPER_value: |
| case TypeClass.LONG_value: |
| case TypeClass.UNSIGNED_HYPER_value: |
| case TypeClass.UNSIGNED_LONG_value: |
| case TypeClass.UNSIGNED_SHORT_value: |
| case TypeClass.SHORT_value: |
| sVariableStemName = "n" + m_sCentralVariableStemName; |
| break; |
| case TypeClass.CHAR_value: |
| case TypeClass.STRING_value: |
| sVariableStemName = "s" + m_sCentralVariableStemName; |
| break; |
| case TypeClass.SEQUENCE_value: |
| //TODO consider mulitdimensional Arrays |
| XTypeDescription xTypeDescription = Introspector.getIntrospector().getReferencedType(getTypeName()); |
| if (xTypeDescription != null){ |
| sVariableStemName = getVariableStemName(xTypeDescription.getTypeClass()); |
| } |
| break; |
| case TypeClass.TYPE_value: |
| sVariableStemName = "a" + m_sCentralVariableStemName; |
| break; |
| case TypeClass.ANY_value: |
| sVariableStemName = "o" + m_sCentralVariableStemName; |
| break; |
| case TypeClass.STRUCT_value: |
| case TypeClass.ENUM_value: |
| sVariableStemName = "a" + m_sCentralVariableStemName; |
| break; |
| case TypeClass.INTERFACE_ATTRIBUTE_value: |
| case TypeClass.INTERFACE_METHOD_value: |
| case TypeClass.INTERFACE_value: |
| case TypeClass.PROPERTY_value: |
| String sShortClassName = m_oIntrospector.getShortClassName(getTypeName()); |
| sVariableStemName = getVariableNameforUnoObject(sShortClassName); |
| default: |
| } |
| return sVariableStemName; |
| } |
| |
| |
| private void setVariableName(String _sVariableName){ |
| sVariableName = _sVariableName; |
| } |
| |
| |
| private String getVariableName(String _sCentralVariableStemName){ |
| if (!_sCentralVariableStemName.equals("")){ |
| this.m_sCentralVariableStemName = _sCentralVariableStemName; |
| } |
| return getVariableName(); |
| } |
| |
| |
| private String getVariableName() throws NullPointerException{ |
| if (sVariableName.equals("")){ |
| int a = 2; |
| sVariableName = getVariableStemName(); |
| boolean bleaveloop = false; |
| while (!bleaveloop){ |
| if (aVariables.containsKey(sVariableName)){ |
| String sUnoObjectIdentity = ((UnoObjectDefinition) aVariables.get(sVariableName)).getUnoObject().toString(); |
| if (m_oUnoObject != null){ |
| if ((sUnoObjectIdentity.equals(m_oUnoObject.toString()) && (!m_oIntrospector.isPrimitive(this.getTypeClass())) && |
| (! m_oIntrospector.isObjectSequence(m_oUnoObject)))){ |
| bleaveloop = true; |
| } |
| else{ |
| sVariableName = getVariableStemName() + SSUFFIXSEPARATOR + a++; |
| } |
| } |
| else{ |
| bleaveloop = true; |
| } |
| } |
| else{ |
| bleaveloop = true; |
| // throw new NullPointerException("SourceCode Variable " + _sStemVariableName + " not defined"); |
| } |
| } |
| } |
| return sVariableName; |
| } |
| } |
| |
| |
| public String getStringValueOfObject(Object _oUnoObject, TypeClass _aTypeClass){ |
| String sReturn = ""; |
| switch (_aTypeClass.getValue()){ |
| case TypeClass.BOOLEAN_value: |
| boolean bbooleanValue = ((Boolean) _oUnoObject).booleanValue(); |
| sReturn += Boolean.toString(bbooleanValue); |
| case TypeClass.CHAR_value: |
| break; |
| case TypeClass.DOUBLE_value: |
| double fdoubleValue = ((Double) _oUnoObject).doubleValue(); |
| sReturn += Double.toString(fdoubleValue); |
| break; |
| case TypeClass.ENUM_value: |
| break; |
| case TypeClass.FLOAT_value: |
| float floatValue = ((Float) _oUnoObject).floatValue(); |
| sReturn += Float.toString(floatValue); |
| break; |
| case TypeClass.HYPER_value: |
| long nlongValue = ((Long) _oUnoObject).longValue(); |
| sReturn += Long.toString(nlongValue); |
| break; |
| case TypeClass.LONG_value: |
| int nintValue = ((Integer) _oUnoObject).intValue(); |
| sReturn += Integer.toString(nintValue); |
| break; |
| case TypeClass.SHORT_value: |
| short nshortValue = ((Short) _oUnoObject).shortValue(); |
| sReturn += Short.toString(nshortValue); |
| break; |
| case TypeClass.STRING_value: |
| sReturn += (String) _oUnoObject; |
| break; |
| case TypeClass.UNSIGNED_HYPER_value: |
| nlongValue = ((Long) _oUnoObject).longValue(); |
| sReturn += Long.toString(nlongValue); |
| break; |
| case TypeClass.UNSIGNED_LONG_value: |
| nintValue = ((Integer) _oUnoObject).intValue(); |
| sReturn += Integer.toString(nintValue); |
| break; |
| case TypeClass.UNSIGNED_SHORT_value: |
| nshortValue = ((Short) _oUnoObject).shortValue(); |
| sReturn += Short.toString(nshortValue); |
| break; |
| default: |
| System.out.println("Type " + _aTypeClass.getValue() + " not yet defined in 'getStringValueOfObject()'"); |
| } |
| return sReturn; |
| } |
| |
| |
| public String getMethodParameterValueDescription(XUnoMethodNode _oUnoMethodNode, Object[] _oParamObjects, boolean _bIncludeParameterNames){ |
| String sParamSourceCode = ""; |
| ParamInfo[] aParamInfos = _oUnoMethodNode.getXIdlMethod().getParameterInfos(); |
| if (_oParamObjects != null){ |
| for (int i = 0; i < _oParamObjects.length; i++){ |
| TypeClass aTypeClass = aParamInfos[i].aType.getTypeClass(); |
| if (_bIncludeParameterNames){ |
| sParamSourceCode += aParamInfos[i].aName + "="; |
| } |
| String sParamDescription = getStringValueOfObject(_oParamObjects[i], aTypeClass); |
| sParamDescription = this.m_xLanguageSourceCodeGenerator.castLiteral(sParamDescription, aTypeClass); |
| sParamSourceCode += sParamDescription; |
| |
| if (i < _oParamObjects.length - 1){ |
| sParamSourceCode += ", "; |
| } |
| } |
| } |
| return sParamSourceCode; |
| } |
| |
| |
| public class JavaCodeGenerator implements XLanguageSourceCodeGenerator{ |
| String sStatementsCode = ""; |
| boolean bAddAnyConverter = false; |
| // boolean bAddTypeImport = false; |
| boolean bIsPropertyUnoObjectDefined = false; |
| |
| public JavaCodeGenerator(){ |
| } |
| |
| |
| public String getStatementTerminationCharacter(){ |
| return ";"; |
| } |
| |
| |
| public String getHeaderSourceCode(Object _oUnoObject, String _sClassName, TypeClass _aTypeClass){ |
| String sClassName = _sClassName; |
| String sHeaderStatement = ""; |
| if (_oUnoObject != null){ |
| if (!m_oIntrospector.isObjectPrimitive(_oUnoObject)){ |
| if (m_oIntrospector.isObjectSequence(_oUnoObject)){ |
| XTypeDescription xTypeDescription = m_oIntrospector.getReferencedType(sClassName); |
| if (xTypeDescription != null){ |
| if (!m_oIntrospector.isPrimitive(xTypeDescription.getTypeClass())){ |
| sClassName = getTypeString(xTypeDescription.getName(), xTypeDescription.getTypeClass(), true); |
| } |
| // primitive Types are not supposed to turn up in the import section... |
| else{ |
| sClassName = ""; |
| } |
| } |
| } |
| else{ |
| sClassName = getTypeString(_sClassName, _aTypeClass, true); |
| } |
| } |
| else if (_aTypeClass.getValue() == TypeClass.ENUM_value){ |
| sClassName = _sClassName; |
| } |
| else{ |
| sClassName = ""; |
| } |
| if (!sClassName.equals("")){ |
| sHeaderStatement = "import " + sClassName + ";\n"; |
| } |
| } |
| return sHeaderStatement; |
| } |
| |
| |
| public String getFinalHeaderStatements(){ |
| return ""; |
| } |
| |
| |
| public void assignqueryInterfaceHeaderSourceCode(){ |
| sHeaderStatements.add("import com.sun.star.uno.UnoRuntime;\n"); |
| sHeaderStatements.add("import com.sun.star.uno.XInterface;\n"); |
| if (bAddAnyConverter){ |
| sHeaderStatements.add("import com.sun.star.uno.AnyConverter;\n"); |
| } |
| } |
| |
| |
| |
| public String getConvertedSourceCodeValueOfObject(String _sReturnVariableName, String _sObjectDescription, TypeClass _aTypeClass, String _sTypeName){ |
| boolean bLocAddAnyConverter = true; |
| String sReturn = ""; |
| switch (_aTypeClass.getValue()){ |
| case TypeClass.BOOLEAN_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toBoolean(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.CHAR_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toChar(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.BYTE_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toByte(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.DOUBLE_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toDouble(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.FLOAT_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toFloat(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.UNSIGNED_HYPER_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toUnsignedLong(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.HYPER_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toLong(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.UNSIGNED_LONG_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toUnsignedInt(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.LONG_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toInt(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.SHORT_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toShort(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.UNSIGNED_SHORT_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toUnsignedShort(" + _sObjectDescription + ")"; |
| break; |
| case TypeClass.STRING_value: |
| sReturn = _sReturnVariableName + " = AnyConverter.toString(" + _sObjectDescription + ")"; |
| break; |
| default: |
| String sShortTypeName = Introspector.getShortClassName(_sTypeName); |
| if (bIsPropertyUnoObjectDefined){ |
| sReturn = "oUnoObject = " + _sObjectDescription + ";\n\t"; |
| } |
| else{ |
| sReturn = "Object oUnoObject = " + _sObjectDescription + ";\n\t"; |
| bIsPropertyUnoObjectDefined = true; |
| } |
| sReturn += _sReturnVariableName + " = (" + sShortTypeName + ") AnyConverter.toObject(" + sShortTypeName + ".class, oUnoObject);"; |
| // this.bAddTypeImport = true; |
| break; |
| } |
| if (!bAddAnyConverter){ |
| bAddAnyConverter = bLocAddAnyConverter; |
| } |
| return sReturn; |
| } |
| |
| |
| public String getStructSourceCode(String _sReturnVariableDescription, String _sObjectDescription, String _sMember){ |
| return "\t" + _sReturnVariableDescription + " = " + _sObjectDescription + "." + _sMember + ";"; |
| } |
| |
| public String getMainMethodSignatureSourceCode(XUnoNode _oUnoNode, String _soReturnObjectDescription){ |
| //TODO try to use + _oUnoNode.getClassName() instead of the hack |
| String sReturn = "public void codesnippet(XInterface " + _soReturnObjectDescription + "){"; |
| if (baddExceptionHandling){ |
| sReturn += "\ntry{"; |
| } |
| return sReturn; |
| } |
| |
| public String getMethodSeparator(){ |
| return "."; |
| } |
| |
| public boolean needsqueryInterface(){ |
| return true; |
| } |
| |
| public String getqueryInterfaceSourceCode(String _sClassName, String _sReturnVariableName, String _sIncomingObjectName){ |
| String sShortClassName = m_oIntrospector.getShortClassName(_sClassName); |
| return "\t" + _sReturnVariableName + " = (" + sShortClassName + ") UnoRuntime.queryInterface(" + sShortClassName + ".class, " + _sIncomingObjectName + ");\n"; |
| } |
| |
| |
| public String getPropertyValueGetterSourceCode(String _sPropertyName, String _sReturnVariableName, String _sIncomingObjectName, TypeClass _aTypeClass, String _sTypeName){ |
| String sObjectDescription = _sIncomingObjectName + ".getPropertyValue(\"" + _sPropertyName + "\")"; |
| String sReturn = getConvertedSourceCodeValueOfObject(_sReturnVariableName, sObjectDescription, _aTypeClass, _sTypeName); |
| sReturn += ";"; |
| sReturn = "\t" + sReturn; |
| return sReturn; |
| // return "\t" + _sReturnVariableName + " = " + _sIncomingObjectName + ".getPropertyValue(\"" + _sPropertyName + "\");"; |
| } |
| |
| |
| public String getObjectTypeDescription(String _sClassName, boolean _bAsHeader){ |
| String sReturn = ""; |
| if (_bAsHeader){ |
| sReturn = _sClassName; |
| } |
| else{ |
| sReturn = m_oIntrospector.getShortClassName(_sClassName); |
| } |
| return sReturn; |
| } |
| |
| |
| public String getMethodTerminationSourceCode(){ |
| String sReturn = ""; |
| int nIndex = 1; |
| String sExceptionName = "e"; |
| if (baddExceptionHandling){ |
| for (int i = 0; i < sExceptions.size(); i++){ |
| String sCurException = (String) sExceptions.get(i); |
| if (sReturn.indexOf(sCurException) == -1){ |
| if (nIndex > 1){ |
| sExceptionName = "e"+ nIndex; |
| } |
| else{ |
| sReturn +="\n}"; |
| } |
| sReturn += "catch (" + sCurException + " " + sExceptionName + "){\n"; |
| sReturn += "\t" + sExceptionName + ".printStackTrace(System.out);\n"; |
| sReturn += "\t" + getCommentSign() + "Enter your Code here...\n}"; |
| nIndex++; |
| } |
| } |
| } |
| sReturn += "\n}"; |
| return sReturn; |
| } |
| |
| public String castLiteral(String _sExpression, TypeClass _aTypeClass){ |
| String sReturn = ""; |
| switch (_aTypeClass.getValue()){ |
| case TypeClass.BOOLEAN_value: |
| sReturn = _sExpression; |
| break; |
| case TypeClass.BYTE_value: |
| sReturn = "(byte) " + _sExpression; |
| break; |
| case TypeClass.CHAR_value: |
| sReturn = "'" + _sExpression + "'"; |
| break; |
| case TypeClass.DOUBLE_value: |
| sReturn = "(double) " + _sExpression; |
| break; |
| case TypeClass.FLOAT_value: |
| sReturn = "(float) " + _sExpression; |
| break; |
| case TypeClass.UNSIGNED_SHORT_value: |
| case TypeClass.SHORT_value: |
| sReturn = "(short) " + _sExpression; |
| break; |
| case TypeClass.STRING_value: |
| sReturn = "\"" + _sExpression + "\""; |
| break; |
| case TypeClass.HYPER_value: |
| case TypeClass.UNSIGNED_HYPER_value: |
| sReturn = "(long) " + _sExpression; |
| break; |
| case TypeClass.LONG_value: |
| sReturn = _sExpression; |
| break; |
| case TypeClass.ENUM_value: |
| default: |
| sReturn = _sExpression; |
| System.out.println("Type " + _aTypeClass.getValue() + " not yet defined in 'castliteral()'"); |
| } |
| return sReturn; |
| } |
| |
| |
| public String getbooleanTypeDescription(){ |
| return "boolean"; |
| } |
| |
| public String getbyteTypeDescription(){ |
| return "byte"; |
| } |
| |
| public String getshortTypeDescription(){ |
| return "short"; |
| } |
| |
| public String getunsignedshortTypeDescription(){ |
| return "short"; |
| } |
| |
| public String getlongTypeDescription(){ |
| return "int"; |
| } |
| |
| public String getunsignedlongTypeDescription(){ |
| return "int"; |
| } |
| |
| public String gethyperTypeDescription(){ |
| return "long"; |
| } |
| |
| public String getunsignedhyperTypeDescription(){ |
| return "long"; |
| } |
| |
| public String getfloatTypeDescription(){ |
| return "float"; |
| } |
| |
| public String getdoubleTypeDescription(){ |
| return "double"; |
| } |
| |
| public String getcharTypeDescription(){ |
| return "char"; |
| } |
| |
| public String getstringTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return ""; |
| } |
| else{ |
| return "String"; |
| } |
| } |
| |
| public String gettypeTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return "com.sun.star.uno.Type"; |
| } |
| else{ |
| return "Type"; |
| } |
| } |
| |
| public String getanyTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return ""; |
| } |
| else{ |
| return "Object"; |
| } |
| } |
| |
| |
| public String getStringValue(String _sValue){ |
| return _sValue; |
| } |
| |
| |
| public String getVariableDeclaration(String _sTypeString, String _sVariableName, boolean _bIsArray, TypeClass _aTypeClass, boolean _bInitialize){ |
| String sReturn = ""; |
| if (_bIsArray){ |
| sReturn = _sTypeString + "[] " + _sVariableName; |
| } |
| else{ |
| sReturn = _sTypeString + " " + _sVariableName; |
| } |
| return sReturn; |
| } |
| |
| |
| public String getArrayDeclaration(String _sVariableDeclaration){ |
| String sReturn = ""; |
| String[] sDeclarations = _sVariableDeclaration.split(" "); |
| for (int i = 0; i< sDeclarations.length;i++){ |
| sReturn += sDeclarations[i]; |
| if (i == 0){ |
| sReturn += "[]"; |
| } |
| if (i < (sDeclarations.length -1)){ |
| sReturn += " "; |
| } |
| } |
| return sReturn; |
| } |
| |
| public String getCommentSign(){ |
| return "//"; |
| } |
| } |
| |
| |
| public class BasicCodeGenerator implements XLanguageSourceCodeGenerator{ |
| String sStatementsCode = ""; |
| |
| public BasicCodeGenerator(){ |
| } |
| |
| public String getHeaderSourceCode(Object _oUnoObject, String _sClassName, TypeClass _aTypeClass){ |
| String sHeaderStatement = ""; |
| return sHeaderStatement; |
| } |
| |
| public String getFinalHeaderStatements(){ |
| return ""; |
| } |
| |
| public String getMainMethodSignatureSourceCode(XUnoNode _oUnoNode, String _soReturnObjectDescription){ |
| //TODO try to use + _oUnoNode.getClassName() instead of the hack |
| return "Sub Main(" + _soReturnObjectDescription + " as " + getanyTypeDescription(false) + ")"; |
| } |
| |
| public boolean needsqueryInterface(){ |
| return false; |
| } |
| |
| public void assignqueryInterfaceHeaderSourceCode(){ |
| } |
| |
| public String getMethodSeparator(){ |
| return "."; |
| } |
| |
| |
| public String getqueryInterfaceSourceCode(String _sClassName, String _sReturnVariableName, String _sIncomingObjectName){ |
| return _sIncomingObjectName; |
| } |
| |
| |
| public String getPropertyValueGetterSourceCode(String _sPropertyName, String _sReturnVariableName, String _sIncomingObjectName, TypeClass _aTypeClass, String _sTypeName){ |
| return "\t" + _sReturnVariableName + " = " + _sIncomingObjectName + "." + _sPropertyName; |
| } |
| |
| |
| public String getStructSourceCode(String _sReturnVariableDescription, String _sObjectDescription, String _sMember){ |
| return getPropertyValueGetterSourceCode(_sMember, _sReturnVariableDescription, _sObjectDescription, null, "" ); |
| } |
| |
| public String getConvertedSourceCodeValueOfObject(String _sReturnVariableName, String _sObjectDescription, TypeClass _aTypeClass, String _sTypeName){ |
| return _sReturnVariableName + " = " + _sObjectDescription; |
| } |
| |
| |
| public String getObjectTypeDescription(String _sClassName, boolean _bAsHeader){ |
| return "Object"; |
| } |
| |
| |
| public String getMethodTerminationSourceCode(){ |
| return "\nEnd Sub\n"; |
| } |
| |
| |
| public String castLiteral(String _sExpression, TypeClass _aTypeClass){ |
| String sReturn = ""; |
| switch (_aTypeClass.getValue()){ |
| case TypeClass.BOOLEAN_value: |
| case TypeClass.BYTE_value: |
| case TypeClass.DOUBLE_value: |
| case TypeClass.FLOAT_value: |
| case TypeClass.UNSIGNED_SHORT_value: |
| case TypeClass.SHORT_value: |
| case TypeClass.LONG_value: |
| case TypeClass.UNSIGNED_LONG_value: |
| case TypeClass.HYPER_value: |
| case TypeClass.UNSIGNED_HYPER_value: |
| sReturn = _sExpression; |
| break; |
| case TypeClass.CHAR_value: |
| case TypeClass.STRING_value: |
| sReturn = "\"" +_sExpression + "\""; |
| break; |
| case TypeClass.ENUM_value: |
| default: |
| sReturn = _sExpression; |
| System.out.println("Type " + _aTypeClass.getValue() + " not yet defined in 'castliteral()'"); |
| } |
| return sReturn; |
| } |
| |
| |
| |
| public String getbooleanTypeDescription(){ |
| return "Boolean"; |
| } |
| |
| public String getbyteTypeDescription(){ |
| return "Integer"; |
| } |
| |
| public String getshortTypeDescription(){ |
| return "Integer"; |
| } |
| |
| public String getunsignedshortTypeDescription(){ |
| return "Integer"; |
| } |
| |
| public String getlongTypeDescription(){ |
| return "Integer"; |
| } |
| |
| public String getunsignedlongTypeDescription(){ |
| return "Long"; |
| } |
| |
| public String gethyperTypeDescription(){ |
| return "Long"; |
| } |
| |
| public String getunsignedhyperTypeDescription(){ |
| return "Long"; |
| } |
| |
| public String getfloatTypeDescription(){ |
| return "Double"; |
| } |
| |
| public String getdoubleTypeDescription(){ |
| return "Double"; |
| } |
| |
| public String getcharTypeDescription(){ |
| return "String"; |
| } |
| |
| public String getstringTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return ""; |
| } |
| else{ |
| return "String"; |
| } |
| } |
| |
| public String gettypeTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return ""; |
| } |
| else{ |
| return "Object"; |
| } |
| } |
| |
| public String getanyTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return ""; |
| } |
| else{ |
| return "Object"; |
| } |
| } |
| |
| public String getStatementTerminationCharacter(){ |
| return ""; |
| } |
| |
| |
| public String getVariableDeclaration(String _sTypeString, String _sVariableName, boolean bIsArray, TypeClass _aTypeClass, boolean _bInitialize){ |
| String sReturn = ""; |
| if (bIsArray){ |
| sReturn = "Dim " + _sVariableName + "() as " + _sTypeString + "\n\t" + _sVariableName; |
| } |
| else{ |
| sReturn = "Dim " + _sVariableName + " as " + _sTypeString + "\n\t" + _sVariableName; |
| } |
| return sReturn; |
| } |
| |
| |
| public String getStringValue(String _sValue){ |
| return _sValue; |
| } |
| |
| |
| public String getArrayDeclaration(String _sVariableDeclaration){ |
| String sReturn = ""; |
| String[] sDeclarations = _sVariableDeclaration.split(" "); |
| for (int i = 0; i< sDeclarations.length;i++){ |
| sReturn += sDeclarations[i]; |
| if (i == 0){ |
| sReturn += "[]"; |
| } |
| if (i < (sDeclarations.length -1)){ |
| sReturn += " "; |
| } |
| } |
| return sReturn; |
| } |
| |
| public String getCommentSign(){ |
| return "'"; |
| } |
| |
| } |
| |
| public class CPlusPlusCodeGenerator implements XLanguageSourceCodeGenerator{ |
| String sStatementsCode = ""; |
| boolean bIncludeStringHeader = false; |
| boolean bIncludeAny = false; |
| boolean bIncludeSequenceHeader = false; |
| |
| public CPlusPlusCodeGenerator(){ |
| } |
| |
| private String getCSSNameSpaceString(){ |
| return "css"; |
| } |
| |
| public String getStatementTerminationCharacter(){ |
| return ";"; |
| } |
| |
| |
| public String getHeaderSourceCode(Object _oUnoObject, String _sClassName, TypeClass _aTypeClass){ |
| String sClassName = _sClassName; |
| String sHeaderStatement = ""; |
| if (_oUnoObject != null){ |
| if (!m_oIntrospector.isObjectPrimitive(_oUnoObject)){ |
| if (m_oIntrospector.isObjectSequence(_oUnoObject)){ |
| XTypeDescription xTypeDescription = m_oIntrospector.getReferencedType(sClassName); |
| if (xTypeDescription != null){ |
| if (!m_oIntrospector.isPrimitive(xTypeDescription.getTypeClass())){ |
| sClassName = getTypeString(xTypeDescription.getName(), xTypeDescription.getTypeClass(), true); |
| } |
| // primitive Types are not supposed to turn up in the import section... |
| else{ |
| sClassName = ""; |
| } |
| } |
| } |
| else{ |
| sClassName = getTypeString(_sClassName, _aTypeClass, true); |
| } |
| if (!sClassName.equals("")){ |
| sHeaderStatement = getHeaderOfClass(sClassName); |
| } |
| } |
| } |
| return sHeaderStatement; |
| } |
| |
| |
| |
| public String getFinalHeaderStatements(){ |
| String sReturn = ""; |
| sReturn += "\nnamespace " + getCSSNameSpaceString() + " = com::sun::star;\n"; |
| sReturn += "using namespace rtl;\n"; |
| return sReturn; |
| } |
| |
| |
| private String getHeaderOfClass(String _sClassName){ |
| return "#include \"" + _sClassName.replace('.', '/') + ".hpp\"\n"; // #include <com/sun/star/uno/XComponentContext.hpp> |
| } |
| |
| |
| |
| public void assignqueryInterfaceHeaderSourceCode(){ |
| sHeaderStatements.add("#include \"sal/config.h\"\n"); |
| sHeaderStatements.add("#include \"sal/types.h\"\n"); |
| if (bIncludeStringHeader){ |
| sHeaderStatements.add("#include \"rtl/ustring.hxx\"\n"); |
| } |
| sHeaderStatements.add("#include \"com/sun/star/uno/Reference.hxx\"\n"); |
| if (bIncludeSequenceHeader){ |
| sHeaderStatements.add("#include \"com/sun/star/uno/Sequence.hxx\"\n"); |
| } |
| sHeaderStatements.add(getHeaderOfClass("com.sun.star.uno.XInterface")); |
| if (bIncludeAny){ |
| sHeaderStatements.add(getHeaderOfClass("com.sun.star.uno.Any")); |
| } |
| } |
| |
| |
| public String getMainMethodSignatureSourceCode(XUnoNode _oUnoNode, String _soReturnObjectDescription){ |
| String sReturn = ""; |
| sReturn = "void codesnippet(const " + getCSSNameSpaceString() + "::uno::Reference<" + getCSSNameSpaceString() + "::uno::XInterface>& " + _soReturnObjectDescription + " ){"; |
| int a = 0; |
| if (!sExceptions.contains("com.sun.star.uno.RuntimeException")){ |
| sExceptions.add("com.sun.star.uno.RuntimeException"); |
| } |
| if (baddExceptionHandling){ |
| sReturn += "\n//throw "; |
| for (int i = 0; i < sExceptions.size(); i++){ |
| String sCurException = (String) sExceptions.get(i); |
| if (sReturn.indexOf(sCurException) == -1){ |
| if (a++ > 0){ |
| sReturn += ", "; |
| } |
| sReturn += getObjectTypeDescription(sCurException, false); |
| |
| } |
| } |
| |
| } |
| sReturn += "{"; |
| return sReturn; |
| } |
| |
| |
| public boolean needsqueryInterface(){ |
| return true; |
| } |
| |
| |
| public String getqueryInterfaceSourceCode(String _sClassName, String _sReturnVariableName, String _sIncomingObjectName){ |
| return "\t" + _sReturnVariableName + "( " + _sIncomingObjectName + ", " + getCSSNameSpaceString() + "::uno::UNO_QUERY_THROW);\n"; |
| } |
| |
| |
| public String getPropertyValueGetterSourceCode(String _sPropertyName, String _sReturnVariableName, String _sIncomingObjectName, TypeClass _aTypeClass, String _sTypeName){ |
| String sFirstLine = "\t"; |
| String sReturnVariableName = _sReturnVariableName; |
| // e.g. uno::Any a = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" )) ); |
| String[] sVarDefinition = _sReturnVariableName.split("="); |
| if (sVarDefinition.length > 0){ |
| String sVariable = sVarDefinition[0]; |
| String[] sVarDeclaration = sVariable.split(" "); |
| if (sVarDeclaration.length > 0){ |
| sFirstLine += sReturnVariableName + ";\n"; |
| sReturnVariableName = sVarDeclaration[sVarDeclaration.length-1]; |
| } |
| } |
| String sObjectDescription = _sIncomingObjectName + "->getPropertyValue(" + getStringValue(_sPropertyName) + ")"; |
| String sSecondLine = "\t" + getConvertedSourceCodeValueOfObject(sReturnVariableName, sObjectDescription, _aTypeClass, _sTypeName) + ";"; |
| return sFirstLine + sSecondLine; |
| } |
| |
| |
| public String getStructSourceCode(String _sReturnVariableDescription, String _sObjectDescription, String _sMember){ |
| return "\t" + _sReturnVariableDescription + " = " + _sObjectDescription + "->" + _sMember + ";"; |
| } |
| |
| |
| public String getConvertedSourceCodeValueOfObject(String _sReturnVariableName, String _sObjectDescription, TypeClass _aTypeClass, String _sTypeName){ |
| // if (m_oIntrospector.isPrimitive(_aTypeClass)){ |
| return _sObjectDescription + " >>= " + _sReturnVariableName; |
| // } |
| // else{ |
| // return _sReturnVariableName + " = " + _sObjectDescription; |
| // } |
| } |
| |
| |
| public String getStringValue(String _sValue){ |
| bIncludeStringHeader = true; |
| return "OUString(RTL_CONSTASCII_USTRINGPARAM(\"" + _sValue + "\"))"; |
| } |
| |
| |
| public String getObjectTypeDescription(String _sClassName, boolean _bAsHeader){ |
| String sReturn = ""; |
| if (_bAsHeader){ |
| sReturn = _sClassName.replace('.', '/'); |
| } |
| else{ |
| String sModuleName = m_oIntrospector.getModuleName(_sClassName); |
| sModuleName = m_oIntrospector.getShortClassName(sModuleName); |
| sReturn = getCSSNameSpaceString() + "::" + sModuleName + "::" + m_oIntrospector.getShortClassName(_sClassName); |
| } |
| return sReturn; |
| } |
| |
| |
| public String getMethodTerminationSourceCode(){ |
| return "\n}"; |
| } |
| |
| public String getMethodSeparator(){ |
| return "->"; |
| } |
| |
| |
| public String castLiteral(String _sExpression, TypeClass _aTypeClass){ |
| String sReturn = ""; |
| switch (_aTypeClass.getValue()){ |
| case TypeClass.BOOLEAN_value: |
| case TypeClass.BYTE_value: |
| case TypeClass.DOUBLE_value: |
| case TypeClass.FLOAT_value: |
| case TypeClass.UNSIGNED_SHORT_value: |
| case TypeClass.SHORT_value: |
| case TypeClass.LONG_value: |
| case TypeClass.UNSIGNED_LONG_value: |
| case TypeClass.HYPER_value: |
| case TypeClass.UNSIGNED_HYPER_value: |
| sReturn = _sExpression; |
| break; |
| case TypeClass.CHAR_value: |
| sReturn = "'" + _sExpression + "'"; |
| break; |
| case TypeClass.STRING_value: |
| sReturn = getStringValue(_sExpression); |
| break; |
| case TypeClass.ENUM_value: |
| default: |
| sReturn = _sExpression; |
| System.out.println("Type " + _aTypeClass.getValue() + " not yet defined in 'castliteral()'"); |
| } |
| return sReturn; |
| } |
| |
| public String getbooleanTypeDescription(){ |
| return "sal_Bool"; |
| } |
| |
| public String getbyteTypeDescription(){ |
| return "sal_Int8"; |
| } |
| |
| public String getshortTypeDescription(){ |
| return "sal_Int16"; |
| } |
| |
| public String getunsignedshortTypeDescription(){ |
| return "sal_uInt16"; |
| } |
| |
| public String getlongTypeDescription(){ |
| return "sal_Int32"; |
| } |
| |
| public String getunsignedlongTypeDescription(){ |
| return "sal_uInt32"; |
| } |
| |
| public String gethyperTypeDescription(){ |
| return "sal_Int64"; |
| } |
| |
| public String getunsignedhyperTypeDescription(){ |
| return "sal_uInt64"; |
| } |
| |
| public String getfloatTypeDescription(){ |
| return "float"; |
| } |
| |
| public String getdoubleTypeDescription(){ |
| return "double"; |
| } |
| |
| public String getcharTypeDescription(){ |
| return "sal_Unicode"; |
| } |
| |
| public String getstringTypeDescription(boolean _bAsHeaderSourceCode){ |
| bIncludeStringHeader = true; |
| if (_bAsHeaderSourceCode){ |
| return ""; |
| } |
| else{ |
| return "OUString"; |
| } |
| } |
| |
| public String gettypeTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return "com/sun/star/uno/Type"; |
| } |
| else{ |
| return "Type"; |
| } |
| } |
| |
| public String getanyTypeDescription(boolean _bAsHeaderSourceCode){ |
| if (_bAsHeaderSourceCode){ |
| return "com/sun/star/uno/XInterface"; |
| } |
| else{ |
| return "XInterface"; |
| } |
| } |
| |
| |
| public String getVariableDeclaration(String _sTypeString, String _sVariableName, boolean bIsArray, TypeClass _aTypeClass, boolean _bInitialize){ |
| boolean bIsPrimitive = m_oIntrospector.isPrimitive(_aTypeClass); |
| |
| // uno::Reference< frame::XDispatch > m_xDispatch |
| String sReturn = ""; |
| if (bIsArray){ |
| bIncludeSequenceHeader = true; |
| sReturn = getCSSNameSpaceString() + "::uno::Sequence<" + _sTypeString + "> " + _sVariableName; |
| } |
| else{ |
| if (bIsPrimitive){ |
| sReturn = _sTypeString + " " + _sVariableName; |
| if (_bInitialize){ |
| switch (_aTypeClass.getValue()){ |
| case TypeClass.BOOLEAN_value: |
| sReturn = sReturn + " = false"; |
| break; |
| case TypeClass.BYTE_value: |
| case TypeClass.UNSIGNED_SHORT_value: |
| case TypeClass.SHORT_value: |
| case TypeClass.LONG_value: |
| case TypeClass.UNSIGNED_LONG_value: |
| case TypeClass.HYPER_value: |
| case TypeClass.UNSIGNED_HYPER_value: |
| sReturn = sReturn + " = 0"; |
| break; |
| case TypeClass.DOUBLE_value: |
| case TypeClass.FLOAT_value: |
| sReturn = sReturn + " = 0.0"; |
| break; |
| case TypeClass.CHAR_value: |
| sReturn = sReturn + "'0'"; |
| break; |
| case TypeClass.STRING_value: |
| sReturn = _sTypeString + " " + _sVariableName; |
| break; |
| default: |
| sReturn = _sTypeString + " " + _sVariableName; |
| System.out.println("Type " + _aTypeClass.getValue() + " not yet defined in 'getVariableDeclaration()'"); |
| } |
| } |
| } |
| else{ |
| sReturn = getCSSNameSpaceString() + "::uno::Reference<" + _sTypeString + "> " +_sVariableName; |
| } |
| } |
| return sReturn; |
| } |
| |
| public String getArrayDeclaration(String _sVariableDeclaration){ |
| this.bIncludeSequenceHeader = true; |
| String sReturn = ""; |
| String[] sDeclarations = _sVariableDeclaration.split(" "); |
| if (sDeclarations.length == 2){ |
| sReturn = getCSSNameSpaceString() +"::uno::Sequence<" + sDeclarations[1] + ">"; |
| } |
| return sReturn; |
| } |
| |
| public String getCommentSign(){ |
| return "//"; |
| } |
| |
| } |
| } |