Author: piergiorgio
Date: Thu Jun 22 19:59:54 2017
New Revision: 1799610
URL: http://svn.apache.org/viewvc?rev=1799610&view=rev
Log:
CMIS Output Connector (CONNECTORS-1356)
- updated and simplified the configuration panel
- added the full support for the timestamp tree generation taking the creation
date value (YYYY/MM/dd/content.extension)
- now binary contents are correctly migrated without errors
Removed:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/editSpecification.js
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/editSpecification_CMISQuery.html
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/viewSpecification.html
Modified:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConfig.java
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConnector.java
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_en_US.properties
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_es_ES.properties
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/editConfiguration_Server.html
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/viewConfiguration.html
Modified:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConfig.java
URL:
http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConfig.java?rev=1799610&r1=1799609&r2=1799610&view=diff
==============================================================================
---
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConfig.java
(original)
+++
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConfig.java
Thu Jun 22 19:59:54 2017
@@ -66,5 +66,6 @@ public class CmisOutputConfig {
public static final String BINDING_ATOM_VALUE = "atom";
public static final String BINDING_WS_VALUE = "ws";
public static final String CMIS_QUERY_DEFAULT_VALUE = "SELECT * FROM
cmis:folder WHERE cmis:name='Apache ManifoldCF'";
+ public static final String CREATE_TIMESTAMP_TREE_DEFAULT_VALUE =
Boolean.FALSE.toString();
}
\ No newline at end of file
Modified:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConnector.java
URL:
http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConnector.java?rev=1799610&r1=1799609&r2=1799610&view=diff
==============================================================================
---
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConnector.java
(original)
+++
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/output/cmisoutput/CmisOutputConnector.java
Thu Jun 22 19:59:54 2017
@@ -32,7 +32,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
-import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.ItemIterable;
@@ -50,6 +49,7 @@ import org.apache.chemistry.opencmis.com
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import
org.apache.chemistry.opencmis.commons.exceptions.CmisConnectionException;
import
org.apache.chemistry.opencmis.commons.exceptions.CmisContentAlreadyExistsException;
+import
org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import
org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException;
import
org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
import org.apache.commons.lang.StringUtils;
@@ -121,7 +121,7 @@ public class CmisOutputConnector extends
protected String cmisQuery = null;
/** Flag for creating the new tree structure using timestamp**/
- protected boolean createTimestampTree = false;
+ protected String createTimestampTree = Boolean.FALSE.toString();
protected SessionFactory factory = SessionFactoryImpl.newInstance();
protected Map<String, String> parameters = new HashMap<String,
String>();
@@ -343,6 +343,7 @@ public class CmisOutputConnector extends
binding = null;
repositoryId = null;
cmisQuery = null;
+ createTimestampTree = Boolean.FALSE.toString();
}
@@ -366,12 +367,15 @@ public class CmisOutputConnector extends
server = params.getParameter(CmisOutputConfig.SERVER_PARAM);
port = params.getParameter(CmisOutputConfig.PORT_PARAM);
path = params.getParameter(CmisOutputConfig.PATH_PARAM);
-
+
binding = params.getParameter(CmisOutputConfig.BINDING_PARAM);
cmisQuery =
params.getParameter(CmisOutputConfig.CMIS_QUERY_PARAM);
+ createTimestampTree =
params.getParameter(CmisOutputConfig.CREATE_TIMESTAMP_TREE_PARAM);
- if
(StringUtils.isNotEmpty(params.getParameter(CmisOutputConfig.REPOSITORY_ID_PARAM)))
+ if
(StringUtils.isNotEmpty(params.getParameter(CmisOutputConfig.REPOSITORY_ID_PARAM)))
{
repositoryId =
params.getParameter(CmisOutputConfig.REPOSITORY_ID_PARAM);
+ }
+
}
/**
@@ -631,7 +635,8 @@ public class CmisOutputConnector extends
String repositoryId =
parameters.getParameter(CmisOutputConfig.REPOSITORY_ID_PARAM);
String binding =
parameters.getParameter(CmisOutputConfig.BINDING_PARAM);
String cmisQuery =
parameters.getParameter(CmisOutputConfig.CMIS_QUERY_PARAM);
-
+ String createTimestampTree =
parameters.getParameter(CmisOutputConfig.CREATE_TIMESTAMP_TREE_PARAM);
+
if (username == null)
username = StringUtils.EMPTY;
if (password == null)
@@ -652,7 +657,9 @@ public class CmisOutputConnector extends
binding = CmisOutputConfig.BINDING_ATOM_VALUE;
if (cmisQuery == null)
cmisQuery = CmisOutputConfig.CMIS_QUERY_DEFAULT_VALUE;
-
+ if(createTimestampTree == null)
+ createTimestampTree =
CmisOutputConfig.CREATE_TIMESTAMP_TREE_DEFAULT_VALUE;
+
newMap.put(CmisOutputConfig.USERNAME_PARAM, username);
newMap.put(CmisOutputConfig.PASSWORD_PARAM, password);
newMap.put(CmisOutputConfig.PROTOCOL_PARAM, protocol);
@@ -662,6 +669,7 @@ public class CmisOutputConnector extends
newMap.put(CmisOutputConfig.REPOSITORY_ID_PARAM, repositoryId);
newMap.put(CmisOutputConfig.BINDING_PARAM, binding);
newMap.put(CmisOutputConfig.CMIS_QUERY_PARAM, cmisQuery);
+ newMap.put(CmisOutputConfig.CREATE_TIMESTAMP_TREE_PARAM,
createTimestampTree);
}
/**
@@ -803,6 +811,11 @@ public class CmisOutputConnector extends
if (cmisQuery != null) {
parameters.setParameter(CmisOutputConfig.CMIS_QUERY_PARAM, cmisQuery);
}
+
+ String createTimestampTree =
variableContext.getParameter(CmisOutputConfig.CREATE_TIMESTAMP_TREE_PARAM);
+ if (createTimestampTree != null) {
+
parameters.setParameter(CmisOutputConfig.CREATE_TIMESTAMP_TREE_PARAM,
createTimestampTree);
+ }
String repositoryId =
variableContext.getParameter(CmisOutputConfig.REPOSITORY_ID_PARAM);
if (repositoryId != null) {
@@ -907,7 +920,7 @@ public class CmisOutputConnector extends
inputStream);
// create a major version
- leafParent =
getOrCreateLeafParent(parentDropZoneFolder, creationDate, false);
+ leafParent =
getOrCreateLeafParent(parentDropZoneFolder, creationDate,
Boolean.valueOf(createTimestampTree));
injectedDocument =
leafParent.createDocument(properties, contentStream, VersioningState.MAJOR);
resultDescription =
DOCUMENT_STATUS_ACCEPTED_DESC;
return DOCUMENT_STATUS_ACCEPTED;
@@ -921,7 +934,10 @@ public class CmisOutputConnector extends
String documentFullPath = leafParent.getPath() +
CmisOutputConnectorUtils.SLASH + fileName;
injectedDocument = (Document)
session.getObjectByPath(documentFullPath);
- injectedDocument.setContentStream(contentStream, true);
+
+ if(injectedDocument != null) {
+
injectedDocument.setContentStream(contentStream, true);
+ }
Logging.connectors.warn(
"CMIS: Document already exists: " +
documentFullPath+ CmisOutputConnectorUtils.SEP + e.getMessage(), e);
@@ -935,11 +951,9 @@ public class CmisOutputConnector extends
} finally {
String injectedId = StringUtils.EMPTY;
- String injectedContentUrl = StringUtils.EMPTY;
-
+
if (injectedDocument != null) {
injectedId = injectedDocument.getId();
- injectedContentUrl =
injectedDocument.getContentUrl();
// override documentURI in a CMIS standard way
for the removeDocument
// method
@@ -948,101 +962,61 @@ public class CmisOutputConnector extends
}
activities.recordActivity(startTime,
ACTIVITY_INJECTION, document.getBinaryLength(), documentURI, injectedId,
- resultDescription + injectedContentUrl);
+ resultDescription);
}
}
+ /**
+ * Check and create the leaf folder dedicate to inject the content
+ * @param folder: this is the root folder where starts the tree
+ * @param creationDate: this is the creation date of the current content
+ * @param createTimestampTree: this is the flag checked in the
ManifoldCF configuration panel
+ * @return the target folder created using the creationDate related to
the injected content
+ */
private Folder getOrCreateLeafParent(Folder folder, Date creationDate,
boolean createTimestampTree) {
Folder leafParent = folder;
if (createTimestampTree) {
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(creationDate);
String year =
String.valueOf(calendar.get(GregorianCalendar.YEAR));
- String month =
String.valueOf(calendar.get(GregorianCalendar.MONTH));
- String day =
String.valueOf(GregorianCalendar.DAY_OF_MONTH);
- ItemIterable<CmisObject> yearChildren =
folder.getChildren();
-
- // check for the year folder
- Iterator<CmisObject> iteratorYear =
yearChildren.iterator();
- boolean existYear = false;
- Folder yearFolder = null;
- while (iteratorYear.hasNext()) {
- CmisObject yearObject = (CmisObject)
iteratorYear.next();
- String baseType =
yearObject.getBaseTypeId().toString();
- String name = yearObject.getName();
- if (StringUtils.equals(baseType,
CMIS_FOLDER_BASE_TYPE) && StringUtils.equals(name, year)) {
- existYear = true;
- // get for the year folder
- yearFolder = (Folder) yearObject;
- break;
- }
- }
-
- if (!existYear) {
- // create a new year folder
- Map<String, String> newFolderYearProps = new
HashMap<String, String>();
-
newFolderYearProps.put(PropertyIds.OBJECT_TYPE_ID, CMIS_FOLDER_BASE_TYPE);
- newFolderYearProps.put(PropertyIds.NAME, year);
- yearFolder =
folder.createFolder(newFolderYearProps);
- }
-
- ItemIterable<CmisObject> monthChildren =
yearFolder.getChildren();
- Iterator<CmisObject> iteratorMonth =
monthChildren.iterator();
- boolean existMonth = false;
- Folder monthFolder = null;
- while (iteratorMonth.hasNext()) {
- CmisObject monthObject = (CmisObject)
iteratorMonth.next();
- String baseTypeMonth =
monthObject.getBaseTypeId().toString();
- String nameMonth = monthObject.getName();
-
- if (StringUtils.equals(baseTypeMonth,
CMIS_FOLDER_BASE_TYPE) && StringUtils.equals(nameMonth, month)) {
- existMonth = true;
- // get the month folder
- monthFolder = (Folder) monthObject;
- break;
- }
- }
-
- if (!existMonth) {
- // create a new month folder
- Map<String, String> newFolderMonthProps = new
HashMap<String, String>();
-
newFolderMonthProps.put(PropertyIds.OBJECT_TYPE_ID, CMIS_FOLDER_BASE_TYPE);
- newFolderMonthProps.put(PropertyIds.NAME,
month);
- monthFolder =
yearFolder.createFolder(newFolderMonthProps);
- }
+ String month =
String.valueOf((calendar.get(GregorianCalendar.MONTH)+1));
+ String day =
String.valueOf(calendar.get(GregorianCalendar.DAY_OF_MONTH));
- ItemIterable<CmisObject> dayChildren =
monthFolder.getChildren();
- Iterator<CmisObject> iteratorDay =
dayChildren.iterator();
- boolean existDay = false;
- Folder dayFolder = null;
- while (iteratorDay.hasNext()) {
- CmisObject dayObject = (CmisObject)
iteratorDay.next();
- String baseTypeDay =
dayObject.getBaseTypeId().toString();
- String nameDay = dayObject.getName();
- if (StringUtils.equals(baseTypeDay,
CMIS_FOLDER_BASE_TYPE) && StringUtils.equals(nameDay, month)) {
- existDay = true;
- // get the date folder
- dayFolder = (Folder) dayObject;
- break;
- }
- }
-
- if (!existDay) {
- // create a new month folder
- Map<String, String> newFolderDayProps = new
HashMap<String, String>();
-
newFolderDayProps.put(PropertyIds.OBJECT_TYPE_ID, CMIS_FOLDER_BASE_TYPE);
- newFolderDayProps.put(PropertyIds.NAME, day);
- dayFolder =
monthFolder.createFolder(newFolderDayProps);
- }
+ //Check and create all the new folders
+ Folder yearFolder = createFolderIfNotExist(leafParent,
year);
+ Folder monthFolder = createFolderIfNotExist(yearFolder,
month);
+ Folder dayFolder = createFolderIfNotExist(monthFolder,
day);
leafParent = dayFolder;
-
}
-
return leafParent;
+ }
+ /**
+ * Create a new CMIS folder as a child node of leafParent
+ * @param leafParent
+ * @param folderName
+ * @return the current CMIS folder if exists otherwise it will return a
new one
+ */
+ private Folder createFolderIfNotExist(Folder leafParent, String
folderName) {
+ Folder folder = null;
+ try {
+ folder = (Folder)
session.getObjectByPath(leafParent.getPath() + CmisOutputConnectorUtils.SLASH +
folderName);
+ } catch (CmisObjectNotFoundException onfe) {
+ Map<String, Object> props = new HashMap<String,
Object>();
+ props.put(PropertyIds.OBJECT_TYPE_ID, "cmis:folder");
+ props.put(PropertyIds.NAME, folderName);
+ folder = leafParent.createFolder(props);
+
+ String folderId = folder.getId();
+ String folderPath = folder.getPath();
+ Logging.connectors.info(
+ "CMIS: Created a new folder - id: " +
folderId +
+ " | Path: " + folderPath);
+ }
+ return folder;
}
@Override
Modified:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_en_US.properties
URL:
http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_en_US.properties?rev=1799610&r1=1799609&r2=1799610&view=diff
==============================================================================
---
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_en_US.properties
(original)
+++
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_en_US.properties
Thu Jun 22 19:59:54 2017
@@ -48,6 +48,6 @@ CmisOutputConnector.ServerEquals=server=
CmisOutputConnector.PortEquals=port=
CmisOutputConnector.PathEquals=path=
CmisOutputConnector.RepositoryIdEquals=repositoryId=
-
+CmisOutputConnector.CreateTimestampTreeEquals=createTimestampTree=
CmisOutputConnector.CMISQueryEquals=cmisQuery=
CmisOutputConnector.CMISQueryMustNotBeNull=CMIS Query must be not null
Modified:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_es_ES.properties
URL:
http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_es_ES.properties?rev=1799610&r1=1799609&r2=1799610&view=diff
==============================================================================
---
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_es_ES.properties
(original)
+++
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/cmisoutput/common_es_ES.properties
Thu Jun 22 19:59:54 2017
@@ -55,6 +55,7 @@ CmisOutputConnector.PortEquals=puerto=
CmisOutputConnector.PathEquals=camino=
CmisOutputConnector.RepositoryIdEquals=Depósito ID=
CmisOutputConnector.CMISQueryEquals=cmisConsulta=
+CmisOutputConnector.CreateTimestampTreeEquals=createTimestampTree=
CmisAuthorityConnector.Repository=Depósito
Modified:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/editConfiguration_Server.html
URL:
http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/editConfiguration_Server.html?rev=1799610&r1=1799609&r2=1799610&view=diff
==============================================================================
---
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/editConfiguration_Server.html
(original)
+++
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/editConfiguration_Server.html
Thu Jun 22 19:59:54 2017
@@ -122,6 +122,27 @@
<tr>
<td class="description">
<nobr>
+
$Encoder.bodyEscape($ResourceBundle.getString('CmisOutputConnector.CreateTimestampTreeColon'))
+ </nobr>
+ </td>
+ <td class="value">
+ <!--
+ <input type="text" id="createTimestampTree" name="createTimestampTree"
size="5" value="$Encoder.attributeEscape($CREATETIMESTAMPTREE)" />
+ -->
+ <select id="createTimestampTree" name="createTimestampTree">
+#if($CREATETIMESTAMPTREE == "true")
+ <option value="false">Disabled</option>
+ <option value="true" selected="selected">Enabled</option>
+#else
+ <option value="false" selected="selected">Disabled</option>
+ <option value="true">Enabled</option>
+#end
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td class="description">
+ <nobr>
$Encoder.bodyEscape($ResourceBundle.getString('CmisOutputConnector.RepositoryIDColon'))
</nobr>
</td>
@@ -144,6 +165,7 @@
<input type="hidden" name="path" value="$Encoder.attributeEscape($PATH)" />
<input type="hidden" name="binding" value="$Encoder.attributeEscape($BINDING)"
/>
<input type="hidden" name="cmisQuery"
value="$Encoder.attributeEscape($CMISQUERY)" />
+<input type="hidden" name="createTimestampTree"
value="$Encoder.attributeEscape($CREATETIMESTAMPTREE)"/>
<input type="hidden" name="repositoryId"
value="$Encoder.attributeEscape($REPOSITORYID)" />
#end
Modified:
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/viewConfiguration.html
URL:
http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/viewConfiguration.html?rev=1799610&r1=1799609&r2=1799610&view=diff
==============================================================================
---
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/viewConfiguration.html
(original)
+++
manifoldcf/branches/CONNECTORS-1356/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/output/cmisoutput/viewConfiguration.html
Thu Jun 22 19:59:54 2017
@@ -56,6 +56,10 @@
</nobr>
<br />
<nobr>
+
$Encoder.bodyEscape($ResourceBundle.getString('CmisOutputConnector.CreateTimestampTreeEquals'))$Encoder.bodyEscape($CREATETIMESTAMPTREE)
+ </nobr>
+ <br />
+ <nobr>
$Encoder.bodyEscape($ResourceBundle.getString('CmisOutputConnector.RepositoryIdEquals'))$Encoder.bodyEscape($REPOSITORYID)
</nobr>
<br />