diff --git a/config/alfresco/model/wcmModel.xml b/config/alfresco/model/wcmModel.xml
index 1333c3081a..24bcb577b5 100644
--- a/config/alfresco/model/wcmModel.xml
+++ b/config/alfresco/model/wcmModel.xml
@@ -94,7 +94,7 @@
- XML Transformer
+ Template Output Method
Type
@@ -102,7 +102,7 @@
true
- Type
+ File extension for generated assets
d:text
true
@@ -113,7 +113,21 @@
-
-
+
+ XML file generated by a template
+
+
+ Template that generated this asset
+ d:noderef
+ true
+
+
+ Template that generated this asset
+ d:noderef
+ true
+
+
+
+
diff --git a/source/java/org/alfresco/model/WCMModel.java b/source/java/org/alfresco/model/WCMModel.java
index c4c26bd617..3aea4aefb9 100644
--- a/source/java/org/alfresco/model/WCMModel.java
+++ b/source/java/org/alfresco/model/WCMModel.java
@@ -34,4 +34,8 @@ public interface WCMModel
public static final QName PROP_TEMPLATE_OUTPUT_METHOD_TYPE = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "templateoutputmethodtype");
public static final QName PROP_TEMPLATE_OUTPUT_METHOD_DERIVED_FILE_EXTENSION = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "templateoutputmethodderivedfileextension");
public static final QName PROP_TEMPLATE_SOURCE = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "templatesource");
+
+ public static final QName ASPECT_TEMPLATE_DERIVED = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "templatederived");
+ public static final QName PROP_TEMPLATE_DERIVED_FROM = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "templatederivedfrom");
+ public static final QName PROP_TEMPLATE_DERIVED_FROM_NAME = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "templatederivedfromname");
}
diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteInputStream.java b/source/java/org/alfresco/repo/avm/AVMRemoteInputStream.java
new file mode 100644
index 0000000000..a1bec72069
--- /dev/null
+++ b/source/java/org/alfresco/repo/avm/AVMRemoteInputStream.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2006 Alfresco, Inc.
+ *
+ * Licensed under the Mozilla Public License version 1.1
+ * with a permitted attribution clause. You may obtain a
+ * copy of the License at
+ *
+ * http://www.alfresco.org/legal/license.txt
+ *
+ * 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.alfresco.repo.avm;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Wrapper around AVMRemote stream reading.
+ * @author britt
+ */
+public class AVMRemoteInputStream extends InputStream
+{
+ /**
+ * The AVMRemote reference.
+ */
+ private AVMRemote fAVMRemote;
+
+ /**
+ * The handle to the input stream.
+ */
+ private String fHandle;
+
+ /**
+ * Construct one.
+ * @param handle The handle returned by getInputStream();
+ * @param remote The AVMRemote instance.
+ */
+ public AVMRemoteInputStream(String handle, AVMRemote remote)
+ {
+ fHandle = handle;
+ fAVMRemote = remote;
+ }
+
+ /**
+ * Read in a single byte.
+ * @return The byte as 0-255 or -1 for eof.
+ */
+ @Override
+ public int read() throws IOException
+ {
+ try
+ {
+ byte [] buff = fAVMRemote.readInput(fHandle, 1);
+ if (buff.length == 0)
+ {
+ return -1;
+ }
+ return ((int)buff[0]) & 0xff;
+ }
+ catch (Exception e)
+ {
+ throw new IOException("Remote I/O Error.");
+ }
+ }
+
+ /**
+ * Read a buffer of bytes.
+ * @param b The buffer into which to put the bytes.
+ * @param off The offset into the buffer.
+ * @param len The number of bytes to read.
+ * @return The actual number of bytes read or -1 on eof.
+ */
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException
+ {
+ try
+ {
+ byte [] buff = fAVMRemote.readInput(fHandle, len);
+ if (buff.length == 0)
+ {
+ return -1;
+ }
+ for (int i = 0; i < buff.length; i++)
+ {
+ b[off + i] = buff[i];
+ }
+ return buff.length;
+ }
+ catch (Exception e)
+ {
+ throw new IOException("Remote I/O Error.");
+ }
+ }
+
+ /**
+ * Close the underlying AVMRemote handle.
+ */
+ @Override
+ public void close() throws IOException
+ {
+ try
+ {
+ fAVMRemote.closeInputHandle(fHandle);
+ }
+ catch (Exception e)
+ {
+ throw new IOException("Remote Error closing input stream.");
+ }
+ }
+}