stephan 2002/08/19 01:05:27 Modified: src/scratchpad/src/org/apache/cocoon/components/source/impl SlideSource.java Log: Retrieve the correct mime type of the context. Add transaction support for the upload. Add new method to create collections. Revision Changes Path 1.17 +194 -25 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/impl/SlideSource.java Index: SlideSource.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/impl/SlideSource.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- SlideSource.java 15 Aug 2002 13:40:10 -0000 1.16 +++ SlideSource.java 19 Aug 2002 08:05:27 -0000 1.17 @@ -71,8 +71,9 @@ import org.apache.cocoon.Constants; import org.apache.cocoon.components.source.InspectableSource; import org.apache.cocoon.components.source.LockableSource; +import org.apache.cocoon.components.source.ModifiableTraversableSource; import org.apache.cocoon.components.source.RestrictableSource; -import org.apache.cocoon.components.source.TraversableSource; +//import org.apache.cocoon.components.source.TraversableSource; import org.apache.cocoon.components.source.WriteableSource; import org.apache.cocoon.components.source.VersionableSource; import org.apache.cocoon.components.source.helpers.GroupSourcePermission; @@ -137,11 +138,14 @@ * @version $Id$ */ public class SlideSource extends AbstractLogEnabled implements - Composable, Source, WriteableSource, TraversableSource, RestrictableSource, - LockableSource, InspectableSource, VersionableSource { + Composable, Contextualizable, Source, WriteableSource, ModifiableTraversableSource, + RestrictableSource, LockableSource, InspectableSource, VersionableSource { /** Component manager */ private ComponentManager manager; + + /** Component context */ + private Context context; /** Sytem id */ private String systemid; @@ -244,6 +248,18 @@ } /** + * Pass the Context to the component. + * This method is called after the Loggable.setLogger() (if present) + * method and before any other method. + * + * @param context the context + * @throws ContextException if context is invalid + */ + public void contextualize(Context context) throws ContextException { + this.context = context; + } + + /** * Initialialize the component. Initialization includes * allocating any resources required throughout the * components lifecycle. @@ -438,17 +454,21 @@ // Last modification date revisionDescriptor.setLastModified(new Date()); - //nat.begin(); + nat.begin(); if (revisionNumber==null) content.create(slideToken, config.getFilesPath()+uri, revisionDescriptor, null); content.store(slideToken, config.getFilesPath()+uri, revisionDescriptor, revisionContent); - //nat.commit(); + try { + nat.commit(); + } catch (Exception cme) { + this.logger.warn("Could not commit the transaction.", cme); + } } catch (ObjectNotFoundException e) { - + // Todo : Check to see if parent exists SubjectNode subject = new SubjectNode(); @@ -456,23 +476,18 @@ // Creating an object structure.create(slideToken, subject, config.getFilesPath()+uri); } catch (SlideException se) { - // FIXME correct exception handling - e.printStackTrace(); + this.logger.debug("Could not create source.", se); throw new IOException(se.getMessage()); } NodeRevisionDescriptor revisionDescriptor = new NodeRevisionDescriptor(bytes.length); - //NodeProperty property = null; - - // Creation date - // Resource type - // revisionDescriptor.setResourceType(""); //FIXME works only with CVS code of Slide + revisionDescriptor.setResourceType(""); // Source - //revisionDescriptor.setSource(""); + revisionDescriptor.setSource(""); // Get content language revisionDescriptor.setContentLanguage("en"); @@ -481,15 +496,24 @@ revisionDescriptor.setContentLength(bytes.length); // Get content type - // FIXME retrieving the correct mime type - revisionDescriptor.setContentType("application/octet-stream"); + String contentType = null; + try { + contentType = ((org.apache.cocoon.environment.Context) + context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT)).getMimeType(uri); + } catch (ContextException ce) { + this.logger.warn("Could not get context to determine the mime type."); + } + if (contentType == null) { + contentType = "application/octet-stream"; + } + revisionDescriptor.setContentType(contentType); // Last modification date revisionDescriptor.setLastModified(new Date()); // Owner - //revisionDescriptor.setOwner( - // slideToken.getCredentialthis.slideToken().getPublicCredentials()); + revisionDescriptor.setOwner( + slideToken.getCredentialsToken().getPublicCredentials()); // Creating revisionDescriptor associated with the object NodeRevisionContent revisionContent = @@ -499,7 +523,20 @@ try { content.create(slideToken, config.getFilesPath()+uri, revisionDescriptor, revisionContent); + + try { + nat.commit(); + } catch (Exception cme) { + this.logger.warn("Could not commit the transaction.", cme); + } } catch (SlideException se) { + + try { + nat.rollback(); + } catch (Exception rbe) { + this.logger.warn("Could not rollback the transaction.", rbe); + } + this.logger.error("Could not create source", se); throw new IOException(se.getMessage()); } @@ -508,6 +545,13 @@ this.logger.error("Could not create source", e); throw new IOException(e.getMessage()); } finally { + + try { + nat.rollback(); + } catch (Exception rbe) { + this.logger.warn("Could not rollback the transaction.", rbe); + } + this.isClosed = true; } } @@ -527,6 +571,85 @@ } /** + * Move the source to source.getSystemId(), including all properties + * deletes this source. + * + * @param source Destination of the source. + */ + public void move(WriteableSource source) throws SourceException { + if (source instanceof SlideSource) { + try { + this.macro.move(slideToken, this.config.getFilesPath()+this.uri, + this.config.getFilesPath()+((SlideSource)source).uri); + } catch (SlideException se) { + throw new SourceException("Could not move source.", se); + } + } else { + try { + OutputStream out = source.getOutputStream(); + InputStream in = getInputStream(); + + byte[] buffer = new byte[8192]; + int length = -1; + + while ((length = in.read(buffer)) > -1) { + out.write(buffer, 0, length); + } + in.close(); + out.flush(); + out.close(); + } catch (IOException ioe) { + throw new SourceException("Could not copy source : "+ioe.getMessage()); + } + this.delete(); + } + } + + /** + * Copy the source to source.getSystemId(), including all properties. + * + * @param source Destination of the source. + */ + public void copy(WriteableSource source) throws SourceException { + if (source instanceof SlideSource) { + try { + this.macro.copy(slideToken, this.config.getFilesPath()+this.uri, + this.config.getFilesPath()+((SlideSource)source).uri); + } catch (SlideException se) { + throw new SourceException("Could not move source.", se); + } + } else { + try { + OutputStream out = source.getOutputStream(); + InputStream in = getInputStream(); + + byte[] buffer = new byte[8192]; + int length = -1; + + while ((length = in.read(buffer)) > -1) { + out.write(buffer, 0, length); + } + in.close(); + out.flush(); + out.close(); + } catch (IOException ioe) { + throw new SourceException("Could not copy source : "+ioe.getMessage()); + } + } + } + + /** + * Delete the source. + */ + public void delete() throws SourceException { + try { + this.macro.delete(slideToken, this.config.getFilesPath()+this.uri); + } catch (SlideException se) { + throw new SourceException("Could not delete source.", se); + } + } + + /** * Return the content length of the content or -1 if the length is * unknown */ @@ -656,11 +779,52 @@ return null; if (this.uri.endsWith("/")) - return protocol+":/"+this.uri.substring(0, this.uri.substring(0,this.uri.length()-1).lastIndexOf("/")); + return protocol+":/"+this.uri.substring(0, + this.uri.substring(0,this.uri.length()-1).lastIndexOf("/")); return protocol+":/"+this.uri.substring(0, this.uri.lastIndexOf("/")); } + /** + * Create a collection of sources. + * + * @param collectionname Name of the collectiom, which + * should be created. + */ + public void createCollection(String collectionname) throws SourceException { + + SubjectNode collection = new SubjectNode(); + NodeRevisionDescriptor revisionDescriptor = new NodeRevisionDescriptor(0); + + // Resource type + revisionDescriptor.setResourceType("<collection/>"); + + // Creation date + revisionDescriptor.setCreationDate(new Date()); + + // Last modification date + revisionDescriptor.setLastModified(new Date()); + + // Content length name + revisionDescriptor.setContentLength(0); + + // Source + revisionDescriptor.setSource(""); + + // Owner + revisionDescriptor.setOwner( + slideToken.getCredentialsToken().getPublicCredentials()); + + try { + structure.create(slideToken, collection, this.config.getFilesPath()+this.uri+"/"+collectionname); + content.create(slideToken, this.config.getFilesPath()+this.uri+"/"+collectionname, + revisionDescriptor, null); + } catch (SlideException se) { + throw new SourceException("Could not create collection.", se); + } + + } + /** * Get the current credential for the source */ @@ -960,19 +1124,24 @@ SourcePermission sourcepermission = null; if (principal.equals("~")) - sourcepermission = new PrincipalSourcePermission(PrincipalSourcePermission.PRINCIPAL_SELF, null, + sourcepermission = + new PrincipalSourcePermission(PrincipalSourcePermission.PRINCIPAL_SELF, null, inheritedPermissions, negative); else if (principal.equals("nobody")) - sourcepermission = new PrincipalSourcePermission(PrincipalSourcePermission.PRINCIPAL_GUEST, null, + sourcepermission = + new PrincipalSourcePermission(PrincipalSourcePermission.PRINCIPAL_GUEST, null, inheritedPermissions, negative); else if (principal.equals(userspath)) - sourcepermission = new PrincipalSourcePermission(PrincipalSourcePermission.PRINCIPAL_ALL, null, + sourcepermission = + new PrincipalSourcePermission(PrincipalSourcePermission.PRINCIPAL_ALL, null, inheritedPermissions, negative); else if (principal.startsWith(userspath+"/")) - sourcepermission = new PrincipalSourcePermission(principal.substring(userspath.length()+1), null, + sourcepermission = + new PrincipalSourcePermission(principal.substring(userspath.length()+1), null, inheritedPermissions, negative); else if (principal.startsWith("+"+userspath+"/")) - sourcepermission = new GroupSourcePermission(principal.substring(userspath.length()+2), null, + sourcepermission = + new GroupSourcePermission(principal.substring(userspath.length()+2), null, inheritedPermissions, negative); else sourcepermission = new PrincipalSourcePermission(principal, null,
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]