/*
* 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.sequencer.msoffice;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.modeshape.jcr.api.JcrConstants.JCR_MIME_TYPE;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.AUTHOR;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.COMMENT;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.EXCEL_SHEET_NODE;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.HEADING_LEVEL;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.HEADING_NAME;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.HEADING_NODE;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.KEYWORDS;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.METADATA_NODE;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.NOTES;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.SHEET_NAME;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.SLIDE_NODE;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.SUBJECT;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.TEXT;
import static org.modeshape.sequencer.msoffice.MSOfficeMetadataLexicon.TITLE;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import org.junit.Test;
import org.modeshape.jcr.sequencer.AbstractSequencerTest;
import org.modeshape.sequencer.msoffice.MSOfficeMetadataSequencer.MimeTypeConstants;
/**
* Unit test for {@link MSOfficeMetadataSequencer}
*
* @author Horia Chiorean
*/
public class MSOfficeMetadataSequencerTest extends AbstractSequencerTest {
@SuppressWarnings( "serial" )
private static final Map<String, Integer> WORD_HEADINGS = new LinkedHashMap<String, Integer>() {
{
put("Test Heading 1", 1);
put("Test Heading 1.1", 2);
put("Test Heading 1.2", 2);
put("Test Heading 1.2.1", 3);
put("Test Heading 2", 1);
put("Test Heading 2.1", 2);
put("Test Heading 2.2", 2);
}
};
@SuppressWarnings( "serial" )
private static final Map<String, String> EXCEL_SHEETS = new LinkedHashMap<String, String>() {
{
put("Sheet1", "This is a text");
put("MySheet2", null);
put("Sheet3", null);
}
};
@Test
public void shouldSequenceWordFiles() throws Exception {
createNodeWithContentFromFile("word.doc", "word.doc");
Node outputNode = getOutputNode(rootNode, "word.doc/" + METADATA_NODE);
assertNotNull(outputNode);
assertEquals(METADATA_NODE, outputNode.getPrimaryNodeType().getName());
String mimeType = outputNode.getProperty(JCR_MIME_TYPE).getString();
assertEquals(MimeTypeConstants.MICROSOFT_WORD.equals(mimeType)
|| MimeTypeConstants.MICROSOFT_APPLICATION_MS_WORD.equals(mimeType),
true);
assertMetadata(outputNode);
NodeIterator headingsIterator = outputNode.getNodes();
assertEquals(WORD_HEADINGS.size(), headingsIterator.getSize());
while (headingsIterator.hasNext()) {
Node heading = headingsIterator.nextNode();
assertEquals(HEADING_NODE, heading.getPrimaryNodeType().getName());
Integer headingLevel = WORD_HEADINGS.get(heading.getProperty(HEADING_NAME).getString());
assertEquals(headingLevel.longValue(), heading.getProperty(HEADING_LEVEL).getLong());
}
}
private void assertMetadata( Node outputNode ) throws RepositoryException {
assertEquals("Test Comment", outputNode.getProperty(COMMENT).getString());
assertEquals("Michael Trezzi", outputNode.getProperty(AUTHOR).getString());
assertEquals("jboss, test, dna", outputNode.getProperty(KEYWORDS).getString());
assertEquals("Test Document", outputNode.getProperty(TITLE).getString());
assertEquals("Test Subject", outputNode.getProperty(SUBJECT).getString());
}
@Test
public void shouldSequenceExcelFiles() throws Exception {
createNodeWithContentFromFile("excel.xls", "excel.xls");
Node outputNode = getOutputNode(rootNode, "excel.xls/" + METADATA_NODE);
assertNotNull(outputNode);
assertEquals(METADATA_NODE, outputNode.getPrimaryNodeType().getName());
assertEquals(MimeTypeConstants.MICROSOFT_EXCEL, outputNode.getProperty(JCR_MIME_TYPE).getString());
assertMetadata(outputNode);
NodeIterator sheetsIterator = outputNode.getNodes();
assertEquals(EXCEL_SHEETS.size(), sheetsIterator.getSize());
while (sheetsIterator.hasNext()) {
Node sheet = sheetsIterator.nextNode();
assertEquals(EXCEL_SHEET_NODE, sheet.getPrimaryNodeType().getName());
String sheetName = sheet.getProperty(SHEET_NAME).getString();
assertTrue(EXCEL_SHEETS.containsKey(sheetName));
String text = EXCEL_SHEETS.get(sheetName);
if (text != null) {
assertTrue(sheet.getProperty(TEXT).getString().contains(text));
}
}
}
@Test
public void shouldSequenceAnotherExcelFiles() throws Exception {
createNodeWithContentFromFile("msoffice_file.xls", "msoffice_file.xls");
Node outputNode = getOutputNode(rootNode, "msoffice_file.xls/" + METADATA_NODE);
assertNotNull(outputNode);
assertEquals(METADATA_NODE, outputNode.getPrimaryNodeType().getName());
assertEquals(MimeTypeConstants.MICROSOFT_EXCEL, outputNode.getProperty(JCR_MIME_TYPE).getString());
assertMetadata(outputNode);
NodeIterator sheetsIterator = outputNode.getNodes();
assertEquals(EXCEL_SHEETS.size(), sheetsIterator.getSize());
while (sheetsIterator.hasNext()) {
Node sheet = sheetsIterator.nextNode();
assertEquals(EXCEL_SHEET_NODE, sheet.getPrimaryNodeType().getName());
String sheetName = sheet.getProperty(SHEET_NAME).getString();
assertTrue(EXCEL_SHEETS.containsKey(sheetName));
String text = EXCEL_SHEETS.get(sheetName);
if (text != null) {
assertTrue(sheet.getProperty(TEXT).getString().contains(text));
}
}
}
@Test
public void shouldSequencePowerpointFiles() throws Exception {
createNodeWithContentFromFile("powerpoint.ppt", "powerpoint.ppt");
Node outputNode = getOutputNode(rootNode, "powerpoint.ppt/" + METADATA_NODE);
assertNotNull(outputNode);
assertEquals(METADATA_NODE, outputNode.getPrimaryNodeType().getName());
assertEquals(MimeTypeConstants.MICROSOFT_POWERPOINT, outputNode.getProperty(JCR_MIME_TYPE).getString());
NodeIterator slidesIterator = outputNode.getNodes();
assertEquals(1, slidesIterator.getSize());
Node slide = slidesIterator.nextNode();
assertEquals(SLIDE_NODE, slide.getPrimaryNodeType().getName());
assertEquals("Test Slide", slide.getProperty(TITLE).getString());
assertEquals("This is some text", slide.getProperty(TEXT).getString());
assertEquals("My notes", slide.getProperty(NOTES).getString());
}
}