blob: 3ab519694465309e81fa40f29a750449b47f7014 [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.packaging.integration;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.api.ReferenceBinary;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
import org.apache.jackrabbit.vault.fs.io.ImportOptions;
import org.apache.jackrabbit.vault.packaging.ExportOptions;
import org.apache.jackrabbit.vault.packaging.JcrPackage;
import org.apache.jackrabbit.vault.packaging.PackageException;
import org.apache.jackrabbit.vault.packaging.PackageProperties;
import org.apache.jackrabbit.vault.packaging.VaultPackage;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* <code>TestEmptyPackage</code>...
*/
public class TestBinarylessExport extends IntegrationTestBase {
private final static String SMALL_TEXT = "Lorem ipsum";
private final static String BINARY_NODE_PATH = "/tmp/binaryless/node";
private final static String BIG_BINARY_PROPERTY = "bigbin";
private final static String SMALL_BINARY_PROPERTY = "smallbin";
private final static String FILE_NODE_PATH = "/tmp/binaryless/file";
private final static int BIG_TEXT_LENGTH = 0x1000 * 64;
private final static String BIG_TEXT;
static {
StringBuilder buffer = new StringBuilder(BIG_TEXT_LENGTH);
buffer.append("0123456789abcdef");
while (buffer.length() < BIG_TEXT_LENGTH) {
buffer.append(buffer, 0, buffer.length());
}
BIG_TEXT = buffer.toString();
}
@Before
public void setup() throws RepositoryException, PackageException, IOException {
Node binaryNode = JcrUtils.getOrCreateByPath(BINARY_NODE_PATH, "nt:unstructured", admin);
Binary bigBin = admin.getValueFactory().createBinary(IOUtils.toInputStream(BIG_TEXT, "UTF-8"));
Property bigProperty = binaryNode.setProperty(BIG_BINARY_PROPERTY, bigBin);
String referenceBigBinary = ((ReferenceBinary) bigProperty.getBinary()).getReference();
assertNotNull(referenceBigBinary);
Binary smallBin = admin.getValueFactory().createBinary(IOUtils.toInputStream(SMALL_TEXT, "UTF-8"));
Property smallProperty = binaryNode.setProperty(SMALL_BINARY_PROPERTY, smallBin);
if (isOak()) {
assertTrue(smallProperty.getBinary() instanceof ReferenceBinary);
} else {
assertFalse(smallProperty.getBinary() instanceof ReferenceBinary);
}
JcrUtils.putFile(binaryNode.getParent(), "file", "text/plain", IOUtils.toInputStream(BIG_TEXT, "UTF-8"));
admin.save();
}
@Test
public void exportBinary() throws RepositoryException, IOException, PackageException {
String nodePath = BINARY_NODE_PATH;
String property = BIG_BINARY_PROPERTY;
ExportOptions opts = new ExportOptions();
DefaultMetaInf inf = new DefaultMetaInf();
DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
filter.add(new PathFilterSet(nodePath));
inf.setFilter(filter);
Properties props = new Properties();
props.setProperty(VaultPackage.NAME_GROUP, "jackrabbit/test");
props.setProperty(VaultPackage.NAME_NAME, "test-package");
props.setProperty(PackageProperties.NAME_USE_BINARY_REFERENCES, "true");
inf.setProperties(props);
opts.setMetaInf(inf);
File tmpFile = File.createTempFile("vaulttest", "zip");
VaultPackage pkg = packMgr.assemble(admin, opts, tmpFile);
assertNull(pkg.getArchive().getEntry("jcr_root" + BINARY_NODE_PATH + "/" + BIG_BINARY_PROPERTY + ".binary"));
assertNotNull(pkg.getArchive().getEntry("jcr_root"+ BINARY_NODE_PATH + "/" + SMALL_BINARY_PROPERTY + ".binary"));
clean(nodePath);
pkg.extract(admin, getDefaultOptions());
assertNodeExists(nodePath);
long actualBinarySize = ((Property) admin.getItem(nodePath + "/" + property)).getBinary().getSize();
assertEquals(BIG_TEXT.getBytes("UTF-8").length, actualBinarySize);
pkg.close();
tmpFile.delete();
}
@Test
public void exportFile() throws RepositoryException, IOException, PackageException {
String nodePath = FILE_NODE_PATH;
ExportOptions opts = new ExportOptions();
DefaultMetaInf inf = new DefaultMetaInf();
DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
filter.add(new PathFilterSet(nodePath));
inf.setFilter(filter);
Properties props = new Properties();
props.setProperty(VaultPackage.NAME_GROUP, "jackrabbit/test");
props.setProperty(VaultPackage.NAME_NAME, "test-package");
props.setProperty(PackageProperties.NAME_USE_BINARY_REFERENCES, "true");
inf.setProperties(props);
opts.setMetaInf(inf);
File tmpFile = File.createTempFile("vaulttest", "zip");
VaultPackage pkg = packMgr.assemble(admin, opts, tmpFile);
assertTrue(pkg.getArchive().getEntry("jcr_root" + FILE_NODE_PATH).isDirectory());
clean(nodePath);
pkg.extract(admin, getDefaultOptions());
assertNodeExists(nodePath);
Node node = admin.getNode(nodePath);
InputStream stream = JcrUtils.readFile(node);
String actualText = IOUtils.toString(stream, "UTF-8");
assertEquals(BIG_TEXT, actualText);
pkg.close();
tmpFile.delete();
}
/**
* Tests if the same package installed twice does not report and update. See JCRVLT-108
*/
@Test
@Ignore("JCRVLT-108")
public void importTwice() throws RepositoryException, IOException, PackageException {
String nodePath = BINARY_NODE_PATH;
ExportOptions opts = new ExportOptions();
DefaultMetaInf inf = new DefaultMetaInf();
DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
filter.add(new PathFilterSet(nodePath));
inf.setFilter(filter);
Properties props = new Properties();
props.setProperty(VaultPackage.NAME_GROUP, "jackrabbit/test");
props.setProperty(VaultPackage.NAME_NAME, "test-package");
props.setProperty(PackageProperties.NAME_USE_BINARY_REFERENCES, "true");
inf.setProperties(props);
opts.setMetaInf(inf);
File tmpFile = File.createTempFile("vaulttest", "zip");
VaultPackage pkg = packMgr.assemble(admin, opts, tmpFile);
pkg.close();
clean(nodePath);
// import again
JcrPackage pack = packMgr.upload(FileUtils.openInputStream(tmpFile), false);
assertNotNull(pack);
ImportOptions io = getDefaultOptions();
TrackingListener listener = new TrackingListener(opts.getListener());
io.setListener(listener);
pack.install(io);
assertEquals("A", listener.getActions().get(BINARY_NODE_PATH));
// and again
io = getDefaultOptions();
listener = new TrackingListener(opts.getListener());
io.setListener(listener);
pack.install(io);
assertEquals("U", listener.getActions().get(BINARY_NODE_PATH));
tmpFile.delete();
}
}