1 package SL::Webdav::File;
4 use parent qw(Rose::Object);
10 use Rose::Object::MakeMethods::Generic (
11 scalar => [ qw(webdav filename loaded) ],
14 add_objects => { interface => 'push', hash_key => 'objects' },
19 $_[0]->load unless $_[0]->loaded;
20 my $cmp = $_[0]->webdav->version_scheme->cmp;
21 sort { $cmp->($a, $b) } $_[0]->objects;
30 my @objects = $self->webdav->get_all_objects;
31 my $ref = SL::Webdav::Object->new(filename => $self->filename, webdav => $self->webdav);
32 my ($ref_basename, undef, $ref_extension) = $ref->parse_filename;
34 $self->objects(grep { $_->basename eq $ref_basename && $_->extension eq $ref_extension } @objects);
39 my ($self, %params) = @_;
41 croak 'Invalid call. Only data or file can be set' if ($params{data} && $params{file});
43 $self->load unless $self->loaded;
45 my $last = $self->latest_version;
49 my ($basename, undef, $extension) = SL::Webdav::Object->new(filename => $self->filename, webdav => $self->webdav)->parse_filename;
50 my $new_version = $self->webdav->version_scheme->first_version;
51 my $sep = $self->webdav->version_scheme->separator;
52 my $new_filename = $basename . $sep . $new_version . "." . $extension;
53 $object = SL::Webdav::Object->new(filename => $new_filename, webdav => $self->webdav);
55 $self->add_objects($object);
57 if (!$self->webdav->version_scheme->keep_last_version($last)) {
58 $params{new_version} = 1;
61 # Do not create a new version of the document if file size of last version is the same.
62 if ($params{new_version}) {
63 my $last_file_size = $last->size;
66 croak 'No valid file' unless -f $params{file};
67 $new_file_size = (stat($params{file}))[7];
69 $new_file_size = length(${ $params{data} });
71 $params{new_version} = 0 if $last_file_size == $new_file_size;
74 if ($params{new_version}) {
75 my $new_version = $self->webdav->version_scheme->next_version($last);
76 my $sep = $self->webdav->version_scheme->separator;
77 my $new_filename = $last->basename . $sep . $new_version . "." . $last->extension;
78 $object = SL::Webdav::Object->new(filename => $new_filename, webdav => $self->webdav);
80 $self->add_objects($object);
87 croak 'No valid file' unless -f $params{file};
88 File::Copy::copy($params{file}, $object->full_filedescriptor) or croak "Copy failed from $params{file} to @{[ $object->filename ]}: $!";
91 open my $fh, '>:raw', $object->full_filedescriptor or die "could not open " . $object->filename . ": $!";
93 $fh->print(${ $params{data} });
110 SL::Webdav::File - Webdav file manipulation
114 use SL::Webdav::File;
116 my $webdav_file = SL::Webdav::File->new(
117 webdav => $webdav, # SL::Webdav instance
118 filename => 'technical_drawing_AB28375.pdf',
121 # get existing versioned files
122 my @webdav_objects = $webdav_file->versions;
125 my $data = SL::Helper::CreatePDF->create_pdf(...);
126 my $webdav_object = $webdav_file->store(data => \$data);
128 # use file instead of data
129 my $webdav_object = $webdav_file->store(file => $path_to_file);
132 my $webdav_object = $webdav_file->store(data => \$data, new_version => 1);
136 A file in this context is the collection of all versions of a single file saved
137 into the webdav. This module provides methods to access and manipulate these
146 Will return all L<SL::Webdav::Object>s found in this file, sorted by version
147 according to the version scheme used.
149 =item C<latest_version>
151 Returns only the latest version object.
155 Loads objects from disk.
157 =item C<store PARAMS>
159 Store a new version on disk. If C<data> is present, it is expected to contain a
160 reference to the data to be written in raw encoding.
162 If C<file> is a valid filename then it will be copied.
164 C<file> and C<data> are exclusive.
166 If param C<new_version> is set, force a new version, even if the versioning
167 scheme would keep the old one.
169 No new version is stored if the file or data size is euqal to the size of
170 the last stored version.
176 L<SL::Webdav>, L<SL::Webdav::Object>
184 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>