| 1 |
package OEF::Why::Queue; |
package OEF::Why::Queue; |
| 2 |
|
|
| 3 |
|
|
| 4 |
|
=pod |
| 5 |
|
|
| 6 |
|
- computing convenience from windows perspective/view[point]: |
| 7 |
|
- base level: |
| 8 |
|
- gnu -> cygwin |
| 9 |
|
- user-level: |
| 10 |
|
- two hotsync-buttons: |
| 11 |
|
- synchronize files with others: |
| 12 |
|
RsyncHere|RsyncThere -> rsync -> cygwin -> SSH-client-library -> (SSH-daemon -> [cygwin] -> remote-filesystem) |
| 13 |
|
- synchronize addresses with others: |
| 14 |
|
Outlook -> OLE -> outlook2ldap -> Net::LDAP[S] -> (LDAP-daemon -> (LDAP-daemon-storage-impl.: dbm|proxy|mysql?) -> remote-filesystem) |
| 15 |
|
- various "init"-scripts: |
| 16 |
|
- rsync: like the rsync.conf-preparation from ilo.de (it's a .bat) |
| 17 |
|
- (vs.) other ssh-keygen-automation-scripts |
| 18 |
|
- windows-settings (explorer, internet explorer) |
| 19 |
|
- office (ms word, ms excel) |
| 20 |
|
- unattended.sourceforge.net |
| 21 |
|
- ideas (for the XyzHere-series) |
| 22 |
|
- for the Internet Explorer: "mail/post link (including top-page) here" (to preconfigured|selected target) |
| 23 |
|
|
| 24 |
|
- use Tom or Pixie for live-object-passivation? |
| 25 |
|
- the current attempt is going into the Tom-direction (Data::Storage::Handler::Tom, OEF::Component::Task) |
| 26 |
|
|
| 27 |
|
- have Data::Map load its mappings from (e.g.): |
| 28 |
|
- a csv-file |
| 29 |
|
- a ldap-dn |
| 30 |
|
|
| 31 |
|
- first components for an "OpenAccess": |
| 32 |
|
- schema-editor (based on Tangram::Relational::Schema) |
| 33 |
|
- relationship-/association-editor (based on Tangram::Relational::Schema) |
| 34 |
|
- im-/export - metadata-editor (based on Data::Transfer::Sync) |
| 35 |
|
- task-viewer for Tasks: |
| 36 |
|
- deploy-/retreat schema |
| 37 |
|
- run im-/export |
| 38 |
|
|
| 39 |
|
- integrate Torus (outlook2ldap) with Data::Transfer::Sync |
| 40 |
|
|
| 41 |
|
- fully persist native perl objects to be able to a) suspend processing, b) transfer the object to another process's scope (memory) and c) resume processing |
| 42 |
|
- Data::Dumper? no, that's just for data |
| 43 |
|
- Pixie? no, just Perl 5.8.0 |
| 44 |
|
- FreezeThaw - converting Perl structures to strings and back? hmm, seems to be for data only |
| 45 |
|
- Storable? |
| 46 |
|
- Memoize? no, just caches function return values (trade space for time) ("Automatically cache results of functions") |
| 47 |
|
- Attribute::Memoize? no, this is just an attribute-style interface to Memoize |
| 48 |
|
- TOM? |
| 49 |
|
- IPC::Cache - a perl module that implements an object storage space where data is persisted across process boundaries??? |
| 50 |
|
... seems to be for data-persistence, also ;( |
| 51 |
|
- Aspect? hmmm, maybe ..... |
| 52 |
|
|
| 53 |
|
- OQL on top of Tangram::QueryObject??? |
| 54 |
|
|
| 55 |
|
- new perl modules: |
| 56 |
|
Data::Filter |
| 57 |
|
Regexp::Group |
| 58 |
|
Getopt::Simple |
| 59 |
|
Date::Merge |
| 60 |
|
|
| 61 |
|
- take care to declare your Plugin-modules as 'mixins' to BizWorks::Process |
| 62 |
|
|
| 63 |
|
- take care to specify BizWorks::Process-modules correctly |
| 64 |
|
(including the full-name to the perl-namespace in the 'package'-declaration at the top of each file) |
| 65 |
|
|
| 66 |
|
|
| 67 |
|
~~~ 3 |
| 68 |
|
|
| 69 |
|
- refactor use of class 'SystemEvent' |
| 70 |
|
- maybe rename to show its scope already in classname (e.g. 'OefEvent') |
| 71 |
|
- 1. generic inject on schema-level (like already successfully done with guid) |
| 72 |
|
- auto-select of correct database at wiring-time (addLogDispatchHandler) |
| 73 |
|
|
| 74 |
|
- module-refactoring & namespace garbage collection: |
| 75 |
|
+ refactored mechanism to use sub-modules inside the BizWorks::Process-namespace (anchorless) |
| 76 |
|
- refactor BizWorks::Process to be anchorless itself |
| 77 |
|
- spread new loading-mechanism over already used scripts and integrate to API to be able to do some kind of ... |
| 78 |
|
... "remote component loading" (use in admin panel!) ("admin panel"=admin-area/page/site/oberfläche/bereich? -- !) |
| 79 |
|
- refactor parts of BizWorks to OEF? (OEF::Component, OEF::Process) again, think about looking at CPAN's PApp (more in detail!) here |
| 80 |
|
- refactor files in etc/ to be compliant to some - not yet developed (tbd!) - kind of configuration-metabase-structure |
| 81 |
|
---> look at some already investigated modules from CPAN (Meta::XYZ???) |
| 82 |
|
- refactor internal structure of files in doc/ to be html-renderable. use pod? (just with the new ones starting from 0.03) |
| 83 |
|
|
| 84 |
|
- use the session (backend->frontend) described below also to propagate error-messages from back- to frontend |
| 85 |
|
--> each frontend uses one remote-/backend-session |
| 86 |
|
---> restricted access! (tbd) |
| 87 |
|
--> each admin(-area) uses one remote-/backend-session |
| 88 |
|
---> full access! |
| 89 |
|
|
| 90 |
|
- document ids (identifiers) used: |
| 91 |
|
- oid: object id (created by the innards of Tangram) |
| 92 |
|
- guid: global id (created by a hook on object-insertion inside Tangram::Storage::_insert) |
| 93 |
|
- serial: hash built from the content of the object (payload) via (e.g.) Digest::MD5 identifying it somehow...? |
| 94 |
|
- sid: session id (created for _each_ object per session inside BizWorks::API::Session::_useobject ... |
| 95 |
|
... and also gets stored there (instead of the others in this list which come along with the object itself.) |
| 96 |
|
|
| 97 |
|
- about: global identifiers |
| 98 |
|
- if you're designing a fully distributed (global) system it's important that your objects have assigned some kind |
| 99 |
|
of "global identifier" (e.g. generated from Data::UUID or similar) when used across possibly disconnected systems. |
| 100 |
|
--> each disconnection must/may/can be assumed as a "redeploy" |
| 101 |
|
(an operation which invalidates e.g. all oids and/or breaks all relationships (or even more!)) |
| 102 |
|
- so relying on per-deployment identifiers (oids) from one of n systems will break your neck certainly :-) |
| 103 |
|
- how to implement this? |
| 104 |
|
- implement & use session-based mechanisms! (compare ASP/php sessions) |
| 105 |
|
- assure you have full session-based-communcation between _all_ layers ;-) |
| 106 |
|
.... else communication using identifiers will break at this very layer |
| 107 |
|
- provide a guid -> <new-id-created-representing-the-master-guid> - mapping for each session |
| 108 |
|
- integrate these new mechanisms as new layer between the backend and frontend |
| 109 |
|
--> this will give you multiple frontends talking to the backend with their own identifiers! (and probably much more....) |
| 110 |
|
- use this stuff to enhance infrastructure at system-setup/redeploy-/take-up/down-level: |
| 111 |
|
- here we could apply (more or less) generic rules in the process-flow: |
| 112 |
|
- flush session-metadata (guid->sid - mapping) ... |
| 113 |
|
- ... |
| 114 |
|
- this gives us |
| 115 |
|
- possibility of having backend-db-redeploys transparent for the rest of the system |
| 116 |
|
- possibility to drive "older" frontends (because we already have the mapping to the old identifiers) .... |
| 117 |
|
... just introduce a "VERSION" to actually measure age! |
| 118 |
|
|
| 119 |
|
- about: data |
| 120 |
|
verbs: |
| 121 |
|
pattern matching, filtering, scanning, searching, reading, writing, mungling, munging, transforming, |
| 122 |
|
translating, migrating, finding, replacing, grep, stepping, viewing, reporting, including, feeding, |
| 123 |
|
syncing, encapsulating, sending, transmitting, recieving, serializing, unserializing, mapping, meta, merging, |
| 124 |
|
looking up, indexing, sharing, distributing, centralizing, backing up, restoring, comparing, diffing, matrix manipulation, |
| 125 |
|
math manipulation, visualizing, filtering, iterating through, traversing, calculating, accumulating, freezing, processing, |
| 126 |
|
routing, transferring, converting, loading, saving, storing, activating, archiving |
| 127 |
|
nouns: |
| 128 |
|
transitioning, set, structure, object, file, database, memory, filesystem |
| 129 |
|
combined nouns: |
| 130 |
|
--> combine the ones above |
| 131 |
|
adjectives: |
| 132 |
|
nested, flat, instantiated, raw, real, test, production, |
| 133 |
|
----> puzzle all by-random ;-) |
| 134 |
|
|
| 135 |
|
- what's that? |
| 136 |
|
- why Perl? |
| 137 |
|
- hate writing too much code? |
| 138 |
|
- why Tangram and Class::Tangram? |
| 139 |
|
- hate writing sql? |
| 140 |
|
- hate writing constructors? |
| 141 |
|
- these are the most simple reasons from a RAD perspective, |
| 142 |
|
(OEF) should give you much more, please read on... (and otherwhere) |
| 143 |
|
|
| 144 |
|
- PApp::Storable 2.04 - ;-) try to interconnect with Tangram 2.04..... |
| 145 |
|
|
| 146 |
|
- Data::Filter ... |
| 147 |
|
- ... utilizing Regexp::Group |
| 148 |
|
|
| 149 |
|
- _don't_ start OEF!!! try to use PApp!!! (+POE, +P5EE) |
| 150 |
|
---> write components for these (and maybe try to tie them together in a convenient way) |
| 151 |
|
---> like already done with Data::Storage |
| 152 |
|
---> to _really_ start building higher level components for/with them (for real/bigger/distributed applications) |
| 153 |
|
---> "OpenDavid", "OpenAccess", "OpenExchange" |
| 154 |
|
|
| 155 |
|
- about: a database: (+rdbms, +odbms) |
| 156 |
|
- basic actions (rdbms) |
| 157 |
|
- holding |
| 158 |
|
- storing and retrieving by identifier |
| 159 |
|
- querying |
| 160 |
|
- features (oo-style) |
| 161 |
|
- orm (object relational mapper: maps oo-object-properties to table-fields) |
| 162 |
|
- schema (maps oo-classes to oo-objects) |
| 163 |
|
- relations |
| 164 |
|
- constraints |
| 165 |
|
- object inheritance |
| 166 |
|
- highlevel services |
| 167 |
|
- transactions |
| 168 |
|
- stored procedures, views |
| 169 |
|
- replication (master -> slave) |
| 170 |
|
|
| 171 |
|
- refactoring: use PerlIO::via to get _real_ layers (in this case for the "per-file basis")? |
| 172 |
|
|
| 173 |
|
~~~ 2 |
| 174 |
|
|
| 175 |
|
|
| 176 |
|
|
| 177 |
|
- refactor perl/libs/misc |
| 178 |
|
|
| 179 |
|
- refactor perl/libs/libp.pm into Data::Conversion:: and/or Data:: |
| 180 |
|
|
| 181 |
|
~~~ 1 |
| 182 |
|
|
| 183 |
|
- Tangram::Storage/Data::UUID: |
| 184 |
|
- rewrite _full_ functionality of Data::UUID to a pure perl version Data::UUID::PP or Data::UUID::PurePerl |
| 185 |
|
+ Data::UUID::PurePerl which uses Digest::MD5 with a random payload internally |
| 186 |
|
|
| 187 |
|
- OEF::Component::Transfer should get commands issued to |
| 188 |
|
tell.pl transfer .... |
| 189 |
|
|
| 190 |
|
- documentation/self-documentation: |
| 191 |
|
- doc/meta (for self-documenting purposes, place sloccounts and cvs-graphs/commitinfo/commitgraph) here |
| 192 |
|
- doc/tracker (bug-, feature- and issue-tracking-system) - interface with cvs (file based use) somehow..... |
| 193 |
|
|
| 194 |
|
- cmd.pl/command.pl --> tell.pl |
| 195 |
|
|
| 196 |
|
- core-services to be abstracted out as components: |
| 197 |
|
- lowlevel |
| 198 |
|
- object manipulation (query, load, edit, save) |
| 199 |
|
- data manipulation (transformation, conversion, encoding, encapsulation) |
| 200 |
|
- communication services (rpc-xml, soap, file-system-based (pipe, socket, dir/file-poll/-watch), other rpc-mechs, net/raw (tcp, udp, ...)) |
| 201 |
|
- highlevel (utilizing above components and cross-utilizing themselves) |
| 202 |
|
- reporting facility |
| 203 |
|
- logging |
| 204 |
|
- xyz |
| 205 |
|
- processing facility (here is the actual code!) |
| 206 |
|
- routing facility |
| 207 |
|
(- view generation) |
| 208 |
|
|
| 209 |
|
- implement command-abstraction: |
| 210 |
|
- use router/hop - mechanism |
| 211 |
|
- declare commands in etc/BizWorks/Commands.pm, (or insert them to db and enhance router/hop-mechanism with "nodes") - map them to: |
| 212 |
|
- description |
| 213 |
|
- argument-container (hash containing passed-in arguments: this should be processed via some kinda "request"-object) |
| 214 |
|
- at the end - a "response"-object should be the result of the command-routing process |
| 215 |
|
- given this - it should be as easy to switch between synchronous/asynchronous-processing on command-level easily (speaking "on-the-fly") |
| 216 |
|
- rewire this to a new script: cmd.pl/command.pl |
| 217 |
|
|
| 218 |
|
- add diff/merge on per-node-basis (inside!) for Data::Transfer::Sync as an alternative to md5-checksum-hashing |
| 219 |
|
|
| 220 |
|
- write small tool to scan source-code for various often-used-patterns: |
| 221 |
|
- 1st run: TODO, HACK, REVIEW |
| 222 |
|
- 2nd run: lowercase versions of above listed items |
| 223 |
|
- report text/code after that (make context-width (before, after) configurable) |
| 224 |
|
|
| 225 |
|
- backend-sync: detect changes to underlying file when using DBD::CSV when syncing - will get destroyed otherwise ;) |
| 226 |
|
|
| 227 |
|
- central Data::UUID authority (two steps) |
| 228 |
|
- move all code to a central location (BizWorks::Helper::UUID) |
| 229 |
|
- central GUID-server/authority (like a ticket-authority) (RPC around BizWorks::Helper::UUID, etc.) |
| 230 |
|
|
| 231 |
|
- integrate a mechanism to disable new-guid-assignment when calling Tangram::Storage::_insert |
| 232 |
|
- purpose: option for db_backup.pl dbkey=backend --action=restore |
| 233 |
|
|
| 234 |
|
- introduce generic "advanced.error.propagation"-mechanism for functions in Data::Storage::Handler to |
| 235 |
|
let them return more verbose error-messages if any errors actually occour |
| 236 |
|
- don't just return and don't pass back verbose strings in return values directly! |
| 237 |
|
=> pass back response-hash = { |
| 238 |
|
errcode => 5, |
| 239 |
|
errmsg => '<verbose error message>', |
| 240 |
|
ok => 0, |
| 241 |
|
} |
| 242 |
|
- go oo via Event? |
| 243 |
|
- go exception-style via try { ... } catch { ... }? |
| 244 |
|
|
| 245 |
|
- ideas to abstract the rotation-mechanism: (feed.pl --action=rotate) |
| 246 |
|
- rotate.by.flag (is what we have now implemented in a hardwired fashion (backend_import.pl)) |
| 247 |
|
- rotate.by.date (give date to rotate by ....) |
| 248 |
|
|
| 249 |
|
- an abstract/third language to write validation processes in? |
| 250 |
|
- intention: include this code (the identical) at _two_ system-nodes independent of used language (language-binding needed!) (python, javascript?) |
| 251 |
|
|
| 252 |
|
- libraries/modules: currency and/or datetime calculation for php and/or perl!? |
| 253 |
|
- fields of "datetime": date, time, timezone |
| 254 |
|
- fields of "currency": from -> to, setBase, getByCountry, (setBaseByCountry???) |
| 255 |
|
- perl: |
| 256 |
|
- Date::Manip |
| 257 |
|
- php: |
| 258 |
|
- PEAR/Date |
| 259 |
|
- PEAR/Date/TimeZone??? |
| 260 |
|
|
| 261 |
|
- frontend-sync - new concept: |
| 262 |
|
- sync: two features - not more! |
| 263 |
|
1. use guids for identification of nodes (wipe out usage of tangram-oid!!!: now the synchronization-layer is independent from tangram) |
| 264 |
|
2. generic hook for im-/exports: wrap xml im-/export around that? |
| 265 |
|
- maybe: don't do that above, but just _add_ the guid to the field-map of each node while syncing (generic "introduce"/"inject"-mechanism!) |
| 266 |
|
|
| 267 |
|
- OEF: docu: declared databases can be used similar to / compared to mountpoints known from e.g. the unix filesystem. |
| 268 |
|
$process->{bizWorks}->{<database-key>}->storageMethod |
| 269 |
|
|
| 270 |
|
- OEF: look at pef@sourceforge!!! |
| 271 |
|
- pef = perl enterprise framework |
| 272 |
|
- contact authors!!!??? |
| 273 |
|
|
| 274 |
|
- describe how to start write (new) code for/with OEF |
| 275 |
|
- start with simple .pl-script |
| 276 |
|
- encapsulate code inside the very same .pl-file into a special compartment to get it accessible from core OEF |
| 277 |
|
- maybe provide an external tool to automatically do this job? (e.g. cat example.pl | oef.pl --refactor=script-compartment --outfile=example_c.pl) |
| 278 |
|
- include to Config.pm!? |
| 279 |
|
- move code to own process-namespace (e.g. "BizWorks") |
| 280 |
|
- maybe provide an external tool to automatically do this job? (e.g. cat example.pl | oef.pl --refactor=process --outfile=BizWorks/) |
| 281 |
|
|
| 282 |
|
- attempt to start "OpenAccess" as a MS Access clone????? using... |
| 283 |
|
- Data:: |
| 284 |
|
- OEF:: |
| 285 |
|
- Perl::Tk and/or mod_perl/Oak:: WebXyz:: |
| 286 |
|
- POE |
| 287 |
|
- P5EE |
| 288 |
|
- some more code...... ;-) |
| 289 |
|
|
| 290 |
|
- OEF::Scripting |
| 291 |
|
- binding for scripting via perl/python/javascript/php? (even an emulated/open vbscript???) |
| 292 |
|
|
| 293 |
|
- OEF/FAQ.pod |
| 294 |
|
- i can't find any getter/setter-methods in the source - where are they? |
| 295 |
|
-> don't worry - they are there - but hidden away from Tangram / Class::Tangram - please read their documentation to get an insight into the mechanisms used in the layers using tangram for storage |
| 296 |
|
- there are/will be some other "real"-getter/setter-methods or OEF will provide/wrap other class-generators as adapted/bridged handlers |
| 297 |
|
e.g. Tie::SecureHash, Class::Contract, Class::Xyz, ..... (try to integrate/move utilization of Class::Tangram into this (new) layer as well....) |
| 298 |
|
|
| 299 |
|
- introduce mechanism to provide something like a "dynamic reversed mixin-inheritance" |
| 300 |
|
(from the view of perl's mixin-module available from CPAN) |
| 301 |
|
- purpose: |
| 302 |
|
- don't mixin plugin-subobject's to a common concrete parent-container-objects, but .... |
| 303 |
|
- .... dynamically (via eval) mixin an abstract parent-container-object into an arbitrary instantiated plugin-object's namespace |
| 304 |
|
- this (maybe) will get you shared resources between applications and plugins but namespace-seperated methods on plugin-level, but .... |
| 305 |
|
- .... still lets you have common methods available to all plugins declared in the abstract parent-container-object |
| 306 |
|
(needed e.g. for 'load/unload' itself....) |
| 307 |
|
=> hierarchical plugin namespace at runtime - sharing resources, common methods and (maybe) other preconfigured (helper-)objects |
| 308 |
|
- another idea/enhancement on top of this: dynamically mixin arbitrary/given package into _current_ __PACKAGE__ |
| 309 |
|
- another idea/enhancement parallel to this (maybe better/easier to use/implement/merge-with-POE?): |
| 310 |
|
- provide each plugin with a meta-data-storage-container (kinda _SESSION/_STACK) which can/will get flushed on destroy, but ... |
| 311 |
|
... can also be made persistent on demand/request, or ... |
| 312 |
|
... sent to a remote location: would process-migration be possible with this??? |
| 313 |
|
_start_proc(local) |
| 314 |
|
_pause_proc(local) |
| 315 |
|
_migrate_proc(local, remote) |
| 316 |
|
_migrate_proc_meta(local, remote) |
| 317 |
|
_migrate_proc_stack(local, remote) |
| 318 |
|
_resume_proc(remote) |
| 319 |
|
while (status = _query_proc(remote)) { |
| 320 |
|
print status |
| 321 |
|
last if status.ready |
| 322 |
|
last if status.error |
| 323 |
|
} |
| 324 |
|
|
| 325 |
|
- write code for (automatic )documentation-purposes: |
| 326 |
|
- perl-filter to (hard) dump all _values_ sub- input- and output- variables |
| 327 |
|
- perl-filter to (hard) extract sub-name and attributes |
| 328 |
|
- perl-filter to (guess) all _names_ of a) passed-in (request)-variables (arguments, options) and b) passed-back (response-)variables ((processing-)results, boolesch or arbitraryly encoded status) |
| 329 |
|
- perl-filter to (hard) extract additional in-/out-metadata ... how? already proposed somewhere - search linkdb |
| 330 |
|
|
| 331 |
|
- guid should be generated in a core module in the Data::-namespace to be accessible by both Data::Transfer::Sync and BizWorks::xyz |
| 332 |
|
-> mkGuid |
| 333 |
|
-> Data::Storage::Sync - metadata: add ->{isGuidProvider}??? |
| 334 |
|
|
| 335 |
|
- Data::Transform::Deep: |
| 336 |
|
- rename 'expand' to 'deep_expand' |
| 337 |
|
- create new sub 'merge' (from 'hash2object_traverse_mixin'), use from 'hash2object' |
| 338 |
|
- use IterArray and/or IterHash??? |
| 339 |
|
|
| 340 |
|
- include main namespace (BizWorks, BizWorks::Process) in Config.pm somehow |
| 341 |
|
----> refactor code to provide declarative boot/startup |
| 342 |
|
=> SYNOPSIS: |
| 343 |
|
my $app = OEF::Application->new( |
| 344 |
|
config => $config, |
| 345 |
|
namespaces => { |
| 346 |
|
'BizWorks' => { |
| 347 |
|
}, |
| 348 |
|
databases => [qw()], |
| 349 |
|
packages => [qw()], |
| 350 |
|
); |
| 351 |
|
my $app = OEF::Application->new(package => 'BizWorks'); |
| 352 |
|
my $app = OEF::Application->new(script => 'feed.pl'); |
| 353 |
|
|
| 354 |
|
$app->boot(); |
| 355 |
|
$app->run(); |
| 356 |
|
|
| 357 |
|
propagation of config / further boot is done _after_ parsing the configuration |
| 358 |
|
e.g. booting BizWorks is just declard in there - it will not happen "by default" any more |
| 359 |
|
=> the door maybe is open now to load plugins from/to other namespaces/scopes besides BizWorks |
| 360 |
|
|
| 361 |
|
- generic "makeSerial"-function (BizWorks::Process::Common) to make serials from some concrete objects |
| 362 |
|
- rule: capitalize first letter of object-/class-name - append digest of object-payload (patched Data::Dumper) |
| 363 |
|
|
| 364 |
|
- patch Data::Dumper to respect e.g. Set::Object |
| 365 |
|
|
| 366 |
|
- synchronization: don't delete all nodes when running "export": just delete touched ones and show this via print "r" if $self->{verbose} |
| 367 |
|
|
| 368 |
|
- transparently send tangram-objects via RPC::XML??? |
| 369 |
|
|
| 370 |
|
- introduce TTL and manual-purge-mechanism for HttpProxy |
| 371 |
|
|
| 372 |
|
- introduce OEF, OEF::Process in nfo/ (Open Enterprise Framework) |
| 373 |
|
- the OEF-namespace: |
| 374 |
|
- OEF::Process (BizWorks::Process) |
| 375 |
|
- OEF::Script (xyz.pl, BizWorks::RunMe) |
| 376 |
|
- OEF::Core (BizWorks, BizWorks::Boot) |
| 377 |
|
- OEF::Request and OEF::Response? asynchronous? |
| 378 |
|
- OEF::Application (BizWorks) |
| 379 |
|
- OEF::Engine? |
| 380 |
|
- DOEPF? (Distributed Open Enterprise Perl Framework)? hmmm... no what about PHP? Python? |
| 381 |
|
|
| 382 |
|
- what about code in BizWorks::Process::Core??? maybe use Data::Storage::Handler::Tangram::sendQuery |
| 383 |
|
|
| 384 |
|
- introduce mechanism for developer-machines to detect and propagate schema-changes to e.g. frontend-databases (configure this option/feature in Config.pm) |
| 385 |
|
|
| 386 |
- take care to declare your Plugin-modules as 'mixins' to BizWorks::Process |
$Id$ |
|
|
|
|
- take care to specify BizWorks::Process-modules correctly |
|
|
(including the full-name to the perl-namespace in the 'package'-declaration at the top of each file) |
|
|
|
|
|
|
|
|
~~~ 3 |
|
|
|
|
|
- refactor use of class 'SystemEvent' |
|
|
- maybe rename to show its scope already in classname (e.g. 'OefEvent') |
|
|
- 1. generic inject on schema-level (like already successfully done with guid) |
|
|
- auto-select of correct database at wiring-time (addLogDispatchHandler) |
|
|
|
|
|
- module-refactoring & namespace garbage collection: |
|
|
+ refactored mechanism to use sub-modules inside the BizWorks::Process-namespace (anchorless) |
|
|
- refactor BizWorks::Process to be anchorless itself |
|
|
- spread new loading-mechanism over already used scripts and integrate to API to be able to do some kind of ... |
|
|
... "remote component loading" (use in admin panel!) ("admin panel"=admin-area/page/site/oberfläche/bereich? -- !) |
|
|
- refactor parts of BizWorks to OEF? (OEF::Component, OEF::Process) again, think about looking at CPAN's PApp (more in detail!) here |
|
|
- refactor files in etc/ to be compliant to some - not yet developed (tbd!) - kind of configuration-metabase-structure |
|
|
---> look at some already investigated modules from CPAN (Meta::XYZ???) |
|
|
- refactor internal structure of files in doc/ to be html-renderable. use pod? (just with the new ones starting from 0.03) |
|
|
|
|
|
- use the session (backend->frontend) described below also to propagate error-messages from back- to frontend |
|
|
--> each frontend uses one remote-/backend-session |
|
|
---> restricted access! (tbd) |
|
|
--> each admin(-area) uses one remote-/backend-session |
|
|
---> full access! |
|
|
|
|
|
- document ids (identifiers) used: |
|
|
- oid: object id (created by the innards of Tangram) |
|
|
- guid: global id (created by a hook on object-insertion inside Tangram::Storage::_insert) |
|
|
- serial: hash built from the content of the object (payload) via (e.g.) Digest::MD5 identifying it somehow...? |
|
|
- sid: session id (created for _each_ object per session inside BizWorks::API::Session::_useobject ... |
|
|
... and also gets stored there (instead of the others in this list which come along with the object itself.) |
|
|
|
|
|
- about: global identifiers |
|
|
- if you're designing a fully distributed (global) system it's important that your objects have assigned some kind |
|
|
of "global identifier" (e.g. generated from Data::UUID or similar) when used across possibly disconnected systems. |
|
|
--> each disconnection must/may/can be assumed as a "redeploy" |
|
|
(an operation which invalidates e.g. all oids and/or breaks all relationships (or even more!)) |
|
|
- so relying on per-deployment identifiers (oids) from one of n systems will break your neck certainly :-) |
|
|
- how to implement this? |
|
|
- implement & use session-based mechanisms! (compare ASP/php sessions) |
|
|
- assure you have full session-based-communcation between _all_ layers ;-) |
|
|
.... else communication using identifiers will break at this very layer |
|
|
- provide a guid -> <new-id-created-representing-the-master-guid> - mapping for each session |
|
|
- integrate these new mechanisms as new layer between the backend and frontend |
|
|
--> this will give you multiple frontends talking to the backend with their own identifiers! (and probably much more....) |
|
|
- use this stuff to enhance infrastructure at system-setup/redeploy-/take-up/down-level: |
|
|
- here we could apply (more or less) generic rules in the process-flow: |
|
|
- flush session-metadata (guid->sid - mapping) ... |
|
|
- ... |
|
|
- this gives us |
|
|
- possibility of having backend-db-redeploys transparent for the rest of the system |
|
|
- possibility to drive "older" frontends (because we already have the mapping to the old identifiers) .... |
|
|
... just introduce a "VERSION" to actually measure age! |
|
|
|
|
|
- about: data |
|
|
verbs: |
|
|
pattern matching, filtering, scanning, searching, reading, writing, mungling, munging, transforming, |
|
|
translating, migrating, finding, replacing, grep, stepping, viewing, reporting, including, feeding, |
|
|
syncing, encapsulating, sending, transmitting, recieving, serializing, unserializing, mapping, meta, merging, |
|
|
looking up, indexing, sharing, distributing, centralizing, backing up, restoring, comparing, diffing, matrix manipulation, |
|
|
math manipulation, visualizing, filtering, iterating through, traversing, calculating, accumulating, freezing, processing, |
|
|
routing, transferring, converting, loading, saving, storing, activating, archiving |
|
|
nouns: |
|
|
transitioning, set, structure, object, file, database, memory, filesystem |
|
|
combined nouns: |
|
|
--> combine the ones above |
|
|
adjectives: |
|
|
nested, flat, instantiated, raw, real, test, production, |
|
|
----> puzzle all by-random ;-) |
|
|
|
|
|
- what's that? |
|
|
- why Perl? |
|
|
- hate writing too much code? |
|
|
- why Tangram and Class::Tangram? |
|
|
- hate writing sql? |
|
|
- hate writing constructors? |
|
|
- these are the most simple reasons from a RAD perspective, |
|
|
(OEF) should give you much more, please read on... (and otherwhere) |
|
|
|
|
|
- PApp::Storable 2.04 - ;-) try to interconnect with Tangram 2.04..... |
|
|
|
|
|
- Data::Filter ... |
|
|
- ... utilizing Regexp::Group |
|
|
|
|
|
- _don't_ start OEF!!! try to use PApp!!! (+POE, +P5EE) |
|
|
---> write components for these (and maybe try to tie them together in a convenient way) |
|
|
---> like already done with Data::Storage |
|
|
---> to _really_ start building higher level components for/with them (for real/bigger/distributed applications) |
|
|
---> "OpenDavid", "OpenAccess", "OpenExchange" |
|
|
|
|
|
- about: a database: (+rdbms, +odbms) |
|
|
- basic actions (rdbms) |
|
|
- holding |
|
|
- storing and retrieving by identifier |
|
|
- querying |
|
|
- features (oo-style) |
|
|
- orm (object relational mapper: maps oo-object-properties to table-fields) |
|
|
- schema (maps oo-classes to oo-objects) |
|
|
- relations |
|
|
- constraints |
|
|
- object inheritance |
|
|
- highlevel services |
|
|
- transactions |
|
|
- stored procedures, views |
|
|
- replication (master -> slave) |
|
|
|
|
|
- refactoring: use PerlIO::via to get _real_ layers (in this case for the "per-file basis")? |
|
|
|
|
|
~~~ 2 |
|
|
|
|
|
|
|
|
|
|
|
- refactor perl/libs/misc |
|
|
|
|
|
- refactor perl/libs/libp.pm into Data::Conversion:: and/or Data:: |
|
|
|
|
|
~~~ 1 |
|
|
|
|
|
- Tangram::Storage/Data::UUID: |
|
|
- rewrite _full_ functionality of Data::UUID to a pure perl version Data::UUID::PP or Data::UUID::PurePerl |
|
|
+ Data::UUID::PurePerl which uses Digest::MD5 with a random payload internally |
|
|
|
|
|
- OEF::Component::Transfer should get commands issued to |
|
|
tell.pl transfer .... |
|
|
|
|
|
- documentation/self-documentation: |
|
|
- doc/meta (for self-documenting purposes, place sloccounts and cvs-graphs/commitinfo/commitgraph) here |
|
|
- doc/tracker (bug-, feature- and issue-tracking-system) - interface with cvs (file based use) somehow..... |
|
|
|
|
|
- cmd.pl/command.pl --> tell.pl |
|
|
|
|
|
- core-services to be abstracted out as components: |
|
|
- lowlevel |
|
|
- object manipulation (query, load, edit, save) |
|
|
- data manipulation (transformation, conversion, encoding, encapsulation) |
|
|
- communication services (rpc-xml, soap, file-system-based (pipe, socket, dir/file-poll/-watch), other rpc-mechs, net/raw (tcp, udp, ...)) |
|
|
- highlevel (utilizing above components and cross-utilizing themselves) |
|
|
- reporting facility |
|
|
- logging |
|
|
- xyz |
|
|
- processing facility (here is the actual code!) |
|
|
- routing facility |
|
|
(- view generation) |
|
|
|
|
|
- implement command-abstraction: |
|
|
- use router/hop - mechanism |
|
|
- declare commands in etc/BizWorks/Commands.pm, (or insert them to db and enhance router/hop-mechanism with "nodes") - map them to: |
|
|
- description |
|
|
- argument-container (hash containing passed-in arguments: this should be processed via some kinda "request"-object) |
|
|
- at the end - a "response"-object should be the result of the command-routing process |
|
|
- given this - it should be as easy to switch between synchronous/asynchronous-processing on command-level easily (speaking "on-the-fly") |
|
|
- rewire this to a new script: cmd.pl/command.pl |
|
|
|
|
|
- add diff/merge on per-node-basis (inside!) for Data::Transfer::Sync as an alternative to md5-checksum-hashing |
|
|
|
|
|
- write small tool to scan source-code for various often-used-patterns: |
|
|
- 1st run: TODO, HACK, REVIEW |
|
|
- 2nd run: lowercase versions of above listed items |
|
|
- report text/code after that (make context-width (before, after) configurable) |
|
|
|
|
|
- backend-sync: detect changes to underlying file when using DBD::CSV when syncing - will get destroyed otherwise ;) |
|
|
|
|
|
- central Data::UUID authority (two steps) |
|
|
- move all code to a central location (BizWorks::Helper::UUID) |
|
|
- central GUID-server/authority (like a ticket-authority) (RPC around BizWorks::Helper::UUID, etc.) |
|
|
|
|
|
- integrate a mechanism to disable new-guid-assignment when calling Tangram::Storage::_insert |
|
|
- purpose: option for db_backup.pl dbkey=backend --action=restore |
|
|
|
|
|
- introduce generic "advanced.error.propagation"-mechanism for functions in Data::Storage::Handler to |
|
|
let them return more verbose error-messages if any errors actually occour |
|
|
- don't just return and don't pass back verbose strings in return values directly! |
|
|
=> pass back response-hash = { |
|
|
errcode => 5, |
|
|
errmsg => '<verbose error message>', |
|
|
ok => 0, |
|
|
} |
|
|
- go oo via Event? |
|
|
- go exception-style via try { ... } catch { ... }? |
|
|
|
|
|
- ideas to abstract the rotation-mechanism: (feed.pl --action=rotate) |
|
|
- rotate.by.flag (is what we have now implemented in a hardwired fashion (backend_import.pl)) |
|
|
- rotate.by.date (give date to rotate by ....) |
|
|
|
|
|
- an abstract/third language to write validation processes in? |
|
|
- intention: include this code (the identical) at _two_ system-nodes independent of used language (language-binding needed!) (python, javascript?) |
|
|
|
|
|
- libraries/modules: currency and/or datetime calculation for php and/or perl!? |
|
|
- fields of "datetime": date, time, timezone |
|
|
- fields of "currency": from -> to, setBase, getByCountry, (setBaseByCountry???) |
|
|
- perl: |
|
|
- Date::Manip |
|
|
- php: |
|
|
- PEAR/Date |
|
|
- PEAR/Date/TimeZone??? |
|
|
|
|
|
- frontend-sync - new concept: |
|
|
- sync: two features - not more! |
|
|
1. use guids for identification of nodes (wipe out usage of tangram-oid!!!: now the synchronization-layer is independent from tangram) |
|
|
2. generic hook for im-/exports: wrap xml im-/export around that? |
|
|
- maybe: don't do that above, but just _add_ the guid to the field-map of each node while syncing (generic "introduce"/"inject"-mechanism!) |
|
|
|
|
|
- OEF: docu: declared databases can be used similar to / compared to mountpoints known from e.g. the unix filesystem. |
|
|
$process->{bizWorks}->{<database-key>}->storageMethod |
|
|
|
|
|
- OEF: look at pef@sourceforge!!! |
|
|
- pef = perl enterprise framework |
|
|
- contact authors!!!??? |
|
|
|
|
|
- describe how to start write (new) code for/with OEF |
|
|
- start with simple .pl-script |
|
|
- encapsulate code inside the very same .pl-file into a special compartment to get it accessible from core OEF |
|
|
- maybe provide an external tool to automatically do this job? (e.g. cat example.pl | oef.pl --refactor=script-compartment --outfile=example_c.pl) |
|
|
- include to Config.pm!? |
|
|
- move code to own process-namespace (e.g. "BizWorks") |
|
|
- maybe provide an external tool to automatically do this job? (e.g. cat example.pl | oef.pl --refactor=process --outfile=BizWorks/) |
|
|
|
|
|
- attempt to start "OpenAccess" as a MS Access clone????? using... |
|
|
- Data:: |
|
|
- OEF:: |
|
|
- Perl::Tk and/or mod_perl/Oak:: WebXyz:: |
|
|
- POE |
|
|
- P5EE |
|
|
- some more code...... ;-) |
|
|
|
|
|
- OEF::Scripting |
|
|
- binding for scripting via perl/python/javascript/php? (even an emulated/open vbscript???) |
|
|
|
|
|
- OEF/FAQ.pod |
|
|
- i can't find any getter/setter-methods in the source - where are they? |
|
|
-> don't worry - they are there - but hidden away from Tangram / Class::Tangram - please read their documentation to get an insight into the mechanisms used in the layers using tangram for storage |
|
|
- there are/will be some other "real"-getter/setter-methods or OEF will provide/wrap other class-generators as adapted/bridged handlers |
|
|
e.g. Tie::SecureHash, Class::Contract, Class::Xyz, ..... (try to integrate/move utilization of Class::Tangram into this (new) layer as well....) |
|
|
|
|
|
- introduce mechanism to provide something like a "dynamic reversed mixin-inheritance" |
|
|
(from the view of perl's mixin-module available from CPAN) |
|
|
- purpose: |
|
|
- don't mixin plugin-subobject's to a common concrete parent-container-objects, but .... |
|
|
- .... dynamically (via eval) mixin an abstract parent-container-object into an arbitrary instantiated plugin-object's namespace |
|
|
- this (maybe) will get you shared resources between applications and plugins but namespace-seperated methods on plugin-level, but .... |
|
|
- .... still lets you have common methods available to all plugins declared in the abstract parent-container-object |
|
|
(needed e.g. for 'load/unload' itself....) |
|
|
=> hierarchical plugin namespace at runtime - sharing resources, common methods and (maybe) other preconfigured (helper-)objects |
|
|
- another idea/enhancement on top of this: dynamically mixin arbitrary/given package into _current_ __PACKAGE__ |
|
|
- another idea/enhancement parallel to this (maybe better/easier to use/implement/merge-with-POE?): |
|
|
- provide each plugin with a meta-data-storage-container (kinda _SESSION/_STACK) which can/will get flushed on destroy, but ... |
|
|
... can also be made persistent on demand/request, or ... |
|
|
... sent to a remote location: would process-migration be possible with this??? |
|
|
_start_proc(local) |
|
|
_pause_proc(local) |
|
|
_migrate_proc(local, remote) |
|
|
_migrate_proc_meta(local, remote) |
|
|
_migrate_proc_stack(local, remote) |
|
|
_resume_proc(remote) |
|
|
while (status = _query_proc(remote)) { |
|
|
print status |
|
|
last if status.ready |
|
|
last if status.error |
|
|
} |
|
|
|
|
|
- write code for (automatic )documentation-purposes: |
|
|
- perl-filter to (hard) dump all _values_ sub- input- and output- variables |
|
|
- perl-filter to (hard) extract sub-name and attributes |
|
|
- perl-filter to (guess) all _names_ of a) passed-in (request)-variables (arguments, options) and b) passed-back (response-)variables ((processing-)results, boolesch or arbitraryly encoded status) |
|
|
- perl-filter to (hard) extract additional in-/out-metadata ... how? already proposed somewhere - search linkdb |
|
|
|
|
|
- guid should be generated in a core module in the Data::-namespace to be accessible by both Data::Transfer::Sync and BizWorks::xyz |
|
|
-> mkGuid |
|
|
-> Data::Storage::Sync - metadata: add ->{isGuidProvider}??? |
|
|
|
|
|
- Data::Transform::Deep: |
|
|
- rename 'expand' to 'deep_expand' |
|
|
- create new sub 'merge' (from 'hash2object_traverse_mixin'), use from 'hash2object' |
|
|
- use IterArray and/or IterHash??? |
|
|
|
|
|
- include main namespace (BizWorks, BizWorks::Process) in Config.pm somehow |
|
|
----> refactor code to provide declarative boot/startup |
|
|
=> SYNOPSIS: |
|
|
my $app = OEF::Application->new( |
|
|
config => $config, |
|
|
namespaces => { |
|
|
'BizWorks' => { |
|
|
}, |
|
|
databases => [qw()], |
|
|
packages => [qw()], |
|
|
); |
|
|
my $app = OEF::Application->new(package => 'BizWorks'); |
|
|
my $app = OEF::Application->new(script => 'feed.pl'); |
|
|
|
|
|
$app->boot(); |
|
|
$app->run(); |
|
|
|
|
|
propagation of config / further boot is done _after_ parsing the configuration |
|
|
e.g. booting BizWorks is just declard in there - it will not happen "by default" any more |
|
|
=> the door maybe is open now to load plugins from/to other namespaces/scopes besides BizWorks |
|
|
|
|
|
- generic "makeSerial"-function (BizWorks::Process::Common) to make serials from some concrete objects |
|
|
- rule: capitalize first letter of object-/class-name - append digest of object-payload (patched Data::Dumper) |
|
|
|
|
|
- patch Data::Dumper to respect e.g. Set::Object |
|
|
|
|
|
- synchronization: don't delete all nodes when running "export": just delete touched ones and show this via print "r" if $self->{verbose} |
|
|
|
|
|
- transparently send tangram-objects via RPC::XML??? |
|
|
|
|
|
- introduce TTL and manual-purge-mechanism for HttpProxy |
|
|
|
|
|
- introduce OEF, OEF::Process in nfo/ (Open Enterprise Framework) |
|
|
- the OEF-namespace: |
|
|
- OEF::Process (BizWorks::Process) |
|
|
- OEF::Script (xyz.pl, BizWorks::RunMe) |
|
|
- OEF::Core (BizWorks, BizWorks::Boot) |
|
|
- OEF::Request and OEF::Response? asynchronous? |
|
|
- OEF::Application (BizWorks) |
|
|
- OEF::Engine? |
|
|
- DOEPF? (Distributed Open Enterprise Perl Framework)? hmmm... no what about PHP? Python? |
|
|
|
|
|
- what about code in BizWorks::Process::Core??? maybe use Data::Storage::Handler::Tangram::sendQuery |
|
|
|
|
|
- introduce mechanism for developer-machines to detect and propagate schema-changes to e.g. frontend-databases (configure this option/feature in Config.pm) |
|
| 387 |
|
|
| 388 |
|
=cut |
| 389 |
|
|
| 390 |
1; |
1; |
| 391 |
|
__END__ |