You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2017/10/20 02:00:04 UTC

svn commit: r1812696 - in /jackrabbit/commons/filevault-package-maven-plugin/trunk: it/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/ it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/ it/src/test/resources/test...

Author: tripod
Date: Fri Oct 20 02:00:03 2017
New Revision: 1812696

URL: http://svn.apache.org/viewvc?rev=1812696&view=rev
Log:
JCRVLT-209 Always write to the filter.xml inside the vaultDir but never to filter-plugin-generated.xml

- this closes #3

Added:
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/META-INF/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/META-INF/vault/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/META-INF/vault/filter.xml
      - copied, changed from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/expected-filter.xml
      - copied, changed from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/expected-filter.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/pom.xml
      - copied, changed from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/expected-filter.xml
      - copied, changed from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/filter.xml
      - copied, changed from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/pom.xml
      - copied, changed from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml
Removed:
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/expected-filter.xml
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml
Modified:
    jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/FilterTest.java
    jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
    jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/DefaultWorkspaceFilter.java

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/FilterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/FilterTest.java?rev=1812696&r1=1812695&r2=1812696&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/FilterTest.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/FilterTest.java Fri Oct 20 02:00:03 2017
@@ -118,6 +118,14 @@ public class FilterTest {
     }
 
     /**
+     * Tests if a project with an filter source and no inline filters keeps the filter comments.
+     */
+    @Test
+    public void test_retain_filter_source() throws Exception {
+        verify("retain-filter-source", false);
+    }
+
+    /**
      * Tests if a project with no filter but a prefix creates the default root
      */
     @Test
