/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.api.exporting; import org.apache.ws.commons.util.Base64; import org.exoplatform.services.jcr.impl.Constants; import org.exoplatform.services.jcr.impl.util.StringConverter; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Calendar; import java.util.StringTokenizer; import javax.jcr.ItemExistsException; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.lock.LockException; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.version.VersionException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; /** * Created by The eXo Platform SAS. * * @author <a href="mailto:gennady.azarenkov@exoplatform.com">Gennady Azarenkov</a> * @version $Id: TestExportSysView.java 11962 2008-03-16 16:31:14Z gazarenkov $ */ public class TestExportSysView extends ExportBase { public TestExportSysView() throws ParserConfigurationException { super(); } @Override public void initRepository() throws RepositoryException { Node rootNode = session.getRootNode(); Node file = rootNode.addNode("childNode", "nt:folder").addNode("childNode2", "nt:file"); Node contentNode = file.addNode("jcr:content", "nt:resource"); contentNode.setProperty("jcr:data", session.getValueFactory().createValue("this is the content", PropertyType.BINARY)); contentNode.setProperty("jcr:mimeType", "application/octet-stream"); contentNode.setProperty("jcr:lastModified", session.getValueFactory().createValue(Calendar.getInstance())); session.save(); } @Override public void tearDown() throws Exception { Node rootNode = session.getRootNode(); rootNode.getNode("childNode").remove(); session.save(); super.tearDown(); } public void testExportCHNamespaceRemaping() throws Exception { Session newSession = repository.login(this.credentials /* session.getCredentials() */); newSession.setNamespacePrefix("newjcr", "http://www.jcp.org/jcr/1.0"); Node testNode = newSession.getRootNode().addNode("jcr:testExportNamespaceRemaping"); for (int i = 0; i < valList.size(); i++) { testNode.setProperty("prop_" + i + "_string", valList.get(i), PropertyType.STRING); testNode.setProperty("prop_" + i + "_binary", valList.get(i), PropertyType.BINARY); } newSession.save(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); // session.exportDocumentView(testNode.getPath(), bos, false, false); SAXTransformerFactory saxFact = (SAXTransformerFactory)TransformerFactory.newInstance(); TransformerHandler handler = saxFact.newTransformerHandler(); handler.setResult(new StreamResult(bos)); newSession.exportSystemView(testNode.getPath(), handler, false, false); bos.close(); String exportContent = bos.toString(); assertFalse(exportContent.contains("newjcr")); newSession.logout(); } public void testExportPdf() throws RepositoryException { ByteArrayOutputStream out = new ByteArrayOutputStream(); Node testPdf = root.addNode("testPdf", "nt:file"); Node contentTestPdfNode = testPdf.addNode("jcr:content", "nt:resource"); try { File file = createBLOBTempFile(2500);// 2.5M contentTestPdfNode.setProperty("jcr:data", new FileInputStream(file)); contentTestPdfNode.setProperty("jcr:mimeType", "application/octet-stream"); } catch (IOException e) { throw new RepositoryException(e); } contentTestPdfNode.setProperty("jcr:lastModified", session.getValueFactory().createValue(Calendar.getInstance())); session.save(); try { session.exportDocumentView("/testPdf", out, false, false); } catch (Exception e) { e.printStackTrace(); fail("Impossible to export pdf"); } finally { testPdf.remove(); session.save(); } } public void testExportReferenceableNodes() throws Exception { Node testNode = root.addNode("refNode"); testNode.addMixin("mix:referenceable"); session.save(); File destFile = File.createTempFile("testExportReferenceableNodes", ".xml"); destFile.deleteOnExit(); OutputStream outStream = new FileOutputStream(destFile); session.exportSystemView(testNode.getPath(), outStream, false, false); outStream.close(); Document doc = builder.parse(new FileInputStream(destFile)); NodeList nodes = doc.getElementsByTagName("sv:node"); assertEquals(1, nodes.getLength()); assertEquals(3, nodes.item(0).getChildNodes().getLength()); assertEquals("jcr:uuid", nodes.item(0).getChildNodes().item(2).getAttributes().getNamedItem("sv:name") .getNodeValue()); assertEquals(testNode.getUUID(), nodes.item(0).getChildNodes().item(2).getChildNodes().item(0).getTextContent()); } public void testExportStreamNamespaceRemaping() throws Exception { Session newSession = repository.login(this.credentials /* session.getCredentials() */); newSession.setNamespacePrefix("newjcr", "http://www.jcp.org/jcr/1.0"); Node testNode = newSession.getRootNode().addNode("jcr:testExportNamespaceRemaping"); for (int i = 0; i < valList.size(); i++) { testNode.setProperty("prop_" + i + "_string", valList.get(i), PropertyType.STRING); testNode.setProperty("prop" + i + "_binary", valList.get(i), PropertyType.BINARY); } newSession.save(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); newSession.exportSystemView(testNode.getPath(), bos, false, false); bos.close(); String exportContent = bos.toString(); assertFalse(exportContent.contains("newjcr")); newSession.logout(); } public void testLockNodeExport() throws Exception { Node firstNode = root.addNode("forExport"); Node testNode = firstNode.addNode("sysLockNode"); testNode.addMixin("mix:lockable"); session.save(); testNode.lock(true, true); File destFile = File.createTempFile("sysLockNodeExport", ".xml"); destFile.deleteOnExit(); OutputStream outStream = new FileOutputStream(destFile); session.exportSystemView(firstNode.getPath(), outStream, false, false); outStream.close(); Document doc = builder.parse(new FileInputStream(destFile)); // assertEquals(Constants.DEFAULT_ENCODING, doc.getXmlEncoding()); // NodeList list = doc.getElementsByTagName("sysLockNode"); NodeList list = doc.getElementsByTagName("sv:node"); // 2 nodes exported assertEquals(2, list.getLength()); // 2 properties primariType and mixinType assertEquals(2, list.item(1).getChildNodes().getLength()); testNode.unlock(); testNode.remove(); session.save(); assertTrue(destFile.delete()); } public void testMultyValueExportCh() throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, RepositoryException, IOException, SAXException, XPathExpressionException, TransformerConfigurationException { Node testNode = root.addNode("syschMultyValueExportStream"); for (int i = 0; i < valList.size(); i++) { testNode.setProperty("prop_" + i + "_string", valList.get(i), PropertyType.STRING); testNode.setProperty("prop_" + i + "_binary", valList.get(i), PropertyType.BINARY); } session.save(); File destFile = File.createTempFile("xmlTest", ".xml"); OutputStream outputStream2 = new FileOutputStream(destFile); SAXTransformerFactory saxFact = (SAXTransformerFactory)TransformerFactory.newInstance(); TransformerHandler handler = saxFact.newTransformerHandler(); handler.setResult(new StreamResult(outputStream2)); long startTime = System.currentTimeMillis(); session.exportSystemView(testNode.getPath(), handler, false, false); outputStream2.close(); Document doc = builder.parse(new FileInputStream(destFile)); XPathExpression expr = xpath.compile("//sv:property"); Object result = expr.evaluate(doc, XPathConstants.NODESET); // System.out.println(result); NodeList nodes = (NodeList)result; for (int i = 1; i < nodes.getLength(); i++) { String propertyName = nodes.item(i).getAttributes().getNamedItem("sv:name").getNodeValue(); StringTokenizer tokenizer = new StringTokenizer(propertyName, "_"); tokenizer.nextToken(); String[] pureValues = valList.get(Integer.parseInt(tokenizer.nextToken())); String type = tokenizer.nextToken(); NodeList nodeValues = nodes.item(i).getChildNodes(); assertEquals(pureValues.length, nodeValues.getLength()); for (int j = 0; j < nodeValues.getLength(); j++) { String exportedContent = nodeValues.item(j).getTextContent(); if ("string".equals(type)) { assertEquals(pureValues[j], StringConverter.denormalizeString(exportedContent)); } else if ("binary".equals(type)) { assertEquals(pureValues[j], new String(Base64.decode(exportedContent), Constants.DEFAULT_ENCODING)); } } } destFile.delete(); } public void testMultyValueExportStream() throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, RepositoryException, IOException, SAXException, XPathExpressionException { Node testNode = root.addNode("MultyValueExportStream"); for (int i = 0; i < valList.size(); i++) { testNode.setProperty("prop_" + i + "_string", valList.get(i), PropertyType.STRING); testNode.setProperty("prop_" + i + "_binary", valList.get(i), PropertyType.BINARY); } session.save(); File destFile = File.createTempFile("sysMultyValueExportStream", ".xml"); destFile.deleteOnExit(); OutputStream outStream = new FileOutputStream(destFile); session.exportSystemView(testNode.getPath(), outStream, false, false); outStream.close(); Document doc = builder.parse(new FileInputStream(destFile)); XPathExpression expr = xpath.compile("//sv:property"); Object result = expr.evaluate(doc, XPathConstants.NODESET); // System.out.println(result); NodeList nodes = (NodeList)result; for (int i = 1; i < nodes.getLength(); i++) { String propertyName = nodes.item(i).getAttributes().getNamedItem("sv:name").getNodeValue(); StringTokenizer tokenizer = new StringTokenizer(propertyName, "_"); tokenizer.nextToken(); String[] pureValues = valList.get(Integer.parseInt(tokenizer.nextToken())); String type = tokenizer.nextToken(); NodeList nodeValues = nodes.item(i).getChildNodes(); assertEquals(pureValues.length, nodeValues.getLength()); for (int j = 0; j < nodeValues.getLength(); j++) { String exportedContent = nodeValues.item(j).getTextContent(); if ("string".equals(type)) { assertEquals(pureValues[j], StringConverter.denormalizeString(exportedContent)); } else if ("binary".equals(type)) { assertEquals(pureValues[j], new String(Base64.decode(exportedContent), Constants.DEFAULT_ENCODING)); } } } destFile.delete(); } public void testMultyValueExportStreamSkipBinary() throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, RepositoryException, IOException, SAXException, XPathExpressionException { Node testNode = root.addNode("MultyValueExportStream"); for (int i = 0; i < valList.size(); i++) { testNode.setProperty("prop_" + i + "_string", valList.get(i), PropertyType.STRING); testNode.setProperty("prop_" + i + "_binary", valList.get(i), PropertyType.BINARY); } session.save(); File destFile = File.createTempFile("multyValueExportStreamSkipBinary", ".xml"); destFile.deleteOnExit(); OutputStream outStream = new FileOutputStream(destFile); session.exportSystemView(testNode.getPath(), outStream, true, false); outStream.close(); Document doc = builder.parse(new FileInputStream(destFile)); XPathExpression expr = xpath.compile("//sv:property"); Object result = expr.evaluate(doc, XPathConstants.NODESET); // System.out.println(result); NodeList nodes = (NodeList)result; for (int i = 1; i < nodes.getLength(); i++) { String propertyName = nodes.item(i).getAttributes().getNamedItem("sv:name").getNodeValue(); StringTokenizer tokenizer = new StringTokenizer(propertyName, "_"); tokenizer.nextToken(); String[] pureValues = valList.get(Integer.parseInt(tokenizer.nextToken())); String type = tokenizer.nextToken(); NodeList nodeValues = nodes.item(i).getChildNodes(); assertEquals(pureValues.length, nodeValues.getLength()); for (int j = 0; j < nodeValues.getLength(); j++) { String exportedContent = nodeValues.item(j).getTextContent(); if ("string".equals(type)) { assertEquals(pureValues[j], StringConverter.denormalizeString(exportedContent)); } else if ("binary".equals(type)) { assertEquals("", exportedContent); } } } destFile.delete(); } public void testWithContentHandler() throws RepositoryException, SAXException { MockContentHandler mock = new MockContentHandler(); session.exportSystemView("/childNode", mock, false, true); assertEquals(1, mock.nodes); assertEquals(2, mock.properties); } public void testExportSystemViewWhenPathNotFound() throws IOException, SAXException, RepositoryException { try { session.exportSystemView("/testNode", new MockContentHandler(), false, true); fail(); } catch (PathNotFoundException e) { } ByteArrayOutputStream out = new ByteArrayOutputStream(); try { session.exportSystemView("/testNode", out, false, false); fail(); } catch (PathNotFoundException e) { } finally { out.close(); } } }