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__ |