package org.docx4j.model.fields.docproperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.docx4j.docProps.core.dc.elements.SimpleLiteral;
import org.docx4j.model.fields.FieldFormattingException;
import org.docx4j.model.fields.FieldValueException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.DocPropsCustomPart;
public class DocPropertyResolver {
private static Logger log = LoggerFactory.getLogger(DocPropertyResolver.class);
/* Needs access to the following parts:
- core props
- custom props
- extended props
But not CoverPageProps (if available), since those are
accessible via content control data binding, but not
DOCPROPERTY field (at least via Word 2010 UI).
Notes:
DOCPROPERTY Pages \* MERGEFORMAT
--> 54
DOCPROPERTY PAGES / NUMPAGES \* MERGEFORMAT
!-> NOT FOUND!
*/
private DocPropsCustomPart docPropsCustomPart;
private org.docx4j.docProps.core.CoreProperties coreProperties;
private org.docx4j.docProps.extended.Properties extendedProperties;
private final static String BUILT_IN_FIELDS_CORE = "Author, Comments, CreateTime, LastPrinted, LastSavedBy, LastSavedTime, RevisionNumber, Subject, Title";
private final static String BUILT_IN_FIELDS_EXTENDED = "Characters, CharactersWithSpaces, Company, Lines, NameofApplication, Pages, Paragraphs, Security, Template, TotalEditingTime, Words";
private final static String BUILT_IN_FIELDS_UNSUPPORTED = "Bytes";
public DocPropertyResolver(WordprocessingMLPackage wordMLPackage) {
coreProperties = wordMLPackage.getDocPropsCorePart() == null ? null : wordMLPackage.getDocPropsCorePart().getJaxbElement();
extendedProperties = wordMLPackage.getDocPropsExtendedPart() == null ? null : wordMLPackage.getDocPropsExtendedPart().getJaxbElement();
docPropsCustomPart = wordMLPackage.getDocPropsCustomPart();
}
public String getValue(String key) throws FieldFormattingException, FieldValueException {
Object value = null;
// Most likely a custom value, so try this first
if (docPropsCustomPart!=null) {
value = docPropsCustomPart.getProperty(key);
}
if (BUILT_IN_FIELDS_CORE.contains(key)) {
value = getCoreValue(key);
} else if (BUILT_IN_FIELDS_EXTENDED.contains(key)) {
value = getExtendedValue(key);
} else if (BUILT_IN_FIELDS_UNSUPPORTED.contains(key)) {
log.warn("No support for DOCPROPERTY field " + key);
return null;
}
if (value==null) {
throw new FieldValueException("No value found for DOCPROPERTY " + key);
} else {
if (value instanceof String) {
return (String)value;
} else if (value instanceof Integer) {
return ((Integer)value).toString();
} else {
throw new FieldFormattingException("TODO: convert " + value.getClass().getName() + " to string");
}
}
}
private Object getCoreValue(String key) {
if ("Author".equals(key)) return getFirstValue(coreProperties.getCreator());
else if ("Comments".equals(key)) return getFirstValue(coreProperties.getDescription().getValue());
else if ("CreateTime".equals(key)) return getFirstValue(coreProperties.getCreated());
else if ("LastPrinted".equals(key)) return coreProperties.getLastPrinted(); // XMLGregorianCalendar
else if ("LastSavedBy".equals(key)) return getFirstValue(coreProperties.getModified());
else if ("LastSavedTime".equals(key)) return coreProperties.getLastModifiedBy();
else if ("RevisionNumber".equals(key)) return coreProperties.getRevision();
else if ("Subject".equals(key)) return getFirstValue(coreProperties.getSubject());
else if ("Title".equals(key)) return getFirstValue(coreProperties.getTitle().getValue());
else {
log.error("Handle " + key);
return null;
}
}
private Object getExtendedValue(String key) {
if ("Characters".equals(key)) return extendedProperties.getCharacters();
else if ("CharactersWithSpaces".equals(key)) return extendedProperties.getCharactersWithSpaces();
else if ("Company".equals(key)) return extendedProperties.getCompany();
else if ("HyperlinkBase".equals(key)) return extendedProperties.getHyperlinkBase();
else if ("Lines".equals(key)) return extendedProperties.getLines();
else if ("NameofApplication".equals(key)) return extendedProperties.getApplication();
else if ("Pages".equals(key)) return extendedProperties.getPages();
else if ("Paragraphs".equals(key)) return extendedProperties.getParagraphs();
else if ("Security".equals(key)) return extendedProperties.getDocSecurity();
else if ("Template".equals(key)) return extendedProperties.getTemplate();
else if ("TotalEditingTime".equals(key)) return extendedProperties.getTotalTime();
else if ("Words".equals(key)) return extendedProperties.getWords();
else {
log.error("Handle " + key);
return null;
}
}
private String getFirstValue(SimpleLiteral simpleLiteral) {
if (simpleLiteral.getContent().size()==0) {
return null;
} else {
return simpleLiteral.getContent().get(0);
}
}
}