/* * ModeShape (http://www.modeshape.org) * * Licensed 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.modeshape.test.integration; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Random; import javax.annotation.Resource; import javax.jcr.Binary; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.query.Query; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; import org.modeshape.common.FixFor; import org.modeshape.common.util.IoUtil; import org.modeshape.jcr.JcrRepository; import org.modeshape.jcr.api.JcrTools; import org.modeshape.schematic.document.Document; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; /** * Smoke tests persistence in a repository that store all its information in a Database * * @author Horia Chiorean (hchiorea@redhat.com) */ @RunWith( Arquillian.class ) public class JDBCRepositoryIntegrationTest { private static final JcrTools JCR_TOOLS = new JcrTools(); @Resource (mappedName = "/jcr/dbBinaryJDBCRepository") private JcrRepository repository; @Deployment public static WebArchive createDeployment() { WebArchive archive = ShrinkWrap.create(WebArchive.class, "jdbcRepository-test.war"); // Add our custom Manifest, which has the additional Dependencies entry ... archive.setManifest(new File("src/main/webapp/META-INF/MANIFEST.MF")); return archive; } @Test @FixFor( {"MODE-2194", "MODE-2636"} ) public void shouldPersistBinaryDataInDBBinaryStore() throws Exception { assertConfiguration(); assertDataPersisted(); persistBinaryContent(); } private void assertConfiguration() throws Exception { Document persistenceConfiguration = repository.getConfiguration().getPersistenceConfiguration(); assertEquals("MODESHAPE_IT_REPO", persistenceConfiguration.getString("tableName")); } private void assertDataPersisted() throws RepositoryException { assertNotNull(repository); Session session = repository.login(); try { //check predefined content was imported assertNotNull(session.getNode("/files")); assertNotNull(session.getNode("/cars")); //add a node and check it can be queried session.getRootNode().addNode("testNode"); session.save(); Query query = session.getWorkspace() .getQueryManager() .createQuery("select [jcr:path] FROM [nt:base] WHERE [jcr:name] LIKE '%testNode%'", Query.JCR_SQL2); assertEquals(1, query.execute().getNodes().getSize()); } finally { session.logout(); } } private void persistBinaryContent() throws RepositoryException, IOException { assertNotNull(repository); long minimumBinarySize = repository.getConfiguration().getBinaryStorage().getMinimumBinarySizeInBytes(); long binarySize = 2 * minimumBinarySize; Session session = repository.login(); InputStream binaryValueStream = null; try { byte[] content = new byte[(int)binarySize]; new Random().nextBytes(content); JCR_TOOLS.uploadFile(session, "folder/file", new ByteArrayInputStream(content)); session.save(); Node nodeWithBinaryContent = session.getNode("/folder/file/jcr:content"); assertEquals("nt:resource", nodeWithBinaryContent.getPrimaryNodeType().getName()); try { nodeWithBinaryContent.getProperty("jcr:mimeType"); fail("Mimetype detection is disabled; there shouldn't be any mime type property"); } catch (PathNotFoundException e) { // expected } Binary binaryValue = nodeWithBinaryContent.getProperty("jcr:data").getBinary(); binaryValueStream = binaryValue.getStream(); byte[] retrievedContent = IoUtil.readBytes(binaryValueStream); assertArrayEquals(content, retrievedContent); } finally { if (binaryValueStream != null) { binaryValueStream.close(); } session.logout(); } } }