1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.onehippo.forge.content.exim.core.util;
17
18 import java.io.ByteArrayInputStream;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import javax.jcr.Binary;
25 import javax.jcr.Node;
26 import javax.jcr.NodeIterator;
27 import javax.jcr.RepositoryException;
28 import javax.jcr.Session;
29
30 import org.apache.commons.io.IOUtils;
31 import org.apache.commons.lang3.StringUtils;
32 import org.apache.tika.exception.TikaException;
33 import org.hippoecm.repository.api.HippoNodeType;
34 import org.hippoecm.repository.api.WorkflowException;
35
36
37
38
39 public class HippoBinaryNodeUtils {
40
41 private HippoBinaryNodeUtils() {
42 }
43
44
45
46
47
48
49
50
51
52
53
54
55 public static Node createMissingHippoBinaryFolders(final Session session, String absPath, String primaryTypeName,
56 String [] folderTypes, String [] galleryTypes) throws RepositoryException, WorkflowException {
57 String[] folderNames = StringUtils.split(ContentPathUtils.encodeNodePath(ContentPathUtils.removeIndexNotationInNodePath(absPath)), "/");
58
59 Node rootNode = session.getRootNode();
60 Node curNode = rootNode;
61 Node tempFolderNode;
62 String folderNodePath;
63
64 for (String folderName : folderNames) {
65
66 if (curNode == rootNode) {
67 folderNodePath = "/" + folderName;
68 } else {
69 folderNodePath = curNode.getPath() + "/" + folderName;
70 }
71
72 Node existingFolderNode = HippoNodeUtils.getExistingHippoFolderNode(session, folderNodePath);
73
74 if (existingFolderNode == null) {
75 tempFolderNode = curNode.addNode(folderName, primaryTypeName);
76 tempFolderNode.addMixin("mix:referenceable");
77
78 if (folderTypes != null) {
79 tempFolderNode.setProperty("hippostd:foldertype", folderTypes);
80 }
81
82 if (galleryTypes != null) {
83 tempFolderNode.setProperty("hippostd:gallerytype", galleryTypes);
84 }
85
86 curNode = tempFolderNode;
87 } else {
88 curNode = existingFolderNode;
89 }
90
91 curNode = HippoNodeUtils.getHippoCanonicalNode(curNode);
92
93 if (HippoNodeUtils.isHippoMirrorNode(curNode)) {
94 curNode = HippoNodeUtils.getRereferencedNodeByHippoMirror(curNode);
95 }
96 }
97
98 return curNode;
99 }
100
101
102
103
104
105
106
107
108
109
110 public static void extractTextFromBinariesAndSaveHippoTextsUnderHandlePath(final Session session, final String handlePath)
111 throws RepositoryException, IOException, TikaException {
112 if (StringUtils.isBlank(handlePath)) {
113 return;
114 }
115
116 if (!session.nodeExists(handlePath)) {
117 return;
118 }
119
120 extractTextFromBinariesAndSaveHippoTexts(session, session.getNode(handlePath));
121 }
122
123
124
125
126
127
128
129
130
131
132 public static void extractTextFromBinariesAndSaveHippoTexts(final Session session, final Node handle)
133 throws RepositoryException, IOException, TikaException {
134 List<Node> resourceNodes = new ArrayList<>();
135
136 if (handle.isNodeType(HippoNodeType.NT_RESOURCE)) {
137 resourceNodes.add(handle);
138 } else if (handle.getParent().isNodeType(HippoNodeType.NT_HANDLE)) {
139 Node resourceNode;
140 for (NodeIterator nodeIt = handle.getNodes(); nodeIt.hasNext(); ) {
141 resourceNode = nodeIt.nextNode();
142 if (resourceNode != null && resourceNode.isNodeType(HippoNodeType.NT_RESOURCE)) {
143 resourceNodes.add(resourceNode);
144 }
145 }
146 } else if (handle.isNodeType(HippoNodeType.NT_HANDLE)) {
147 Node assetSetNode;
148 Node resourceNode;
149 for (NodeIterator nodeIt1 = handle.getNodes(handle.getName()); nodeIt1.hasNext(); ) {
150 assetSetNode = nodeIt1.nextNode();
151 if (assetSetNode != null) {
152 for (NodeIterator nodeIt2 = assetSetNode.getNodes(); nodeIt2.hasNext(); ) {
153 resourceNode = nodeIt2.nextNode();
154 if (resourceNode != null && resourceNode.isNodeType(HippoNodeType.NT_RESOURCE)) {
155 resourceNodes.add(resourceNode);
156 }
157 }
158 }
159 }
160 }
161
162 String mimeType = null;
163 InputStream dataInput = null;
164 String textContent = null;
165 InputStream textInput = null;
166 Binary textBinary = null;
167
168 for (Node resourceNode : resourceNodes) {
169 mimeType = (resourceNode.hasProperty("jcr:mimeType")) ? resourceNode.getProperty("jcr:mimeType").getString()
170 : null;
171
172 if (!StringUtils.equals("application/pdf", mimeType)) {
173 continue;
174 }
175
176 try {
177 dataInput = resourceNode.getProperty("jcr:data").getBinary().getStream();
178 textContent = TikaUtils.parsePdfToString(dataInput);
179 textInput = new ByteArrayInputStream(textContent.getBytes());
180 textBinary = session.getValueFactory().createBinary(textInput);
181 resourceNode.setProperty(HippoNodeType.HIPPO_TEXT, textBinary);
182 } finally {
183 IOUtils.closeQuietly(textInput);
184 }
185 }
186 }
187
188 }