blob: 02bd41954ad1d45512d36ac33d56503284ee64d1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.vault.fs.api;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.jcr.RepositoryException;
/**
* An artifact represents a fragment (or aspect) of a Vault file. This can either
* be a:
* <ul>
* <li> primary (serialized) content
* <li> additional serialized content
* <li> binary attachments (eg. binary properties)
* <li> directory representation
* </ul>
*
* Artifacts are used for exporting (output) and importing (input). Output
* artifacts are generated by the vault fs, input artifacts are used by the
* respective import layer.
* <p>
* Depending on the type of the artifact and of it's source different access
* methods for it's content are preferred:
* If {@link AccessType#NONE} is set, no content is available. this is
* the case for {@link ArtifactType#DIRECTORY} artifacts.<br>
* If {@link AccessType#SPOOL} is set then clients should use the
* {@link #spool(OutputStream)} method to retrieve the content. this is mostly
* the case for output-artifacts that have serialized content.<br>
* Tree.If {@link AccessType#STREAM} is set then clients should use the
* {@link #getInputStream()} method in to retrieve the content. this is mostly
* the case for input-artifacts or for {@link ArtifactType#BINARY} artifacts.
* <p>
* Each artifact contains a (repository) name and a possible extension. The name
* and the extension must be preserved after a export/import roundtrip.
*/
public interface Artifact extends Dumpable {
/**
* Returns the relative path of this artifact in platform format including
* the extension. eg: "_cq_nodeType.cnd" or "en/.content.xml" and eventual
* intermediate extensions. eg: "image.png.dir/.content.xml"
*
* @return the relative platform path
*/
public String getPlatformPath();
/**
* Returns the (repository) extension of this artifact. eg: ".jsp"
* @return the (repository) extension of this artifact.
*/
public String getExtension();
/**
* Returns the relative (repository) path of this artifact in respect to
* it's parent node. eg: "myNodeType"
*
* @return the final name
*/
public String getRelativePath();
/**
* Returns the type of this artifact.
* @return the type of this artifact.
*/
public ArtifactType getType();
/**
* Returns the serialization type of this artifact.
* @return the serialization type of this artifact.
*/
public SerializationType getSerializationType();
/**
* Returns the preferred access value for this artifact.
* @return the preferred access value.
*/
AccessType getPreferredAccess();
/**
* Returns the length of the serialized data if it's known without doing the
* actual serialization.
* @return the length or {@code -1} if the length cannot be determined.
*/
long getContentLength();
/**
* Returns the content type of the serialized data or {@code null} if
* the type is not known or cannot be determined.
* @return the content type or {@code null}.
*/
String getContentType();
/**
* Returns the last modified date or {@code 0} if not known.
* @return the last modified date or {@code 0}
*/
long getLastModified();
/**
* Writes the content to the given output stream and closes it afterwards.
* This is the preferred method to use for output-artifacts.
* <p>The specified stream remains open after this method returns.
* @param out the output stream to spool to
* @throws IOException if an I/O error occurs
* @throws RepositoryException if a repository error occurs
*/
void spool(OutputStream out) throws IOException, RepositoryException;
/**
* Returns the input stream to the contents of this artifact.
* This is the preferred method to use for input-artifacts.
*
* @return a input stream to the contents of this artifact.
* @throws IOException if an I/O error occurs
* @throws RepositoryException if a repository error occurs
*/
InputStream getInputStream() throws IOException, RepositoryException;
/**
* Returns an input source to the contents of this artifact.
* This is also preferred for {@link AccessType#STREAM}.
*
* @return an input source.
* @throws IOException if an I/O error occurs.
* @throws RepositoryException of a repository error occurs.
*/
VaultInputSource getInputSource() throws IOException, RepositoryException;
}