@@ -129,16 +137,14 @@ public class FilterTest {
      * Tests if a project with an inline filter and an implicit filter correctly uses the inline filters.
      */
     @Test
-    @Ignore("JCRVLT-209")
-    public void test_inline_filter_wins() throws Exception {
-        verify("inline-filter-wins", false);
+    public void test_inline_and_implicit_filter_fails() throws Exception {
+        verify("inline-and-implicit-fails", true);
     }
 
     /**
      * Tests if a project with an inline filter executed twice works w/o clean
      */
     @Test
-    @Ignore("JCRVLT-209")
     public void test_inline_filter_twice() throws Exception {
         // first execute with default goals
         final File projectDir = new File("target/test-classes/test-projects/filter-tests/inline-filter-twice");

Copied: jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/META-INF/vault/filter.xml (from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml)
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/META-INF/vault/filter.xml?p2=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/META-INF/vault/filter.xml&p1=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml&r1=1812695&r2=1812696&rev=1812696&view=diff
==============================================================================
    (empty)

Copied: jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/expected-filter.xml (from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/expected-filter.xml)
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/expected-filter.xml?p2=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/expected-filter.xml&p1=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/expected-filter.xml&r1=1812695&r2=1812696&rev=1812696&view=diff
==============================================================================
    (empty)

Copied: jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/pom.xml (from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml)
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/pom.xml?p2=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-and-implicit-fails/pom.xml&p1=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml&r1=1812695&r2=1812696&rev=1812696&view=diff
==============================================================================
    (empty)

Copied: jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/expected-filter.xml (from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml)
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/expected-filter.xml?p2=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/expected-filter.xml&p1=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml&r1=1812695&r2=1812696&rev=1812696&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/expected-filter.xml Fri Oct 20 02:00:03 2017
@@ -16,5 +16,6 @@
   limitations under the License.
   -->
 <workspaceFilter version="1.0">
+    <!-- this is a comment -->
     <filter root="/apps/test"/>
 </workspaceFilter>

Copied: jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/filter.xml (from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml)
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/filter.xml?p2=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/filter.xml&p1=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml&r1=1812695&r2=1812696&rev=1812696&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/META-INF/vault/filter.xml (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/filter.xml Fri Oct 20 02:00:03 2017
@@ -16,5 +16,6 @@
   limitations under the License.
   -->
 <workspaceFilter version="1.0">
+    <!-- this is a comment -->
     <filter root="/apps/test"/>
 </workspaceFilter>

Copied: jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/pom.xml (from r1812695, jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml)
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/pom.xml?p2=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/pom.xml&p1=jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml&r1=1812695&r2=1812696&rev=1812696&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/inline-filter-wins/pom.xml (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/it/src/test/resources/test-projects/filter-tests/retain-filter-source/pom.xml Fri Oct 20 02:00:03 2017
@@ -14,8 +14,7 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <!-- ====================================================================== -->
@@ -26,18 +25,8 @@
     <version>1.0.0-SNAPSHOT</version>
     <packaging>content-package</packaging>
 
-    <description>Test project that defines an implicit filter in META-INF/vault and inline filters.</description>
+    <description>Test project that defines a filter source.</description>
     <build>
-        <resources>
-            <resource>
-                <directory>${basedir}/META-INF</directory>
-                <targetPath>${project.build.directory}/vault-work/META-INF</targetPath>
-            </resource>
-            <resource>
-                <directory>${basedir}/jcr_root</directory>
-                <targetPath>.</targetPath>
-            </resource>
-        </resources>
         <plugins>
             <plugin>
                 <groupId>org.apache.jackrabbit</groupId>
@@ -46,23 +35,7 @@
                 <extensions>true</extensions>
                 <configuration>
                     <failOnDependencyErrors>false</failOnDependencyErrors>
-                    <filters>
-                        <filter>
-                            <root>/libs/foo</root>
-                            <type>cleanup</type>
-                        </filter>
-                        <filter>
-                            <root>/libs/bar</root>
-                            <mode>merge</mode>
-                            <includes>
-                                <include>/libs/bar/a</include>
-                                <include>/libs/bar/b/.*</include>
-                            </includes>
-                            <excludes>
-                                <exclude>/libs/bar/foo(/.*)?</exclude>
-                            </excludes>
-                        </filter>
-                    </filters>
+                    <filterSource>filter.xml</filterSource>
                 </configuration>
             </plugin>
         </plugins>

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java?rev=1812696&r1=1812695&r2=1812696&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java Fri Oct 20 02:00:03 2017
@@ -21,6 +21,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.nio.file.Files;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
@@ -408,52 +409,7 @@ public class VaultMojo extends AbstractE
             Map<String, File> embeddedFiles = copyEmbeddeds();
             embeddedFiles.putAll(copySubPackages());
 
-            File filterFile = new File(vaultDir, "filter.xml");
-
-            if (filterSource == null || !filterSource.exists()) {
-                // ignore filtersource
-                DefaultWorkspaceFilter oldFilter;
-                if (filterFile.exists()) {
-                    oldFilter = new DefaultWorkspaceFilter();
-                    oldFilter.load(filterFile);
-
-                    // don't write filter if same
-                    if (filters.getSourceAsString().equals(oldFilter.getSourceAsString())) {
-                        filterFile = null;
-                    } else {
-                        if (filters.getFilterSets().isEmpty()) {
-                            filters.load(filterFile);
-                            filterFile = null;
-                        } else {
-                            filterFile = new File(vaultDir, "filter-plugin-generated.xml");
-                        }
-                    }
-                } else {
-                    if (filters.getFilterSets().isEmpty() && prefix.length() > 0) {
-                        addWorkspaceFilter(prefix);
-                    }
-                }
-            } else {
-                getLog().info("Merging " + filterSource.getPath() + " with inlined filter specifications.");
-                DefaultWorkspaceFilter oldFilter = new DefaultWorkspaceFilter();
-                oldFilter.load(filterSource);
-                oldFilter.merge(filters);
-                filters.getFilterSets().clear();
-                filters.getFilterSets().addAll(oldFilter.getFilterSets());
-                if (filters.getFilterSets().isEmpty() && prefix.length() > 0) {
-                    addWorkspaceFilter(prefix);
-                }
-            }
-
-            if (filterFile != null) {
-                FileUtils.fileWrite(filterFile.getAbsolutePath(), filters.getSourceAsString());
-            }
-            if (filters.getFilterSets().isEmpty() && failOnEmptyFilter) {
-                final String msg = "No workspace filter defined (failOnEmptyFilter=true)";
-                getLog().error(msg);
-                throw new MojoExecutionException(msg);
-            }
-
+            computePackageFilters(vaultDir);
             validatePackageType();
             computeImportPackage();
             computeDependencies();
@@ -578,6 +534,97 @@ public class VaultMojo extends AbstractE
     }
 
     /**
+     * Computes the package filters.
+     *
+     * Requirements:
+     * - backward compatibility: if a filter.xml is copied to vault-work with the resource plugin, then it should still "work" correctly.
+     * - if there are any comments in the original filter source, they should not get lost, if possible
+     * - if there are filters specified in the pom and in a filter source, they should get merged.
+     * - if the prefix property is set, it should be used if no filter is set.
+     * - if both, a inline filter and a implicit filter is present, the build fails.
+     * - re-run the package goal w/o cleaning the target first must work
+     *
+     * @throws IOException if an I/O error occurs
+     * @throws MojoExecutionException if the build fails
+     */
+    private void computePackageFilters(File vaultMetaDir) throws IOException, MojoExecutionException {
+        // backward compatibility: if implicit filter exists, use it. but check for conflicts
+        File filterFile = new File(vaultMetaDir, "filter.xml");
+        if (filterFile.exists() && filterFile.lastModified() != 0) {
+            // if both, a inline filter and a implicit filter is present, the build fails.
+            if (!filters.getFilterSets().isEmpty()) {
+                getLog().error("Refuse to merge inline filters and non-sourced filter.xml. If this is intended, specify the filter.xml via the 'filterSource' property.");
+                throw new MojoExecutionException("conflicting filters.");
+            }
+            // load filters for further processing
+            filters.load(filterFile);
+
+            getLog().warn("The project is using a filter.xml provided via the resource plugin.");
+            getLog().warn("This is deprecated and might no longer be supported in future versions.");
+            getLog().warn("Use the 'filterSource' property to specify the filter or use inline filters.");
+            return;
+        }
+
+        // if last modified of vault-work/META-INF/vault/filter.xml == 0 -> delete it
+        if (filterFile.exists() && filterFile.lastModified() == 0) {
+            try {
+                Files.delete(filterFile.toPath());
+            } catch (IOException e) {
+                getLog().error("Unable to delete previously generated filter.xml. re-run the goals with a clean setup.");
+                throw new MojoExecutionException("Unable to delete file.", e);
+            }
+        }
+
+        // if filterSource exists, read the filters into sourceFilters
+        DefaultWorkspaceFilter sourceFilters = new DefaultWorkspaceFilter();
+        if (filterSource != null && filterSource.exists()) {
+            getLog().info("Loading filter from " + filterSource.getPath());
+            sourceFilters.load(filterSource);
+            if (!filters.getFilterSets().isEmpty()) {
+                getLog().info("Merging inline filters.");
+                sourceFilters.merge(filters);
+            }
+            filters.getFilterSets().clear();
+            filters.getFilterSets().addAll(sourceFilters.getFilterSets());
+
+            // reset source filters for later. this looks a bit complicated but is needed to keep the same
+            // filter order as in previous versions
+            sourceFilters = new DefaultWorkspaceFilter();
+            sourceFilters.load(filterSource);
+            sourceFilters.generateSource();
+        }
+
+        // if the prefix property is set, it should be used if no filter is set
+        if (filters.getFilterSets().isEmpty() && prefix.length() > 0) {
+            addWorkspaceFilter(prefix);
+        }
+
+        // if no filter is defined at all, fail
+        if (filters.getFilterSets().isEmpty()) {
+            if (failOnEmptyFilter) {
+                final String msg = "No workspace filter defined (failOnEmptyFilter=true)";
+                getLog().error(msg);
+                throw new MojoExecutionException(msg);
+            } else {
+                getLog().warn("No workspace filter defined. Package import might have unexpected results.");
+            }
+        }
+
+        // if the source filters and the generated filters are the same, copy the source file to retain the comments
+        if (filterSource != null && sourceFilters.getSourceAsString().equals(filters.getSourceAsString())) {
+            FileUtils.copyFile(filterSource, filterFile);
+        } else {
+            // generate xml and write to filter.xml
+            getLog().info("Generating filter.xml from plugin configuration");
+            FileUtils.fileWrite(filterFile.getAbsolutePath(), filters.getSourceAsString());
+        }
+
+        // update the last modified time of filter.xml to for generated filters
+        if (!filterFile.setLastModified(0)) {
+            getLog().warn("Unable to set last modified of filters file. make sure to clean the project before next run.");
+        }
+    }
+    /**
      * Computes the dependency string.
      */
     private void computeDependencies() throws IOException {

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/DefaultWorkspaceFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/DefaultWorkspaceFilter.java?rev=1812696&r1=1812695&r2=1812696&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/DefaultWorkspaceFilter.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/plugin/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/DefaultWorkspaceFilter.java Fri Oct 20 02:00:03 2017
@@ -254,7 +254,7 @@ public class DefaultWorkspaceFilter  {
         return new DefaultPathFilter(pattern);
     }
 
-    private void generateSource() {
+    public void generateSource() {
         try {
             ByteArrayOutputStream out = new ByteArrayOutputStream();