| 7 | ################################# | ################################# | 
| 8 | # | # | 
| 9 | #  $Log$ | #  $Log$ | 
| 10 |  | #  Revision 1.5  2002/10/29 19:24:18  joko | 
| 11 |  | #  - reduced logging | 
| 12 |  | #  + added some pod | 
| 13 |  | # | 
| 14 | #  Revision 1.4  2002/10/27 18:35:07  joko | #  Revision 1.4  2002/10/27 18:35:07  joko | 
| 15 | #  + added pod | #  + added pod | 
| 16 | # | # | 
| 37 | $Data::Storage::VERSION = 0.01; | $Data::Storage::VERSION = 0.01; | 
| 38 | } | } | 
| 39 |  |  | 
| 40 |  |  | 
| 41 | =head1 NAME | =head1 NAME | 
| 42 |  |  | 
| 43 | Data::Storage - Interface for accessing various Storage implementations for Perl in an independent way | Data::Storage - Interface for accessing various Storage implementations for Perl in an independent way | 
| 81 |  |  | 
| 82 | use Data::Storage::Locator; | use Data::Storage::Locator; | 
| 83 |  |  | 
| 84 |  | my $TRACELEVEL = 0; | 
| 85 |  |  | 
| 86 | # get logger instance | # get logger instance | 
| 87 | my $logger = Log::Dispatch::Config->instance; | my $logger = Log::Dispatch::Config->instance; | 
| 88 |  |  | 
| 118 | my $method = $AUTOLOAD; | my $method = $AUTOLOAD; | 
| 119 | $method =~ s/^.*:://; | $method =~ s/^.*:://; | 
| 120 |  |  | 
| 121 | # advanced logging of AUTOLOAD calls | # advanced logging of AUTOLOAD calls ... | 
| 122 | my $logstring = ""; | # ... nice but do it only when TRACING (TODO) is enabled | 
| 123 | $logstring .= __PACKAGE__ . "[$self->{locator}->{type}]" . "->" . $method; | if ($TRACELEVEL) { | 
| 124 | #print "count: ", $#_, "\n"; | my $logstring = ""; | 
| 125 | #$logstring .= Dumper(@_) if ($#_ != -1); | $logstring .= __PACKAGE__ . "[$self->{locator}->{type}]" . "->" . $method; | 
| 126 | my $tabcount = int( (80 - length($logstring)) / 10 ); | #print "count: ", $#_, "\n"; | 
| 127 | $logstring .= "\t" x $tabcount . "(AUTOLOAD)"; | #$logstring .= Dumper(@_) if ($#_ != -1); | 
| 128 | # TODO: only ok if logstring doesn't contain | my $tabcount = int( (80 - length($logstring)) / 10 ); | 
| 129 | #            e.g. "Data::Storage[Tangram]->insert(SystemEvent=HASH(0x5c0034c))          (AUTOLOAD)" | $logstring .= "\t" x $tabcount . "(AUTOLOAD)"; | 
| 130 | # but that would be way too specific as long as we don't have an abstract handler for this  ;) | # TODO: only ok if logstring doesn't contain | 
| 131 | $logger->debug( $logstring ); | #            e.g. "Data::Storage[Tangram]->insert(SystemEvent=HASH(0x5c0034c))          (AUTOLOAD)" | 
| 132 |  | # but that would be way too specific as long as we don't have an abstract handler for this  ;) | 
| 133 |  | $logger->debug( $logstring ); | 
| 134 |  | } | 
| 135 |  |  | 
| 136 | # filtering AUTOLOAD calls | # filtering AUTOLOAD calls | 
| 137 | if ($self->_filter_AUTOLOAD($method)) { | if ($self->_filter_AUTOLOAD($method)) { | 
| 138 | $self->_accessStorage(); | $self->_accessStorage(); | 
| 165 | sub _accessStorage { | sub _accessStorage { | 
| 166 | my $self = shift; | my $self = shift; | 
| 167 | # TODO: to some tracelevel! | # TODO: to some tracelevel! | 
| 168 | $logger->debug( __PACKAGE__ .  "[$self->{locator}->{type}]" . "->_accessStorage()" ); | if ($TRACELEVEL) { | 
| 169 |  | $logger->debug( __PACKAGE__ .  "[$self->{locator}->{type}]" . "->_accessStorage()" ); | 
| 170 |  | } | 
| 171 | if (!$self->{STORAGEHANDLE}) { | if (!$self->{STORAGEHANDLE}) { | 
| 172 | $self->_createStorageHandle(); | $self->_createStorageHandle(); | 
| 173 | } | } | 
| 385 | R retrieve  ->  no, not subject of this aspect since it is about deployment only | R retrieve  ->  no, not subject of this aspect since it is about deployment only | 
| 386 | U update    ->  yes, just by user-interaction; maybe automatically if it can be determined that data wouldn't be lost | U update    ->  yes, just by user-interaction; maybe automatically if it can be determined that data wouldn't be lost | 
| 387 | D delete    ->  yes, just by user-interaction | D delete    ->  yes, just by user-interaction | 
| 388 | It's all about not to be able to loose data simply while this is in alpha stage. |  | 
| 389 |  | It's all about not to be able to loose data simply while this is in pre-alpha stage. | 
| 390 |  | And loosing data by being able to modify and redeploy schemas easily is definitely quite easy. | 
| 391 |  |  | 
| 392 |  | As we can see, creations of Classes and new Class variables is handled | 
| 393 |  | automatically and this is believed to be the most common case under normal circumstances. | 
| 394 |  |  | 
| 395 |  |  | 
| 396 | =head2 Introduce some features: | =head2 Introduce some features: | 
| 397 |  |  | 
| 398 | Get this stuff together with UML (Unified Modeling Language) and/or standards from ODMG. | - Get this stuff together with UML (Unified Modeling Language) and/or standards from ODMG. | 
| 399 | Make it possible to load/save schemas in XMI (XML Metadata Interchange), | - Make it possible to load/save schemas in XMI (XML Metadata Interchange), | 
| 400 | which seems to be most commonly used today, perhaps handle objects with OIFML. | which seems to be most commonly used today, perhaps handle objects with OIFML. | 
| 401 | Integrate/bundle this with a web-/html-based UML modeling tool or | Integrate/bundle this with a web-/html-based UML modeling tool or | 
| 402 | some other interesting stuff like the "Co-operative UML Editor" from Uni Darmstadt. (web-/java-based) | some other interesting stuff like the "Co-operative UML Editor" from Uni Darmstadt. (web-/java-based) | 
| 403 | Enable Round Trip Engineering. Keep code and diagrams in sync. Don't annoy/bother the programmer. | - Enable Round Trip Engineering. Keep code and diagrams in sync. Don't annoy/bother the programmers. | 
| 404 |  | - Add some more handlers: | 
| 405 |  | - look at DBD::CSV, Text::CSV, XML::CSV, XML::Excel | 
| 406 |  | - Add some more locations/locators: | 
| 407 |  | - PerlDAV: http://www.webdav.org/perldav/ | 
| 408 |  | - Move to t3, use InCASE | 
| 409 |  |  | 
| 410 |  |  | 
| 411 | =head3 Links: | =head3 Links: | 
| 412 |  |  | 
| 413 |  | Specs: | 
| 414 | UML 1.3 Spec: http://cgi.omg.org/cgi-bin/doc?ad/99-06-08.pdf | UML 1.3 Spec: http://cgi.omg.org/cgi-bin/doc?ad/99-06-08.pdf | 
| 415 | XMI 1.1 Spec: http://cgi.omg.org/cgi-bin/doc?ad/99-10-02.pdf | XMI 1.1 Spec: http://cgi.omg.org/cgi-bin/doc?ad/99-10-02.pdf | 
| 416 | XMI 2.0 Spec: http://cgi.omg.org/docs/ad/01-06-12.pdf | XMI 2.0 Spec: http://cgi.omg.org/docs/ad/01-06-12.pdf | 
| 417 | ODMG: http://odmg.org/ | ODMG: http://odmg.org/ | 
| 418 | OIFML: http://odmg.org/library/readingroom/oifml.pdf | OIFML: http://odmg.org/library/readingroom/oifml.pdf | 
|  | Co-operative UML Editor: http://www.darmstadt.gmd.de/concert/activities/internal/umledit.html |  | 
| 419 |  |  | 
| 420 | further readings: | CASE Tools: | 
| 421 |  | Rational Rose (commercial): http://www.rational.com/products/rose/ | 
| 422 |  | Together (commercial): http://www.oi.com/products/controlcenter/index.jsp | 
| 423 |  | InCASE - Tangram-based Universal Object Editor | 
| 424 |  | Sybase PowerDesigner: http://www.sybase.com/powerdesigner | 
| 425 |  |  | 
| 426 |  | UML Editors: | 
| 427 |  | Fujaba (free, university): http://www.fujaba.de/ | 
| 428 |  | ArgoUML (free): http://argouml.tigris.org/ | 
| 429 |  | Poseidon (commercial): http://www.gentleware.com/products/poseidonDE.php3 | 
| 430 |  | Co-operative UML Editor (research): http://www.darmstadt.gmd.de/concert/activities/internal/umledit.html | 
| 431 |  | Metamill (commercial): http://www.metamill.com/ | 
| 432 |  | Violet (university, research, education): http://www.horstmann.com/violet/ | 
| 433 |  | PyUt (free): http://pyut.sourceforge.net/ | 
| 434 |  | (Dia (free): http://www.lysator.liu.se/~alla/dia/) | 
| 435 |  | UMLet (free, university): http://www.swt.tuwien.ac.at/umlet/index.html | 
| 436 |  | Voodoo (free): http://voodoo.sourceforge.net/ | 
| 437 |  |  | 
| 438 |  | UML Tools: | 
| 439 |  | http://www.objectsbydesign.com/tools/umltools_byPrice.html | 
| 440 |  |  | 
| 441 |  | Further readings: | 
| 442 | http://www.google.com/search?q=web+based+uml+editor&hl=en&lr=&ie=UTF-8&oe=UTF-8&start=10&sa=N | http://www.google.com/search?q=web+based+uml+editor&hl=en&lr=&ie=UTF-8&oe=UTF-8&start=10&sa=N | 
| 443 | http://www.fernuni-hagen.de/DVT/Aktuelles/01FHHeidelberg.pdf | http://www.fernuni-hagen.de/DVT/Aktuelles/01FHHeidelberg.pdf | 
| 444 | http://www.enhyper.com/src/documentation/ | http://www.enhyper.com/src/documentation/ | 
| 446 | http://citeseer.nj.nec.com/vilain00diagrammatic.html | http://citeseer.nj.nec.com/vilain00diagrammatic.html | 
| 447 | http://archive.devx.com/uml/articles/Smith01/Smith01-3.asp | http://archive.devx.com/uml/articles/Smith01/Smith01-3.asp | 
| 448 |  |  | 
|  | maybe useful for / to be integrated with: |  | 
|  | ArapXML: http://xml.coverpages.org/ni2001-09-24-b.html |  |