The Schema Browser in the following example contains application schemas extending down the DemoCompanySchema branch and a RootSchema subschema called LoggingPackageSchema, which provides log file services we would like to be able to use from our application schemas.
To use the log file services in LoggingPackageSchema in this hierarchy without using a package, we would have to take one of the following actions.
Insert LoggingPackageSchema into the application schema hierarchy above the first schema in which we want to use the services. This can encourage top-heavy schema hierarchies.
Make use of global instance visibility and indirect methods (for example,
By using a package, the LoggingPackageSchema facilities can be seamlessly and type-safely used by any other schema. For the purposes of this example, imagine that LoggingPackageSchema contains the LogManager, Log, and LogTagDict classes shown in the following schema file.
LogManager completeDefinition ( referenceDefinitions allLogs: LogTagDict explicitInverse, subId = 1, number = 1; jadeMethodDefinitions create() updating, number = 1001; createLog( logTag: String; appTag: String; fileName: String): Log number = 1005; delete() updating, number = 1002; deleteLog(log: Log io) number = 1006; finalize() number = 1003; initialize() number = 1004; ) Log completeDefinition ( attributeDefinitions appTag: String[52] number = 2; fileName: String[258] number = 3; fred: Character protected, number = 5; logTag: String[52] number = 1; referenceDefinitions myLogManager: LogManager explicitEmbeddedInverse, number = 4; jadeMethodDefinitions close() number = 1001; create() updating, number = 1003; delete() updating, number = 1004; log(txt: String) number = 1005; open() number = 1002; ) LogTagDict completeDefinition ( ) memberKeyDefinitions LogTagDict completeDefinition ( appTag; logTag; ) exportedPackageDefinitions Logging ( exportedClassDefinitions Log ( exportedPropertyDefinitions appTag; fileName; logTag; exportedMethodDefinitions close; log; open; ) LogManager ( exportedPropertyDefinitions allLogs; exportedMethodDefinitions createLog; deleteLog; ) LogTagDict ( ) ) referenceDefinitions myExceptionLog: Logging::Log protected, number = 2; myLogManager: Logging::LogManager protected, number = 1; myMsgLog: Logging::Log protected, number = 4; myPollingLog: Logging::Log protected, number = 3; appInit { appInit() updating; begin create self.myLogManager transient; self.myExceptionLog := self.myLogManager.createLog('DEMO', 'ExLog', 'c:\temp\ex.log'); self.myPollingLog := self.myLogManager.createLog('DEMO', 'PollLog', 'c:\temp\poll.log'); self.myMsgLog := self.myLogManager.createLog('DEMO', 'MsgLog', 'c:\temp\msg.log'); self.myExceptionLog.open; self.myPollingLog.open; self.myMsgLog.open; self.myMsgLog.log('Opened logs ' & self.myExceptionLog.fileName & ' , ' & self.myPollingLog.fileName & ' , ' & self.myMsgLog.fileName); end; } appFini { appFini() updating; begin self.myLogManager.deleteLog(self.myExceptionLog); self.myLogManager.deleteLog(self.myPollingLog); self.myLogManager.deleteLog(self.myMsgLog); delete self.myLogManager; end; } appFini { appFini() updating; begin self.myLogManager.deleteAllLogs; delete self.myLogManager; end; }
Although LoggingPackageSchema can also contain numerous implementation classes, we are not concerned with these in this packages usage example.