End of the day commit
This commit is contained in:
parent
e7f4f3c46e
commit
76859c54db
6 changed files with 274 additions and 107 deletions
6
source/pro/litvinovg/libreoffice/DocumentParser.java
Normal file
6
source/pro/litvinovg/libreoffice/DocumentParser.java
Normal file
|
@ -0,0 +1,6 @@
|
|||
package pro.litvinovg.libreoffice;
|
||||
|
||||
public interface DocumentParser {
|
||||
|
||||
public void parse();
|
||||
}
|
90
source/pro/litvinovg/libreoffice/DocumentParserImpl.java
Normal file
90
source/pro/litvinovg/libreoffice/DocumentParserImpl.java
Normal file
|
@ -0,0 +1,90 @@
|
|||
package pro.litvinovg.libreoffice;
|
||||
|
||||
import com.sun.star.beans.XPropertySet;
|
||||
import com.sun.star.container.NoSuchElementException;
|
||||
import com.sun.star.container.XEnumeration;
|
||||
import com.sun.star.container.XEnumerationAccess;
|
||||
import com.sun.star.lang.WrappedTargetException;
|
||||
import com.sun.star.lang.XServiceInfo;
|
||||
import com.sun.star.table.XCell;
|
||||
import com.sun.star.text.XText;
|
||||
import com.sun.star.text.XTextContent;
|
||||
import com.sun.star.text.XTextRange;
|
||||
import com.sun.star.text.XTextTable;
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
|
||||
|
||||
public class DocumentParserImpl implements DocumentParser{
|
||||
XText text = null;
|
||||
protected XTextRange documentEnd = null;
|
||||
public DocumentParserImpl(XText text) {
|
||||
super();
|
||||
this.text = text;
|
||||
}
|
||||
public void parse() {
|
||||
parseText(text);
|
||||
}
|
||||
protected void parseText(XText curText) {
|
||||
XEnumerationAccess enumAccess = UnoRuntime.queryInterface(XEnumerationAccess.class, curText);
|
||||
XEnumeration textEnum = enumAccess.createEnumeration();
|
||||
while (textEnum.hasMoreElements()) {
|
||||
try {
|
||||
XTextContent textContent = UnoRuntime.queryInterface(XTextContent.class, textEnum.nextElement());
|
||||
documentEnd = textContent.getAnchor().getEnd();
|
||||
if(isSupported(textContent, "com.sun.star.text.TextTable")) {
|
||||
parseTable(textContent);
|
||||
} else
|
||||
if (isSupported(textContent, "com.sun.star.style.ParagraphProperties")) {
|
||||
parseParagraph(textContent);
|
||||
}
|
||||
} catch (NoSuchElementException e) {
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void parseTable(XTextContent textContent) {
|
||||
XTextTable table = UnoRuntime.queryInterface(XTextTable.class, textContent);
|
||||
String[] cellNames = table.getCellNames();
|
||||
for (String cellName : cellNames) {
|
||||
XCell cell = table.getCellByName(cellName);
|
||||
XText cellText = UnoRuntime.queryInterface(XText.class, cell);
|
||||
cellText.getText();
|
||||
parseText(cellText);
|
||||
}
|
||||
}
|
||||
|
||||
private void parseParagraph(XTextContent textContent) {
|
||||
XPropertySet properties = UnoRuntime.queryInterface(XPropertySet.class, textContent);
|
||||
paraProperties(properties, textContent);
|
||||
XEnumerationAccess enumAccess = UnoRuntime.queryInterface(XEnumerationAccess.class, textContent);
|
||||
XEnumeration paraEnum = enumAccess.createEnumeration();
|
||||
while (paraEnum.hasMoreElements()) {
|
||||
try {
|
||||
XPropertySet portionPoperties = UnoRuntime.queryInterface(com.sun.star.beans.XPropertySet.class, paraEnum.nextElement());
|
||||
portionProperties(portionPoperties, textContent);
|
||||
} catch (NoSuchElementException e) {
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void portionProperties(XPropertySet portionPoperties, XTextContent textContent) {
|
||||
}
|
||||
protected void paraProperties(XPropertySet properties,XTextContent textContent) {
|
||||
}
|
||||
|
||||
private boolean isSupported(Object object, String service) {
|
||||
XServiceInfo info = UnoRuntime.queryInterface(XServiceInfo.class, object);
|
||||
if (info == null) {
|
||||
return false;
|
||||
}
|
||||
return info.supportsService(service);
|
||||
}
|
||||
}
|
47
source/pro/litvinovg/libreoffice/MetadataCleaner.java
Normal file
47
source/pro/litvinovg/libreoffice/MetadataCleaner.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
package pro.litvinovg.libreoffice;
|
||||
|
||||
import static pro.litvinovg.libreoffice.metadata.Document.METADATA_EXTENSION;
|
||||
|
||||
import com.sun.star.beans.UnknownPropertyException;
|
||||
import com.sun.star.beans.XPropertySet;
|
||||
import com.sun.star.container.NoSuchElementException;
|
||||
import com.sun.star.lang.WrappedTargetException;
|
||||
import com.sun.star.text.XText;
|
||||
import com.sun.star.text.XTextContent;
|
||||
import com.sun.star.text.XTextField;
|
||||
import com.sun.star.text.XTextRange;
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
|
||||
public class MetadataCleaner extends DocumentParserImpl {
|
||||
|
||||
public MetadataCleaner(XText text) {
|
||||
super(text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void portionProperties(XPropertySet portionPoperties, XTextContent textContent) {
|
||||
String portionType = null;
|
||||
try {
|
||||
portionType = (String) portionPoperties.getPropertyValue("TextPortionType");
|
||||
if (portionType != null && portionType.equals("Annotation")) {
|
||||
Object annotation = portionPoperties.getPropertyValue("TextField");
|
||||
XPropertySet annotationProperties = UnoRuntime.queryInterface(XPropertySet.class, annotation);
|
||||
String author = (String) annotationProperties.getPropertyValue("Author");
|
||||
if (author != null && author.equals(METADATA_EXTENSION)) {
|
||||
XTextRange anchor = textContent.getAnchor();
|
||||
XText curText = anchor.getText();
|
||||
XTextField textField = UnoRuntime.queryInterface(XTextField.class, annotation);
|
||||
try {
|
||||
curText.removeTextContent( textField );
|
||||
} catch (NoSuchElementException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (UnknownPropertyException e) {
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
69
source/pro/litvinovg/libreoffice/MetadataReader.java
Normal file
69
source/pro/litvinovg/libreoffice/MetadataReader.java
Normal file
|
@ -0,0 +1,69 @@
|
|||
package pro.litvinovg.libreoffice;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.sun.star.beans.UnknownPropertyException;
|
||||
import com.sun.star.beans.XPropertySet;
|
||||
import com.sun.star.lang.WrappedTargetException;
|
||||
import com.sun.star.text.XText;
|
||||
import com.sun.star.text.XTextContent;
|
||||
import com.sun.star.text.XTextRange;
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
import pro.litvinovg.libreoffice.metadata.OutlineElement;
|
||||
import static pro.litvinovg.libreoffice.metadata.Document.*;
|
||||
|
||||
|
||||
public class MetadataReader extends DocumentParserImpl {
|
||||
private ArrayList<OutlineElement> outline;
|
||||
|
||||
public MetadataReader(XText text, ArrayList<OutlineElement> outline) {
|
||||
super(text);
|
||||
this.outline = outline;
|
||||
}
|
||||
@Override
|
||||
public void parse() {
|
||||
parseText(text);
|
||||
OutlineElement lastElement = outline.get(outline.size()-1);
|
||||
lastElement.setAnnotationEnd(documentEnd);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void portionProperties(XPropertySet portionPoperties, XTextContent textContent) {
|
||||
String portionType = null;
|
||||
try {
|
||||
portionType = (String) portionPoperties.getPropertyValue("TextPortionType");
|
||||
if (portionType != null && portionType.equals("Annotation")) {
|
||||
Object annotation = portionPoperties.getPropertyValue("TextField");
|
||||
XPropertySet annotationProperties = UnoRuntime.queryInterface(XPropertySet.class, annotation);
|
||||
String author = (String) annotationProperties.getPropertyValue("Author");
|
||||
if (author != null && author.equals(METADATA_EXTENSION)) {
|
||||
String content = (String) annotationProperties.getPropertyValue("Content");
|
||||
OutlineElement lastElement = outline.get(outline.size()-1);
|
||||
lastElement.readMetadata(content);
|
||||
}
|
||||
}
|
||||
} catch (UnknownPropertyException e) {
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paraProperties(XPropertySet properties, XTextContent textContent) {
|
||||
Short outlineLevel = null;
|
||||
try {
|
||||
outlineLevel = (Short) properties.getPropertyValue("OutlineLevel");
|
||||
} catch (UnknownPropertyException e) {
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (outlineLevel != null && outlineLevel > 0) {
|
||||
XTextRange textRange = textContent.getAnchor();
|
||||
OutlineElement lastElement = outline.get(outline.size()-1);
|
||||
lastElement.setAnnotationEnd(textContent.getAnchor().getStart());
|
||||
outline.add(new OutlineElement(textRange));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,13 +1,11 @@
|
|||
package pro.litvinovg.libreoffice.metadata;
|
||||
|
||||
import java.nio.file.attribute.UserDefinedFileAttributeView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sun.org.apache.bcel.internal.generic.NEW;
|
||||
import com.sun.star.beans.IllegalTypeException;
|
||||
import com.sun.star.beans.NotRemoveableException;
|
||||
import com.sun.star.beans.Property;
|
||||
|
@ -16,26 +14,22 @@ import com.sun.star.beans.UnknownPropertyException;
|
|||
import com.sun.star.beans.XPropertyContainer;
|
||||
import com.sun.star.beans.XPropertySet;
|
||||
import com.sun.star.beans.XPropertySetInfo;
|
||||
import com.sun.star.container.NoSuchElementException;
|
||||
import com.sun.star.container.XEnumeration;
|
||||
import com.sun.star.container.XEnumerationAccess;
|
||||
import com.sun.star.document.XDocumentProperties;
|
||||
import com.sun.star.document.XDocumentPropertiesSupplier;
|
||||
import com.sun.star.frame.XDesktop;
|
||||
import com.sun.star.lang.IllegalArgumentException;
|
||||
import com.sun.star.lang.WrappedTargetException;
|
||||
import com.sun.star.lang.XComponent;
|
||||
import com.sun.star.lang.XMultiComponentFactory;
|
||||
import com.sun.star.lang.XServiceInfo;
|
||||
import com.sun.star.table.XCell;
|
||||
import com.sun.star.lang.XMultiServiceFactory;
|
||||
import com.sun.star.text.XText;
|
||||
import com.sun.star.text.XTextContent;
|
||||
import com.sun.star.text.XTextDocument;
|
||||
import com.sun.star.text.XTextRange;
|
||||
import com.sun.star.text.XTextTable;
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
import com.sun.star.uno.XComponentContext;
|
||||
|
||||
import pro.litvinovg.libreoffice.DocumentParser;
|
||||
import pro.litvinovg.libreoffice.MetadataCleaner;
|
||||
import pro.litvinovg.libreoffice.MetadataReader;
|
||||
|
||||
public class Document {
|
||||
|
||||
private static final String DOC_AUTHOR = "Document author";
|
||||
|
@ -44,11 +38,12 @@ public class Document {
|
|||
private static final String DOC_DESCRIPTION = "Document description";
|
||||
private static final String DOC_KEYWORDS = "Document keywords";
|
||||
private static final short REMOVEABLE_ATTRIBUTE = 128;
|
||||
private static final Object METADATA_EXTENSION = "Metadata Extension";
|
||||
public static final String METADATA_EXTENSION = "Metadata Extension";
|
||||
|
||||
private XComponentContext context;
|
||||
private XDesktop xDesktop;
|
||||
private XMultiComponentFactory multiComponentFactory;
|
||||
private XMultiServiceFactory multiServiceFactory;
|
||||
private XComponent currentDocument;
|
||||
private XDocumentProperties documentProperties;
|
||||
private XDocumentPropertiesSupplier documentPropertiesSupplier;
|
||||
|
@ -63,13 +58,13 @@ public class Document {
|
|||
xDesktop = UnoRuntime.queryInterface(XDesktop.class, oDesktop);
|
||||
getCurrentDocument();
|
||||
getDocumentText();
|
||||
updateChapterMetadata();
|
||||
multiServiceFactory = UnoRuntime.queryInterface(XMultiServiceFactory.class, currentDocument);
|
||||
readMetadataInDocument();
|
||||
} catch (Exception e) {
|
||||
System.out.println("xDesktop inaccessible. Can not proceed.");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
//logProperties();
|
||||
}
|
||||
|
||||
private void getDocumentText() {
|
||||
|
@ -77,94 +72,29 @@ public class Document {
|
|||
text = textDocument.getText();
|
||||
}
|
||||
|
||||
private void updateChapterMetadata() {
|
||||
readMetadataInDocument();
|
||||
|
||||
}
|
||||
|
||||
private void readMetadataInDocument() {
|
||||
readMetadataInText(this.text);
|
||||
DocumentParser reader = new MetadataReader(text, outline);
|
||||
reader.parse();
|
||||
}
|
||||
|
||||
private void readMetadataInText(XText curText) {
|
||||
XEnumerationAccess enumAccess = UnoRuntime.queryInterface(XEnumerationAccess.class, curText);
|
||||
XEnumeration textEnum = enumAccess.createEnumeration();
|
||||
while (textEnum.hasMoreElements()) {
|
||||
|
||||
private void cleanMetadataInDocument() {
|
||||
DocumentParser reader = new MetadataCleaner(text);
|
||||
reader.parse();
|
||||
}
|
||||
|
||||
private void writeMetadata() {
|
||||
cleanMetadataInDocument();
|
||||
for (OutlineElement element : outline){
|
||||
Object annotation;
|
||||
try {
|
||||
XTextContent textContent = UnoRuntime.queryInterface(XTextContent.class, textEnum.nextElement());
|
||||
if(isSupported(textContent, "com.sun.star.text.TextTable")) {
|
||||
readMetadataInTable(textContent);
|
||||
} else
|
||||
if (isSupported(textContent, "com.sun.star.style.ParagraphProperties")) {
|
||||
readMetadataInParagraph(textContent);
|
||||
}
|
||||
} catch (NoSuchElementException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
// TODO Auto-generated catch block
|
||||
annotation = multiServiceFactory.createInstance("com.sun.star.text.textfield.nnotation");
|
||||
element.writeMetadata(annotation);
|
||||
} catch (com.sun.star.uno.Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void readMetadataInTable(XTextContent textContent) {
|
||||
XTextTable table = UnoRuntime.queryInterface(XTextTable.class, textContent);
|
||||
String[] cellNames = table.getCellNames();
|
||||
for (String cellName : cellNames) {
|
||||
XCell cell = table.getCellByName(cellName);
|
||||
XText cellText = UnoRuntime.queryInterface(XText.class, cell);
|
||||
cellText.getText();
|
||||
readMetadataInText(cellText);
|
||||
}
|
||||
}
|
||||
|
||||
private void readMetadataInParagraph(XTextContent textContent) throws WrappedTargetException {
|
||||
checkOutlineLevel(textContent);
|
||||
XEnumerationAccess enumAccess = UnoRuntime.queryInterface(XEnumerationAccess.class, textContent);
|
||||
XEnumeration paraEnum = enumAccess.createEnumeration();
|
||||
while (paraEnum.hasMoreElements()) {
|
||||
String portionType = null;
|
||||
try {
|
||||
XPropertySet portionPoperties = UnoRuntime.queryInterface(com.sun.star.beans.XPropertySet.class, paraEnum.nextElement());
|
||||
portionType = (String) portionPoperties.getPropertyValue("TextPortionType");
|
||||
if (portionType != null && portionType.equals("Annotation")) {
|
||||
Object annotation = portionPoperties.getPropertyValue("TextField");
|
||||
XPropertySet annotationProperties = UnoRuntime.queryInterface(XPropertySet.class, annotation);
|
||||
String author = (String) annotationProperties.getPropertyValue("Author");
|
||||
if (author != null && author.equals(METADATA_EXTENSION)) {
|
||||
String content = (String) annotationProperties.getPropertyValue("Content");
|
||||
OutlineElement lastElement = outline.get(outline.size()-1);
|
||||
lastElement.readMetadata(content);
|
||||
}
|
||||
}
|
||||
} catch (NoSuchElementException e) {
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnknownPropertyException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void checkOutlineLevel(XTextContent textContent) throws WrappedTargetException {
|
||||
Short outlineLevel = null;
|
||||
XPropertySet properties = UnoRuntime.queryInterface(XPropertySet.class, textContent);
|
||||
try {
|
||||
outlineLevel = (Short) properties.getPropertyValue("OutlineLevel");
|
||||
} catch (UnknownPropertyException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (outlineLevel != null && outlineLevel > 0) {
|
||||
XTextRange textRange = textContent.getAnchor();
|
||||
outline.add(new OutlineElement(textRange));
|
||||
}
|
||||
}
|
||||
|
||||
private void getCurrentDocument() throws MetadataInaccessableException {
|
||||
currentDocument = xDesktop.getCurrentComponent();
|
||||
if (currentDocument == null) {
|
||||
|
@ -341,14 +271,6 @@ public class Document {
|
|||
return value;
|
||||
}
|
||||
|
||||
private boolean isSupported(Object object, String service) {
|
||||
XServiceInfo info = UnoRuntime.queryInterface(XServiceInfo.class, object);
|
||||
if (info == null) {
|
||||
return false;
|
||||
}
|
||||
return info.supportsService(service);
|
||||
|
||||
}
|
||||
public ArrayList<OutlineElement> getOutline(){
|
||||
return outline;
|
||||
}
|
||||
|
|
|
@ -6,9 +6,17 @@ import java.util.Iterator;
|
|||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
|
||||
import com.sun.star.beans.PropertyVetoException;
|
||||
import com.sun.star.beans.UnknownPropertyException;
|
||||
import com.sun.star.beans.XPropertySet;
|
||||
import com.sun.star.lang.IllegalArgumentException;
|
||||
import com.sun.star.lang.WrappedTargetException;
|
||||
import com.sun.star.text.XText;
|
||||
import com.sun.star.text.XTextCursor;
|
||||
import com.sun.star.text.XTextField;
|
||||
import com.sun.star.text.XTextRange;
|
||||
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
import static pro.litvinovg.libreoffice.metadata.Document.*;
|
||||
public class OutlineElement {
|
||||
|
||||
private String name;
|
||||
|
@ -19,7 +27,6 @@ public class OutlineElement {
|
|||
}
|
||||
|
||||
private XTextRange textRange;
|
||||
private boolean hasMetadataStorage = false;
|
||||
private XTextRange annotationStart = null;
|
||||
private XTextRange annotationEnd = null;
|
||||
|
||||
|
@ -29,7 +36,7 @@ public class OutlineElement {
|
|||
this.metadata = new ArrayList<MetadataElement>();
|
||||
annotationStart = textRange.getStart();
|
||||
}
|
||||
public void setAnnotationAnchorEnd(XTextRange anchor) {
|
||||
public void setAnnotationEnd(XTextRange anchor) {
|
||||
this.annotationEnd = anchor;
|
||||
}
|
||||
|
||||
|
@ -49,13 +56,39 @@ public class OutlineElement {
|
|||
}
|
||||
}
|
||||
|
||||
public String metadataToString() {
|
||||
private String metadataToString() {
|
||||
JSONObject json = new JSONObject();
|
||||
for (MetadataElement element : metadata) {
|
||||
json.put(element.getName(), element.getValue());
|
||||
}
|
||||
return json.toString();
|
||||
}
|
||||
public void writeMetadata(Object annotation) {
|
||||
XPropertySet properties = UnoRuntime.queryInterface(XPropertySet.class, annotation);
|
||||
XText startText = annotationStart.getText();
|
||||
try {
|
||||
properties.setPropertyValue("Author", METADATA_EXTENSION);
|
||||
properties.setPropertyValue("Content", metadataToString());
|
||||
XTextRange annotationRange = null;
|
||||
if (startText.equals(annotationEnd.getText())){
|
||||
XTextCursor cursor = startText.createTextCursorByRange(annotationStart);
|
||||
cursor.gotoRange(annotationEnd, true);
|
||||
annotationRange = UnoRuntime.queryInterface(XTextRange.class, cursor);
|
||||
} else {
|
||||
annotationRange = textRange;
|
||||
}
|
||||
XTextField textField = UnoRuntime.queryInterface(XTextField.class, annotation);
|
||||
startText.insertTextContent( annotationRange, textField, true );
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnknownPropertyException e) {
|
||||
e.printStackTrace();
|
||||
} catch (PropertyVetoException e) {
|
||||
e.printStackTrace();
|
||||
} catch (WrappedTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue