Commit f697dac59898723a280fb4ad9375f545c2a3e6f8

Authored by kevin_fourie
1 parent e456bb95

Merged in from DEV trunk...

WSA-72
"Add missing fields to document detail structure in web services"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Megan Watson

KTS-2730
"When adding a document, the document util's add function dies on encountering an unlink"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Megan Watson

WSA-49
"Add missing fields to search structure in web services"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

WSA-78
"download manager does not construct a full url for the webservice download"
Fixed.

Committed By: Conrad Vermeulen
Reviewed By: Martin Kirsten

KTS-2734
"sanitize to html removes information from data stored in the database. It was discovered that slashes were removed"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Philip Arckoll

KTS-2735
"Metadata values should not be sanitized until display on whichever interface."
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Philip Arckoll

WSA-76
"Update unit tests for document detail in web service"
Updated. Added missing fields.

WSA-79
"cater for custom_document_no and oem_document_id in webservices"
Updated. Added placeholders for future use.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/STABLE/branches/3.4.5-Release-Branch@7766 c91229c3-7414-0410-bfa2-8a42b809f60b
ktapi/KTAPIDocument.inc.php
1 -<? 1 +<?php
2 /** 2 /**
3 * $Id$ 3 * $Id$
4 * 4 *
5 - * The contents of this file are subject to the KnowledgeTree Public  
6 - * License Version 1.1.2 ("License"); You may not use this file except in  
7 - * compliance with the License. You may obtain a copy of the License at  
8 - * http://www.knowledgetree.com/KPL 5 + * KnowledgeTree Open Source Edition
  6 + * Document Management Made Simple
  7 + * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
9 * 8 *
10 * Software distributed under the License is distributed on an "AS IS" 9 * Software distributed under the License is distributed on an "AS IS"
11 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. 10 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
@@ -255,7 +254,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -255,7 +254,7 @@ class KTAPI_Document extends KTAPI_FolderItem
255 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res); 254 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res);
256 } 255 }
257 256
258 - $oDocumentTransaction = & new DocumentTransaction($this->document, $reason, 'ktcore.transactions.force_checkin'); 257 + $oDocumentTransaction = new DocumentTransaction($this->document, $reason, 'ktcore.transactions.force_checkin');
259 258
260 $res = $oDocumentTransaction->create(); 259 $res = $oDocumentTransaction->create();
261 if (($res === false) || PEAR::isError($res)) { 260 if (($res === false) || PEAR::isError($res)) {
@@ -274,13 +273,15 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -274,13 +273,15 @@ class KTAPI_Document extends KTAPI_FolderItem
274 dcv.size, 273 dcv.size,
275 w.name as workflow, 274 w.name as workflow,
276 ws.name as workflow_state, 275 ws.name as workflow_state,
277 - dlt.name as link_type 276 + dlt.name as link_type, dtl.name as document_type,
  277 + dcv.major_version, dcv.minor_version
278 FROM 278 FROM
279 document_link dl 279 document_link dl
280 INNER JOIN document_link_types dlt ON dl.link_type_id=dlt.id 280 INNER JOIN document_link_types dlt ON dl.link_type_id=dlt.id
281 INNER JOIN documents d ON dl.child_document_id=d.id 281 INNER JOIN documents d ON dl.child_document_id=d.id
282 INNER JOIN document_metadata_version dmv ON d.metadata_version_id=dmv.id 282 INNER JOIN document_metadata_version dmv ON d.metadata_version_id=dmv.id
283 INNER JOIN document_content_version dcv ON dmv.content_version_id=dcv.id 283 INNER JOIN document_content_version dcv ON dmv.content_version_id=dcv.id
  284 + INNER JOIN document_types_lookup dtl ON dtl.id=dmv.document_type_id
284 LEFT OUTER JOIN workflow_documents wd ON d.id=wd.document_id 285 LEFT OUTER JOIN workflow_documents wd ON d.id=wd.document_id
285 LEFT OUTER JOIN workflows w ON w.id=wd.workflow_id 286 LEFT OUTER JOIN workflows w ON w.id=wd.workflow_id
286 LEFT OUTER JOIN workflow_states ws ON wd.state_id=ws.id 287 LEFT OUTER JOIN workflow_states ws ON wd.state_id=ws.id
@@ -308,13 +309,20 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -308,13 +309,20 @@ class KTAPI_Document extends KTAPI_FolderItem
308 { 309 {
309 continue; 310 continue;
310 } 311 }
  312 +
  313 +
  314 +
311 $result[] = array( 315 $result[] = array(
312 'document_id'=>(int)$row['document_id'], 316 'document_id'=>(int)$row['document_id'],
  317 + 'custom_document_no'=>'n/a',
  318 + 'oem_document_no'=>'n/a',
313 'title'=> $row['title'], 319 'title'=> $row['title'],
314 - 'size'=>(int)$row['size'],  
315 - 'workflow'=>$row['workflow'],  
316 - 'workflow_state'=>$row['workflow_state'],  
317 - 'link_type'=>$row['link_type'], 320 + 'document_type'=> $row['document_type'],
  321 + 'version'=> (float) ($row['major_version'] . '.' . $row['minor_version']),
  322 + 'filesize'=>(int)$row['size'],
  323 + 'workflow'=>empty($row['workflow'])?'n/a':$row['workflow'],
  324 + 'workflow_state'=>empty($row['workflow_state'])?'n/a':$row['workflow_state'],
  325 + 'link_type'=>empty($row['link_type'])?'unknown':$row['link_type'],
318 ); 326 );
319 } 327 }
320 328
@@ -423,7 +431,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -423,7 +431,7 @@ class KTAPI_Document extends KTAPI_FolderItem
423 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); 431 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res );
424 } 432 }
425 433
426 - $oDocumentTransaction = & new DocumentTransaction($this->document, $reason, 'ktcore.transactions.permissions_change'); 434 + $oDocumentTransaction = new DocumentTransaction($this->document, $reason, 'ktcore.transactions.permissions_change');
427 435
428 $res = $oDocumentTransaction->create(); 436 $res = $oDocumentTransaction->create();
429 if (($res === false) || PEAR::isError($res)) { 437 if (($res === false) || PEAR::isError($res)) {
@@ -441,6 +449,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -441,6 +449,7 @@ class KTAPI_Document extends KTAPI_FolderItem
441 * @param string $reason 449 * @param string $reason
442 * @param string $newname 450 * @param string $newname
443 * @param string $newfilename 451 * @param string $newfilename
  452 + * @return KTAPI_Document
444 */ 453 */
445 function copy(&$ktapi_target_folder, $reason, $newname=null, $newfilename=null) 454 function copy(&$ktapi_target_folder, $reason, $newname=null, $newfilename=null)
446 { 455 {
@@ -527,12 +536,14 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -527,12 +536,14 @@ class KTAPI_Document extends KTAPI_FolderItem
527 $oTrigger = new $sTrigger; 536 $oTrigger = new $sTrigger;
528 $aInfo = array( 537 $aInfo = array(
529 'document' => $new_document, 538 'document' => $new_document,
530 - 'old_folder' => $this->folder->get_folder(), 539 + 'old_folder' => $this->ktapi_folder->get_folder(),
531 'new_folder' => $target_folder, 540 'new_folder' => $target_folder,
532 ); 541 );
533 $oTrigger->setInfo($aInfo); 542 $oTrigger->setInfo($aInfo);
534 $ret = $oTrigger->postValidate(); 543 $ret = $oTrigger->postValidate();
535 } 544 }
  545 +
  546 + return KTAPI_Document::get($this->ktapi, $new_document->getId());
536 } 547 }
537 548
538 /** 549 /**
@@ -670,6 +681,10 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -670,6 +681,10 @@ class KTAPI_Document extends KTAPI_FolderItem
670 } 681 }
671 682
672 $doctypeid = KTAPI::get_documenttypeid($documenttype); 683 $doctypeid = KTAPI::get_documenttypeid($documenttype);
  684 + if (PEAR::isError($doctypeid))
  685 + {
  686 + return $doctypeid;
  687 + }
673 688
674 if ($this->document->getDocumentTypeId() != $doctypeid) 689 if ($this->document->getDocumentTypeId() != $doctypeid)
675 { 690 {
@@ -760,7 +775,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -760,7 +775,7 @@ class KTAPI_Document extends KTAPI_FolderItem
760 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res); 775 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res);
761 } 776 }
762 777
763 - $oDocumentTransaction = & new DocumentTransaction($this->document, sprintf(_kt('Document archived: %s'), $reason), 'ktcore.transactions.update'); 778 + $oDocumentTransaction = new DocumentTransaction($this->document, sprintf(_kt('Document archived: %s'), $reason), 'ktcore.transactions.update');
764 $oDocumentTransaction->create(); 779 $oDocumentTransaction->create();
765 780
766 DBUtil::commit(); 781 DBUtil::commit();
@@ -830,7 +845,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -830,7 +845,7 @@ class KTAPI_Document extends KTAPI_FolderItem
830 } 845 }
831 846
832 $workflowid=$this->document->getWorkflowId(); 847 $workflowid=$this->document->getWorkflowId();
833 - if (!empty($workflowid)) 848 + if (empty($workflowid))
834 { 849 {
835 return new PEAR_Error(KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS); 850 return new PEAR_Error(KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS);
836 } 851 }
@@ -1039,6 +1054,11 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1039,6 +1054,11 @@ class KTAPI_Document extends KTAPI_FolderItem
1039 function update_metadata($metadata) 1054 function update_metadata($metadata)
1040 { 1055 {
1041 global $default; 1056 global $default;
  1057 + if (empty($metadata))
  1058 + {
  1059 + return;
  1060 + }
  1061 +
1042 $packed = $this->get_packed_metadata($metadata); 1062 $packed = $this->get_packed_metadata($metadata);
1043 1063
1044 DBUtil::startTransaction(); 1064 DBUtil::startTransaction();
@@ -1073,6 +1093,233 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1073,6 +1093,233 @@ class KTAPI_Document extends KTAPI_FolderItem
1073 1093
1074 } 1094 }
1075 1095
  1096 + /**
  1097 + * This updates the system metadata on the document.
  1098 + *
  1099 + * @param array $sysdata
  1100 + */
  1101 + function update_sysdata($sysdata)
  1102 + {
  1103 + if (empty($sysdata))
  1104 + {
  1105 + return;
  1106 + }
  1107 + $owner_mapping = array(
  1108 + 'created_by'=>'creator_id',
  1109 + 'modified_by'=>'modified_user_id',
  1110 + 'owner'=>'owner_id'
  1111 + );
  1112 +
  1113 + $documents = array();
  1114 + $document_content = array();
  1115 +
  1116 + foreach($sysdata as $rec)
  1117 + {
  1118 + if (is_object($rec))
  1119 + {
  1120 + $name = $rec->name;
  1121 + $value = sanitizeForSQL($rec->value);
  1122 + }
  1123 + elseif(is_array($rec))
  1124 + {
  1125 + $name = $rec['name'];
  1126 + $value = sanitizeForSQL($rec['value']);
  1127 + }
  1128 + else
  1129 + {
  1130 + // just ignore
  1131 + continue;
  1132 + }
  1133 + switch($name)
  1134 + {
  1135 + case 'created_date':
  1136 + $documents['created'] = $value;
  1137 + break;
  1138 + case 'modified_date':
  1139 + $documents['modified'] = $value;
  1140 + break;
  1141 + case 'is_immutable':
  1142 + $documents['immutable'] = in_array(strtolower($value), array('1','true','on','yes'))?'1':'0';
  1143 + break;
  1144 + case 'filename':
  1145 + $document_content['filename'] = $value;
  1146 + break;
  1147 + case 'major_version':
  1148 + $document_content['major_version'] = $value;
  1149 + break;
  1150 + case 'minor_version':
  1151 + $document_content['minor_version'] = $value;
  1152 + break;
  1153 + case 'version':
  1154 + $version = number_format($value + 0,5);
  1155 + list($major_version, $minor_version) = explode('.', $version);
  1156 + $document_content['major_version'] = $major_version;
  1157 + $document_content['minor_version'] = $minor_version;
  1158 + break;
  1159 + case 'mime_type':
  1160 + $sql = "select id from mime_types where mimetypes='$value'";
  1161 + $value = DBUtil::getResultArray($sql);
  1162 + if (PEAR::isError($value))
  1163 + {
  1164 + return $value;
  1165 + }
  1166 + if (count($value) == 0)
  1167 + {
  1168 + break;
  1169 + }
  1170 + $value = $value[0]['id'];
  1171 + $document_content['mime_id'] = $value;
  1172 + break;
  1173 + case 'owner':
  1174 + case 'created_by':
  1175 + case 'modified_by':
  1176 + $sql = "select id from users where name='$value'";
  1177 + $userId = DBUtil::getResultArray($sql);
  1178 + if (PEAR::isError($userId))
  1179 + {
  1180 + return $userId;
  1181 + }
  1182 + if (empty($userId))
  1183 + {
  1184 + $sql = "select id from users where username='$value'";
  1185 + $userId = DBUtil::getResultArray($sql);
  1186 + if (PEAR::isError($userId))
  1187 + {
  1188 + return $userId;
  1189 + }
  1190 + }
  1191 + if (empty($userId))
  1192 + {
  1193 + // if not found, not much we can do
  1194 + break;
  1195 + }
  1196 + $userId=$userId[0];
  1197 + $userId=$userId['id'];
  1198 +
  1199 + $name = $owner_mapping[$name];
  1200 + $documents[$name] = $userId;
  1201 + break;
  1202 + default:
  1203 + // TODO: we should do some logging
  1204 + //return new PEAR_Error('Unexpected field: ' . $name);
  1205 + }
  1206 + }
  1207 +
  1208 + if (count($documents) > 0)
  1209 + {
  1210 + $sql = "UPDATE documents SET ";
  1211 + $i=0;
  1212 + foreach($documents as $name=>$value)
  1213 + {
  1214 + if ($i++ > 0) $sql .= ",";
  1215 + if (is_numeric($value))
  1216 + $sql .= "$name=$value";
  1217 + else
  1218 + $sql .= "$name='$value'";
  1219 + }
  1220 + $sql .= " WHERE id=$this->documentid";
  1221 + $result = DBUtil::runQuery($sql);
  1222 + if (PEAR::isError($result))
  1223 + {
  1224 + return $result;
  1225 + }
  1226 + }
  1227 + if (count($document_content) > 0)
  1228 + {
  1229 + $content_id = $this->document->getContentVersionId();
  1230 + $sql = "UPDATE document_content_version SET ";
  1231 + $i=0;
  1232 + foreach($document_content as $name=>$value)
  1233 + {
  1234 + if ($i++ > 0) $sql .= ",";
  1235 + $sql .= "$name='$value'";
  1236 + }
  1237 + $sql .= " WHERE id=$content_id";
  1238 + $result = DBUtil::runQuery($sql);
  1239 + if (PEAR::isError($result))
  1240 + {
  1241 + return $result;
  1242 + }
  1243 + }
  1244 + }
  1245 +
  1246 + function clearCache()
  1247 + {
  1248 + // TODO: we should only clear the cache for the document we are working on
  1249 + // this is a quick fix but not optimal!!
  1250 +
  1251 +
  1252 + $metadataid = $this->document->getMetadataVersionId();
  1253 + $contentid = $this->document->getContentVersionId();
  1254 +
  1255 + $cache = KTCache::getSingleton();
  1256 +
  1257 + $cache->remove('KTDocumentMetadataVersion/id', $metadataid);
  1258 + $cache->remove('KTDocumentContentVersion/id', $contentid);
  1259 + $cache->remove('KTDocumentCore/id', $this->documentid);
  1260 + $cache->remove('Document/id', $this->documentid);
  1261 + unset($GLOBALS['_OBJECTCACHE']['KTDocumentMetadataVersion'][$metadataid]);
  1262 + unset($GLOBALS['_OBJECTCACHE']['KTDocumentContentVersion'][$contentid]);
  1263 + unset($GLOBALS['_OBJECTCACHE']['KTDocumentCore'][$this->documentid]);
  1264 +
  1265 + $this->document = &Document::get($this->documentid);
  1266 + }
  1267 +
  1268 + function mergeWithLastMetadataVersion()
  1269 + {
  1270 + // keep latest metadata version
  1271 + $metadata_version = $this->document->getMetadataVersion();
  1272 + if ($metadata_version == 0)
  1273 + {
  1274 + // this could theoretically happen in the case we are updating metadata and sysdata, but no metadata fields are specified.
  1275 + return;
  1276 + }
  1277 +
  1278 + $metadata_id = $this->document->getMetadataVersionId();
  1279 +
  1280 + // get previous version
  1281 + $sql = "SELECT id, metadata_version FROM document_metadata_version WHERE id<$metadata_id AND document_id=$this->documentid order by id desc";
  1282 + $old = DBUtil::getResultArray($sql);
  1283 + if (is_null($old) || PEAR::isError($old))
  1284 + {
  1285 + return new PEAR_Error('Previous version could not be resolved');
  1286 + }
  1287 + // only interested in the first one
  1288 + $old=$old[0];
  1289 + $old_metadata_id = $old['id'];
  1290 + $old_metadata_version = $old['metadata_version'];
  1291 +
  1292 + DBUtil::startTransaction();
  1293 +
  1294 + // delete previous metadata version
  1295 +
  1296 + $sql = "DELETE FROM document_metadata_version WHERE id=$old_metadata_id";
  1297 + $rs = DBUtil::runQuery($sql);
  1298 + if (PEAR::isError($rs))
  1299 + {
  1300 + DBUtil::rollback();
  1301 + return $rs;
  1302 + }
  1303 +
  1304 + // make latest equal to previous
  1305 + $sql = "UPDATE document_metadata_version SET metadata_version=$old_metadata_version WHERE id=$metadata_id";
  1306 + $rs = DBUtil::runQuery($sql);
  1307 + if (PEAR::isError($rs))
  1308 + {
  1309 + DBUtil::rollback();
  1310 + return $rs;
  1311 + }
  1312 + $sql = "UPDATE documents SET metadata_version=$old_metadata_version WHERE id=$this->documentid";
  1313 + $rs = DBUtil::runQuery($sql);
  1314 + if (PEAR::isError($rs))
  1315 + {
  1316 + DBUtil::rollback();
  1317 + return $rs;
  1318 + }
  1319 + DBUtil::commit();
  1320 +
  1321 + $this->clearCache();
  1322 + }
1076 1323
1077 /** 1324 /**
1078 * This returns a workflow transition 1325 * This returns a workflow transition
@@ -1091,7 +1338,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1091,7 +1338,7 @@ class KTAPI_Document extends KTAPI_FolderItem
1091 $workflowid=$this->document->getWorkflowId(); 1338 $workflowid=$this->document->getWorkflowId();
1092 if (empty($workflowid)) 1339 if (empty($workflowid))
1093 { 1340 {
1094 - return new PEAR_Error(KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS); 1341 + return array();
1095 } 1342 }
1096 1343
1097 $result = array(); 1344 $result = array();
@@ -1150,94 +1397,172 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1150,94 +1397,172 @@ class KTAPI_Document extends KTAPI_FolderItem
1150 */ 1397 */
1151 function get_detail() 1398 function get_detail()
1152 { 1399 {
  1400 + global $default;
  1401 + // make sure we ge tthe latest
  1402 + $this->clearCache();
  1403 +
  1404 + $config = KTConfig::getSingleton();
  1405 + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
  1406 +
1153 $detail = array(); 1407 $detail = array();
1154 $document = $this->document; 1408 $document = $this->document;
1155 1409
  1410 + // get the document id
  1411 + $detail['document_id'] = (int) $document->getId();
  1412 +
  1413 + $detail['custom_document_no'] = 'n/a';
  1414 + $detail['oem_document_no'] = 'n/a';
  1415 +
  1416 + // get the title
1156 $detail['title'] = $document->getName(); 1417 $detail['title'] = $document->getName();
1157 1418
  1419 + // get the document type
1158 $documenttypeid=$document->getDocumentTypeID(); 1420 $documenttypeid=$document->getDocumentTypeID();
  1421 + $documenttype = '* unknown *';
1159 if (is_numeric($documenttypeid)) 1422 if (is_numeric($documenttypeid))
1160 { 1423 {
1161 - $documenttype = DocumentType::get($documenttypeid); 1424 + $dt = DocumentType::get($documenttypeid);
1162 1425
1163 - $documenttype=$documenttype->getName();  
1164 - }  
1165 - else  
1166 - {  
1167 - $documenttype = '* unknown *'; 1426 + if (!is_null($dt) && !PEAR::isError($dt))
  1427 + {
  1428 + $documenttype=$dt->getName();
  1429 + }
1168 } 1430 }
1169 $detail['document_type'] = $documenttype; 1431 $detail['document_type'] = $documenttype;
1170 1432
1171 - $detail['version'] = $document->getVersion(); 1433 + // get the filename
1172 $detail['filename'] = $document->getFilename(); 1434 $detail['filename'] = $document->getFilename();
1173 1435
1174 - $detail['created_date'] = $document->getCreatedDateTime(); 1436 + // get the filesize
  1437 + $detail['filesize'] = (int) $document->getFileSize();
1175 1438
  1439 + // get the folder id
  1440 + $detail['folder_id'] = (int) $document->getFolderID();
  1441 +
  1442 + // get the creator
1176 $userid = $document->getCreatorID(); 1443 $userid = $document->getCreatorID();
  1444 + $username='n/a';
1177 if (is_numeric($userid)) 1445 if (is_numeric($userid))
1178 { 1446 {
  1447 + $username = '* unknown *';
1179 $user = User::get($userid); 1448 $user = User::get($userid);
1180 - $username=(is_null($user) || PEAR::isError($user))?'* unknown *':$user->getName(); 1449 + if (!is_null($user) && !PEAR::isError($user))
  1450 + {
  1451 + $username = $user->getName();
  1452 + }
  1453 + }
  1454 + $detail['created_by'] = $username;
  1455 +
  1456 + // get the creation date
  1457 + $detail['created_date'] = $document->getCreatedDateTime();
  1458 +
  1459 + // get the checked out user
  1460 + $userid = $document->getCheckedOutUserID();
  1461 + $username='n/a';
  1462 + if (is_numeric($userid))
  1463 + {
  1464 + $username = '* unknown *';
  1465 + $user = User::get($userid);
  1466 + if (!is_null($user) && !PEAR::isError($user))
  1467 + {
  1468 + $username = $user->getName();
  1469 + }
  1470 + }
  1471 + $detail['checked_out_by'] = $username;
  1472 +
  1473 + // get the checked out date
  1474 + list($major, $minor, $fix) = explode('.', $default->systemVersion);
  1475 + if ($major == 3 && $minor >= 5)
  1476 + {
  1477 + $detail['checked_out_date'] = $document->getCheckedOutDate();
1181 } 1478 }
1182 else 1479 else
1183 { 1480 {
1184 - $username='n/a'; 1481 + $detail['checked_out_date'] = $detail['modified_date'];
1185 } 1482 }
1186 - $detail['created_by'] = $username;  
1187 - $detail['updated_date'] = $document->getLastModifiedDate(); 1483 + if (is_null($detail['checked_out_date'])) $detail['checked_out_date'] = 'n/a';
1188 1484
  1485 + // get the modified user
1189 $userid = $document->getModifiedUserId(); 1486 $userid = $document->getModifiedUserId();
  1487 + $username='n/a';
1190 if (is_numeric($userid)) 1488 if (is_numeric($userid))
1191 { 1489 {
  1490 + $username = '* unknown *';
1192 $user = User::get($userid); 1491 $user = User::get($userid);
1193 - $username=(is_null($user) || PEAR::isError($user))?'* unknown *':$user->getName(); 1492 + if (!is_null($user) && !PEAR::isError($user))
  1493 + {
  1494 + $username = $user->getName();
  1495 + }
1194 } 1496 }
1195 - else 1497 + $detail['modified_by'] = $detail['updated_by'] = $username;
  1498 +
  1499 + // get the modified date
  1500 + $detail['updated_date'] = $detail['modified_date'] = $document->getLastModifiedDate();
  1501 +
  1502 + // get the owner
  1503 + $userid = $document->getOwnerID();
  1504 + $username='n/a';
  1505 + if (is_numeric($userid))
1196 { 1506 {
1197 - $username='n/a'; 1507 + $username = '* unknown *';
  1508 + $user = User::get($userid);
  1509 + if (!is_null($user) && !PEAR::isError($user))
  1510 + {
  1511 + $username = $user->getName();
  1512 + }
  1513 + }
  1514 + $detail['owned_by'] = $username;
  1515 +
  1516 + // get the version
  1517 + $detail['version'] = $document->getVersion();
  1518 + if ($wsversion >= 2)
  1519 + {
  1520 + $detail['version'] = (float) $detail['version'];
1198 } 1521 }
1199 - $detail['updated_by'] = $username;  
1200 - $detail['document_id'] = (int) $document->getId();  
1201 - $detail['folder_id'] = (int) $document->getFolderID();  
1202 1522
  1523 + // check immutability
  1524 + $detail['is_immutable'] = (bool) $document->getImmutable();
  1525 +
  1526 + // check permissions
  1527 + $detail['permissions'] = 'n/a';
  1528 +
  1529 + // get workflow name
1203 $workflowid = $document->getWorkflowId(); 1530 $workflowid = $document->getWorkflowId();
  1531 + $workflowname='n/a';
1204 if (is_numeric($workflowid)) 1532 if (is_numeric($workflowid))
1205 { 1533 {
1206 $workflow = KTWorkflow::get($workflowid); 1534 $workflow = KTWorkflow::get($workflowid);
1207 - $workflowname=(is_null($workflow) || PEAR::isError($workflow))?'* unknown *':$workflow->getName();  
1208 - }  
1209 - else  
1210 - {  
1211 - $workflowname='n/a'; 1535 + if (!is_null($workflow) && !PEAR::isError($workflow))
  1536 + {
  1537 + $workflowname = $workflow->getName();
  1538 + }
1212 } 1539 }
1213 $detail['workflow'] = $workflowname; 1540 $detail['workflow'] = $workflowname;
1214 1541
  1542 + // get the workflow state
1215 $stateid = $document->getWorkflowStateId(); 1543 $stateid = $document->getWorkflowStateId();
  1544 + $workflowstate = 'n/a';
1216 if (is_numeric($stateid)) 1545 if (is_numeric($stateid))
1217 { 1546 {
1218 $state = KTWorkflowState::get($stateid); 1547 $state = KTWorkflowState::get($stateid);
1219 - $workflowstate=(is_null($state) || PEAR::isError($state))?'* unknown *':$state->getName();  
1220 - }  
1221 - else  
1222 - {  
1223 - $workflowstate = 'n/a'; 1548 + if (!is_null($state) && !PEAR::isError($state))
  1549 + {
  1550 + $workflowstate = $state->getName();
  1551 + }
1224 } 1552 }
1225 $detail['workflow_state']=$workflowstate; 1553 $detail['workflow_state']=$workflowstate;
1226 1554
1227 - $userid = $document->getCheckedOutUserID(); 1555 + // get the full path
  1556 + $detail['full_path'] = $this->ktapi_folder->get_full_path() . '/' . $this->get_title();
1228 1557
1229 - if (is_numeric($userid))  
1230 - {  
1231 - $user = User::get($userid);  
1232 - $username=(is_null($user) || PEAR::isError($user))?'* unknown *':$user->getName();  
1233 - }  
1234 - else  
1235 - {  
1236 - $username = 'n/a';  
1237 - }  
1238 - $detail['checkout_by'] = $username; 1558 + // get mime info
  1559 + $mimetypeid = $document->getMimeTypeID();
  1560 + $detail['mime_type'] =KTMime::getMimeTypeName($mimetypeid);
  1561 + $detail['mime_icon_path'] =KTMime::getIconPath($mimetypeid);
  1562 + $detail['mime_display'] =KTMime::getFriendlyNameForString($detail['mime_type']);
1239 1563
1240 - $detail['full_path'] = $this->ktapi_folder->get_full_path() . '/' . $this->get_title(); 1564 + // get the storage path
  1565 + $detail['storage_path'] = $document->getStoragePath();
1241 1566
1242 return $detail; 1567 return $detail;
1243 } 1568 }
@@ -1258,7 +1583,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1258,7 +1583,7 @@ class KTAPI_Document extends KTAPI_FolderItem
1258 $options = array(); 1583 $options = array();
1259 1584
1260 1585
1261 - $oDocumentTransaction = & new DocumentTransaction($this->document, 'Document downloaded', 'ktcore.transactions.download', $aOptions); 1586 + $oDocumentTransaction = new DocumentTransaction($this->document, 'Document downloaded', 'ktcore.transactions.download', $aOptions);
1262 $oDocumentTransaction->create(); 1587 $oDocumentTransaction->create();
1263 } 1588 }
1264 1589
@@ -1281,6 +1606,13 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1281,6 +1606,13 @@ class KTAPI_Document extends KTAPI_FolderItem
1281 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $transactions ); 1606 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $transactions );
1282 } 1607 }
1283 1608
  1609 + $config = KTConfig::getSingleton();
  1610 + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
  1611 + foreach($transactions as $key=>$transaction)
  1612 + {
  1613 + $transactions[$key]['version'] = (float) $transaction['version'];
  1614 + }
  1615 +
1284 return $transactions; 1616 return $transactions;
1285 } 1617 }
1286 1618
@@ -1293,6 +1625,9 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1293,6 +1625,9 @@ class KTAPI_Document extends KTAPI_FolderItem
1293 { 1625 {
1294 $metadata_versions = KTDocumentMetadataVersion::getByDocument($this->document); 1626 $metadata_versions = KTDocumentMetadataVersion::getByDocument($this->document);
1295 1627
  1628 + $config = KTConfig::getSingleton();
  1629 + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
  1630 +
1296 $versions = array(); 1631 $versions = array();
1297 foreach ($metadata_versions as $version) 1632 foreach ($metadata_versions as $version)
1298 { 1633 {
@@ -1302,10 +1637,20 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1302,10 +1637,20 @@ class KTAPI_Document extends KTAPI_FolderItem
1302 1637
1303 $userid = $document->getModifiedUserId(); 1638 $userid = $document->getModifiedUserId();
1304 $user = User::get($userid); 1639 $user = User::get($userid);
  1640 + $username = 'Unknown';
  1641 + if (!PEAR::isError($user))
  1642 + {
  1643 + $username = is_null($user)?'n/a':$user->getName();
  1644 + }
1305 1645
1306 - $version['user'] = $user->getName(); 1646 + $version['user'] = $username;
1307 $version['metadata_version'] = $document->getMetadataVersion(); 1647 $version['metadata_version'] = $document->getMetadataVersion();
1308 $version['content_version'] = $document->getVersion(); 1648 $version['content_version'] = $document->getVersion();
  1649 + if ($wsversion >= 2)
  1650 + {
  1651 + $version['metadata_version'] = (int) $version['metadata_version'];
  1652 + $version['content_version'] = (float) $version['content_version'];
  1653 + }
1309 1654
1310 $versions[] = $version; 1655 $versions[] = $version;
1311 } 1656 }
@@ -1325,7 +1670,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1325,7 +1670,7 @@ class KTAPI_Document extends KTAPI_FolderItem
1325 } 1670 }
1326 DBUtil::startTransaction(); 1671 DBUtil::startTransaction();
1327 1672
1328 - $transaction = & new DocumentTransaction($this->document, "Document expunged", 'ktcore.transactions.expunge'); 1673 + $transaction = new DocumentTransaction($this->document, "Document expunged", 'ktcore.transactions.expunge');
1329 1674
1330 $transaction->create(); 1675 $transaction->create();
1331 1676
ktapi/KTAPIFolder.inc.php
1 -<? 1 +<?php
2 /** 2 /**
3 * $Id$ 3 * $Id$
4 * 4 *
@@ -144,14 +144,7 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -144,14 +144,7 @@ class KTAPI_Folder extends KTAPI_FolderItem
144 return (int) $this->folderid; 144 return (int) $this->folderid;
145 } 145 }
146 146
147 - /**  
148 - * This can resolve a folder relative to the current directy by name  
149 - *  
150 - * @access public  
151 - * @param string $foldername  
152 - * @return KTAPI_Folder  
153 - */  
154 - function &get_folder_by_name($foldername) 147 + function &_get_folder_by_name($ktapi, $foldername, $folderid)
155 { 148 {
156 $foldername=trim($foldername); 149 $foldername=trim($foldername);
157 if (empty($foldername)) 150 if (empty($foldername))
@@ -161,14 +154,16 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -161,14 +154,16 @@ class KTAPI_Folder extends KTAPI_FolderItem
161 154
162 $split = explode('/', $foldername); 155 $split = explode('/', $foldername);
163 156
164 - $folderid=$this->folderid;  
165 foreach($split as $foldername) 157 foreach($split as $foldername)
166 { 158 {
167 if (empty($foldername)) 159 if (empty($foldername))
168 { 160 {
169 continue; 161 continue;
170 } 162 }
171 - $sql = "SELECT id FROM folders WHERE name='$foldername' and parent_id=$folderid"; 163 + $foldername = sanitizeForSQL($foldername);
  164 + $sql = "SELECT id FROM folders WHERE
  165 + (name='$foldername' and parent_id=$folderid) OR
  166 + (name='$foldername' and parent_id is null and $folderid=1)";
172 $row = DBUtil::getOneResult($sql); 167 $row = DBUtil::getOneResult($sql);
173 if (is_null($row) || PEAR::isError($row)) 168 if (is_null($row) || PEAR::isError($row))
174 { 169 {
@@ -177,12 +172,26 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -177,12 +172,26 @@ class KTAPI_Folder extends KTAPI_FolderItem
177 $folderid = $row['id']; 172 $folderid = $row['id'];
178 } 173 }
179 174
180 - return KTAPI_Folder::get($this->ktapi, $folderid); 175 + return KTAPI_Folder::get($ktapi, $folderid);
  176 + }
  177 +
  178 +
  179 + /**
  180 + * This can resolve a folder relative to the current directy by name
  181 + *
  182 + * @access public
  183 + * @param string $foldername
  184 + * @return KTAPI_Folder
  185 + */
  186 + function &get_folder_by_name($foldername)
  187 + {
  188 + return KTAPI_Folder::_get_folder_by_name($this->ktapi, $foldername, $this->folderid);
181 } 189 }
182 190
183 function get_full_path() 191 function get_full_path()
184 { 192 {
185 $path = $this->folder->getFullPath() . '/' . $this->folder->getName(); 193 $path = $this->folder->getFullPath() . '/' . $this->folder->getName();
  194 + if (substr($path,0,1) == '/') $path = substr($path,1);
186 195
187 return $path; 196 return $path;
188 } 197 }
@@ -213,6 +222,21 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -213,6 +222,21 @@ class KTAPI_Folder extends KTAPI_FolderItem
213 $ktapi_folder = $this->get_folder_by_name($foldername); 222 $ktapi_folder = $this->get_folder_by_name($foldername);
214 } 223 }
215 224
  225 + $currentFolderName = $this->get_folder_name();
  226 +
  227 + if (PEAR::isError($ktapi_folder) && substr($foldername, 0, strlen($currentFolderName)) == $currentFolderName)
  228 + {
  229 + if ($currentFolderName == $foldername)
  230 + {
  231 + $ktapi_folder = $this;
  232 + }
  233 + else
  234 + {
  235 + $foldername = substr($foldername, strlen($currentFolderName)+1);
  236 + $ktapi_folder = $this->get_folder_by_name($foldername);
  237 + }
  238 + }
  239 +
216 if (is_null($ktapi_folder) || PEAR::isError($ktapi_folder)) 240 if (is_null($ktapi_folder) || PEAR::isError($ktapi_folder))
217 { 241 {
218 return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID, $ktapi_folder); 242 return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID, $ktapi_folder);
@@ -275,7 +299,6 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -275,7 +299,6 @@ class KTAPI_Folder extends KTAPI_FolderItem
275 return $user; 299 return $user;
276 } 300 }
277 301
278 -  
279 function get_listing($depth=1, $what='DF') 302 function get_listing($depth=1, $what='DF')
280 { 303 {
281 if ($depth < 1) 304 if ($depth < 1)
@@ -287,6 +310,9 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -287,6 +310,9 @@ class KTAPI_Folder extends KTAPI_FolderItem
287 $read_permission = &KTPermission::getByName(KTAPI_PERMISSION_READ); 310 $read_permission = &KTPermission::getByName(KTAPI_PERMISSION_READ);
288 $folder_permission = &KTPermission::getByName(KTAPI_PERMISSION_VIEW_FOLDER); 311 $folder_permission = &KTPermission::getByName(KTAPI_PERMISSION_VIEW_FOLDER);
289 312
  313 + $config = KTConfig::getSingleton();
  314 +
  315 + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
290 316
291 $user = $this->ktapi->get_user(); 317 $user = $this->ktapi->get_user();
292 318
@@ -296,23 +322,68 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -296,23 +322,68 @@ class KTAPI_Folder extends KTAPI_FolderItem
296 { 322 {
297 $folder_children = Folder::getList(array('parent_id = ?', $this->folderid)); 323 $folder_children = Folder::getList(array('parent_id = ?', $this->folderid));
298 324
299 -  
300 foreach ($folder_children as $folder) 325 foreach ($folder_children as $folder)
301 { 326 {
302 if(KTPermissionUtil::userHasPermissionOnItem($user, $folder_permission, $folder)) 327 if(KTPermissionUtil::userHasPermissionOnItem($user, $folder_permission, $folder))
303 { 328 {
304 - $creator=$this->_resolve_user($folder->getCreatorID());  
305 -  
306 if ($depth-1 > 0) 329 if ($depth-1 > 0)
307 { 330 {
308 $sub_folder = &$this->ktapi->get_folder_by_id($folder->getId()); 331 $sub_folder = &$this->ktapi->get_folder_by_id($folder->getId());
309 - $items = $folder->get_listing($depth-1); 332 + $items = $sub_folder->get_listing($depth-1);
310 } 333 }
311 else 334 else
312 { 335 {
313 $items=array(); 336 $items=array();
314 } 337 }
315 338
  339 + $creator=$this->_resolve_user($folder->getCreatorID());
  340 +
  341 +
  342 + if ($wsversion >= 2)
  343 + {
  344 + $contents[] = array(
  345 + 'id' => (int) $folder->getId(),
  346 + 'item_type' => 'F',
  347 +
  348 + 'custom_document_no'=>'n/a',
  349 + 'oem_document_no'=>'n/a',
  350 +
  351 + 'title' => $folder->getName(),
  352 + 'document_type' => 'n/a',
  353 + 'filename' => $folder->getName(),
  354 + 'filesize' => 'n/a',
  355 +
  356 + 'created_by' => is_null($creator)?'n/a':$creator->getName(),
  357 + 'created_date' => 'n/a',
  358 +
  359 + 'checked_out_by' => 'n/a',
  360 + 'checked_out_date' => 'n/a',
  361 +
  362 + 'modified_by' => 'n/a',
  363 + 'modified_date' => 'n/a',
  364 +
  365 + 'owned_by' => 'n/a',
  366 +
  367 + 'version' => 'n/a',
  368 +
  369 + 'is_immutable'=> 'n/a',
  370 + 'permissions' => 'n/a',
  371 +
  372 + 'workflow'=>'n/a',
  373 + 'workflow_state'=>'n/a',
  374 +
  375 + 'mime_type' => 'folder',
  376 + 'mime_icon_path' => 'folder',
  377 + 'mime_display' => 'Folder',
  378 +
  379 + 'storage_path' => 'n/a',
  380 +
  381 + 'items'=>$items,
  382 +
  383 + );
  384 + }
  385 + else
  386 + {
316 387
317 $contents[] = array( 388 $contents[] = array(
318 'id' => (int) $folder->getId(), 389 'id' => (int) $folder->getId(),
@@ -332,8 +403,9 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -332,8 +403,9 @@ class KTAPI_Folder extends KTAPI_FolderItem
332 'items'=>$items, 403 'items'=>$items,
333 'workflow'=>'n/a', 404 'workflow'=>'n/a',
334 'workflow_state'=>'n/a' 405 'workflow_state'=>'n/a'
335 -  
336 ); 406 );
  407 + }
  408 +
337 } 409 }
338 } 410 }
339 } 411 }
@@ -348,9 +420,19 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -348,9 +420,19 @@ class KTAPI_Folder extends KTAPI_FolderItem
348 { 420 {
349 if (KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $document)) 421 if (KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $document))
350 { 422 {
351 - $creator=$this->_resolve_user($document->getCreatorID());  
352 - $checkedoutby=$this->_resolve_user($document->getCheckedOutUserID());  
353 - $modifiedby=$this->_resolve_user($document->getCreatorID()); 423 + $created_by=$this->_resolve_user($document->getCreatorID());
  424 + $created_date = $document->getCreatedDateTime();
  425 + if (empty($created_date)) $created_date = 'n/a';
  426 +
  427 + $checked_out_by=$this->_resolve_user($document->getCheckedOutUserID());
  428 + $checked_out_date = $document->getCheckedOutDate();
  429 + if (empty($checked_out_date)) $checked_out_date = 'n/a';
  430 +
  431 + $modified_by=$this->_resolve_user($document->getCreatorID());
  432 + $modified_date = $document->getCheckedOutDate();
  433 + if (empty($modified_date)) $modified_date = 'n/a';
  434 +
  435 + $owned_by =$this->_resolve_user($document->getOwnerID());
354 436
355 $mimetypeid=$document->getMimeTypeID(); 437 $mimetypeid=$document->getMimeTypeID();
356 if (!array_key_exists($mimetypeid, $mime_cache)) 438 if (!array_key_exists($mimetypeid, $mime_cache))
@@ -368,37 +450,81 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -368,37 +450,81 @@ class KTAPI_Folder extends KTAPI_FolderItem
368 } 450 }
369 $mimeinfo=$mime_cache[$mimetypeid]; 451 $mimeinfo=$mime_cache[$mimetypeid];
370 452
371 - $workflow = KTWorkflowUtil::getWorkflowForDocument($document); 453 + $workflow='n/a';
  454 + $state='n/a';
  455 +
  456 + $wf = KTWorkflowUtil::getWorkflowForDocument($document);
372 457
373 - if (!is_null($workflow) && !PEAR::isError($workflow)) 458 + if (!is_null($wf) && !PEAR::isError($wf))
374 { 459 {
375 - $workflow=$workflow->getHumanName(); 460 + $workflow=$wf->getHumanName();
376 461
377 - $state=KTWorkflowUtil::getWorkflowStateForDocument($document);  
378 - if (!is_null($state) && !PEAR::isError($state)) 462 + $ws=KTWorkflowUtil::getWorkflowStateForDocument($document);
  463 + if (!is_null($ws) && !PEAR::isError($ws))
379 { 464 {
380 $state=$state->getHumanName(); 465 $state=$state->getHumanName();
381 } 466 }
382 - else  
383 - {  
384 - $state='n/a';  
385 - }  
386 } 467 }
387 - else 468 +
  469 + if ($wsversion >= 2)
388 { 470 {
389 - $workflow='n/a';  
390 - $state='n/a'; 471 + $docTypeId = $document->getDocumentTypeID();
  472 + $documentType = DocumentType::get($docTypeId);
  473 +
  474 +
  475 + $contents[] = array(
  476 + 'id' => (int) $document->getId(),
  477 + 'item_type' => 'D',
  478 +
  479 + 'custom_document_no'=>'n/a',
  480 + 'oem_document_no'=>'n/a',
  481 +
  482 + 'title' => $document->getName(),
  483 + 'document_type'=>$documentType->getName(),
  484 + 'filename' => $document->getFileName(),
  485 + 'filesize' => $document->getFileSize(),
  486 +
  487 + 'created_by' => is_null($created_by)?'n/a':$created_by->getName(),
  488 + 'created_date' => $created_date,
  489 +
  490 + 'checked_out_by' => is_null($checked_out_by)?'n/a':$checked_out_by->getName(),
  491 + 'checked_out_date' => $checked_out_date,
  492 +
  493 + 'modified_by' => is_null($modified_by)?'n/a':$modified_by->getName(),
  494 + 'modified_date' => $modified_date,
  495 +
  496 + 'owned_by' => is_null($owned_by)?'n/a':$owned_by->getName(),
  497 +
  498 + 'version' => $document->getMajorVersionNumber() . '.' . $document->getMinorVersionNumber(),
  499 +
  500 + 'is_immutable'=> $document->getImmutable()?'true':'false',
  501 + 'permissions' => 'n/a',
  502 +
  503 + 'workflow'=> $workflow,
  504 + 'workflow_state'=> $state,
  505 +
  506 + 'mime_type' => $mime_cache[$mimetypeid]['type'],
  507 + 'mime_icon_path' => $mime_cache[$mimetypeid]['icon'],
  508 + 'mime_display' => $mime_cache[$mimetypeid]['display'],
  509 +
  510 + 'storage_path' => $document->getStoragePath(),
  511 +
  512 + 'items'=>array(),
  513 +
  514 + );
391 } 515 }
  516 + else
  517 + {
392 518
393 519
394 $contents[] = array( 520 $contents[] = array(
395 'id' => (int) $document->getId(), 521 'id' => (int) $document->getId(),
396 'item_type'=>'D', 522 'item_type'=>'D',
397 'title'=>$document->getName(), 523 'title'=>$document->getName(),
398 - 'creator'=>is_null($creator)?'n/a':$creator->getName(),  
399 - 'checkedoutby'=>is_null($checkedoutby)?'n/a':$checkedoutby->getName(),  
400 - 'modifiedby'=>is_null($modifiedby)?'n/a':$modifiedby->getName(),  
401 - 'filename'=>$document->getName(), 524 + 'creator'=>is_null($created_by)?'n/a':$created_by->getName(),
  525 + 'checkedoutby'=>is_null($checked_out_by)?'n/a':$checked_out_by->getName(),
  526 + 'modifiedby'=>is_null($modified_by)?'n/a':$modified_by->getName(),
  527 + 'filename'=>$document->getFileName(),
402 'size'=>$document->getFileSize(), 528 'size'=>$document->getFileSize(),
403 'major_version'=>$document->getMajorVersionNumber(), 529 'major_version'=>$document->getMajorVersionNumber(),
404 'minor_version'=>$document->getMinorVersionNumber(), 530 'minor_version'=>$document->getMinorVersionNumber(),
@@ -410,6 +536,8 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -410,6 +536,8 @@ class KTAPI_Folder extends KTAPI_FolderItem
410 'workflow'=>$workflow, 536 'workflow'=>$workflow,
411 'workflow_state'=>$state 537 'workflow_state'=>$state
412 ); 538 );
  539 +
  540 + }
413 } 541 }
414 } 542 }
415 543
@@ -585,7 +713,7 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -585,7 +713,7 @@ class KTAPI_Folder extends KTAPI_FolderItem
585 } 713 }
586 714
587 DBUtil::startTransaction(); 715 DBUtil::startTransaction();
588 - $result = KTFolderUtil::copy($this->folder, $target_folder, $user, $reason); 716 + $result = KTFolderUtil::move($this->folder, $target_folder, $user, $reason);
589 717
590 if (PEAR::isError($result)) 718 if (PEAR::isError($result))
591 { 719 {
@@ -651,4 +779,4 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -651,4 +779,4 @@ class KTAPI_Folder extends KTAPI_FolderItem
651 } 779 }
652 } 780 }
653 781
654 -?>  
655 \ No newline at end of file 782 \ No newline at end of file
  783 +?>
ktwebservice/nunit/README 0 โ†’ 100644
  1 +GENERAL
  2 +-------
  3 +
  4 +This folder includes the Nunit unit tests to unit test web services.
  5 +
  6 +
  7 +REQUIREMENTS
  8 +------------
  9 +
  10 +The unit tests were written for NUnit. NUnit 2.2.0 was used during development.
  11 +
  12 +This framework was developed in Linux using Mono.
  13 +
  14 +DATABASE
  15 +--------
  16 +
  17 +Review helper.cs to see the configuration settings. UnixODBC is used. Sample config files:
  18 +
  19 + # odbc.ini
  20 +
  21 +[ktdms]
  22 +Driver = myodbcdriver
  23 +Description = MySQL ODBC 2.50 Driver DSN
  24 +SERVER = localhost
  25 +PORT =
  26 +Socket = /tmp/mysql.sock
  27 +USER = root
  28 +Password =
  29 +Database = ktdms
  30 +OPTION = 3
  31 +
  32 + # odbcinst.ini
  33 +[myodbcdriver]
  34 +Description = MySQL ODBC 2.50 Driver DSN
  35 +Driver = /usr/lib64/unixODBC/libmyodbc3.so
  36 +
  37 +
  38 +The document type 'NewType' must be added to the database for the document_type.cs unit test to run.
  39 +
  40 +
  41 +RUNNING THE TESTS
  42 +-----------------
  43 +
  44 +Edit the makefile to ensure that the WSDL_URL is directed to the correct location.
  45 +
  46 +A makefile is provided which can be used as follows:
  47 +
  48 +- make // will build and run the tests
  49 +
  50 +- make clean // will remove all temporary and binary files
  51 +
  52 +STATE
  53 +-----
  54 +
  55 +The states of the tests is very alpha. Some of the tests are quite complicated, so we can probably split them.
  56 +
  57 +REFERENCES
  58 +----------
  59 +
  60 +For more information:
  61 +
  62 +http://nunit.org/
  63 +http://www.mono-project.com/
  64 +http://www.unixodbc.org
ktwebservice/nunit/authentication.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class AuthenticationTest
  9 + {
  10 +
  11 + private String _session;
  12 + private KnowledgeTreeService _kt;
  13 +
  14 + [SetUp]
  15 + public void SetUp()
  16 + {
  17 + this._kt = new KTWebService();
  18 + }
  19 +
  20 + [TearDown]
  21 + public void TearDown()
  22 + {
  23 + }
  24 +
  25 + [Test]
  26 + public void Login()
  27 + {
  28 + kt_response response = this._kt.login("admin","admin","127.0.0.1");
  29 +
  30 + Assert.AreEqual(0,response.status_code);
  31 + Assert.IsFalse(response.message == null);
  32 + Assert.IsFalse(response.message == "");
  33 +
  34 + this._session = response.message;
  35 + }
  36 +
  37 + [Test]
  38 + public void Logout()
  39 + {
  40 + kt_response response = this._kt.logout(this._session);
  41 + Assert.AreEqual(0,response.status_code);
  42 + }
  43 + }
  44 +}
ktwebservice/nunit/document_add.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class AddDocumentTest : KTTest
  9 + {
  10 +
  11 +
  12 + private int _docId;
  13 + private int _folderId;
  14 + private String _filename;
  15 + private String _content;
  16 +
  17 + public AddDocumentTest() : base()
  18 + {
  19 + this._folderId = 1;
  20 + }
  21 +
  22 + [SetUp]
  23 + public void SetUp()
  24 + {
  25 + this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt";
  26 + this._content = "hello world!";
  27 +
  28 + Helper.writeFile(this._filename, this._content); }
  29 +
  30 + [TearDown]
  31 + public void TearDown()
  32 + {
  33 + Helper.deleteFile(this._filename);
  34 + }
  35 +
  36 + [Test]
  37 + public void FindDocumentBeforeAdd()
  38 + {
  39 + String filename = "Root Folder/kt test folder/kt unit test1";
  40 + if (this._verbose) System.Console.WriteLine("Finding document before add: " + filename);
  41 + kt_document_detail documentDetail = this._kt.get_document_detail_by_title(this._session, 1, filename, "");
  42 + if (0 == documentDetail.status_code)
  43 + {
  44 + if (this._verbose) System.Console.WriteLine("Found document - deleting");
  45 + kt_response response = this._kt.delete_document(this._session, documentDetail.document_id, "Delete - cleaning up before add");
  46 + Assert.AreEqual(0, response.status_code);
  47 + }
  48 + else if (this._verbose)
  49 + {
  50 + System.Console.WriteLine("document not found. that is ok!");
  51 + }
  52 + }
  53 +
  54 + [Test]
  55 + public void FindFolderBeforeAdd()
  56 + {
  57 + String folder = "Root Folder/kt test folder";
  58 + if (this._verbose) System.Console.WriteLine("Finding folder before add: " + folder);
  59 + kt_folder_detail folderDetail = this._kt.get_folder_detail_by_name(this._session, folder);
  60 + if (0 == folderDetail.status_code)
  61 + {
  62 + if (this._verbose) System.Console.WriteLine("Found folder - deleting");
  63 + kt_response response = this._kt.delete_folder(this._session, folderDetail.id, "Delete - cleaning up before add");
  64 + Assert.AreEqual(0, response.status_code);
  65 + }
  66 + else
  67 + {
  68 + if (this._verbose) System.Console.WriteLine("folder not found. that is ok!");
  69 + }
  70 + }
  71 +
  72 + [Test]
  73 + public void AddDocument()
  74 + {
  75 + String folder = "kt test folder";
  76 +
  77 + if (this._verbose) System.Console.WriteLine("Creating folder : " + folder);
  78 + kt_folder_detail folderDetail = this._kt.create_folder(this._session, 1, folder);
  79 + this._folderId = folderDetail.id;
  80 + if (this._verbose) System.Console.WriteLine("Got folder id : " + this._folderId);
  81 +
  82 + String filename = "kt unit test1";
  83 +
  84 + if (this._verbose) System.Console.WriteLine("Adding document : " + filename);
  85 +
  86 +
  87 + kt_document_detail response1 = this._kt.add_base64_document(this._session, this._folderId, filename, this._filename, "Default", Helper.ConvertFileToBase64Encoding(this._filename));
  88 +
  89 + Assert.AreEqual(0, response1.status_code);
  90 + Assert.AreEqual("kt unit test1", response1.title);
  91 + Assert.AreEqual("Default", response1.document_type);
  92 + Assert.AreEqual(0.1, response1.version);
  93 + Assert.AreEqual("kt_unit_test1.txt", response1.filename);
  94 +
  95 + Assert.IsFalse(response1.created_date == null);
  96 + Assert.IsFalse(response1.created_date == "");
  97 +
  98 + Assert.AreEqual("Administrator", response1.created_by);
  99 +
  100 + //Assert.IsTrue(response1.updated_date == null);
  101 + Assert.IsTrue("" != response1.modified_date);
  102 +
  103 + Assert.AreEqual("Administrator", response1.modified_by);
  104 +
  105 + Assert.IsTrue(response1.document_id > 0);
  106 +
  107 + Assert.AreEqual(this._folderId, response1.folder_id);
  108 +
  109 +
  110 + Assert.AreEqual("n/a",response1.workflow);
  111 +
  112 +
  113 + Assert.AreEqual("n/a",response1.workflow_state);
  114 +
  115 + Assert.AreEqual("Root Folder/" + folder + "/kt unit test1", response1.full_path);
  116 +
  117 + this._docId = response1.document_id;
  118 + }
  119 +
  120 + [Test]
  121 + public void FindDocumentBeforeDelete()
  122 + {
  123 +
  124 + if (this._verbose) System.Console.WriteLine("Find document before delete");
  125 + kt_document_detail documentDetail = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt test folder/kt unit test1", "T","");
  126 + Assert.AreEqual(0, documentDetail.status_code);
  127 + Assert.AreEqual(this._docId, documentDetail.document_id);
  128 +
  129 +
  130 +
  131 + if (this._verbose) System.Console.WriteLine("Find document before delete without the Root Folder's explicit naming");
  132 + documentDetail = this._kt.get_document_detail_by_title(this._session, 1, "/kt test folder/kt unit test1", "");
  133 + Assert.AreEqual(0, documentDetail.status_code);
  134 + Assert.AreEqual(this._docId, documentDetail.document_id);
  135 + }
  136 +
  137 + [Test]
  138 + public void DeleteDocument()
  139 + {
  140 + if (this._verbose) System.Console.WriteLine("Deleting document");
  141 + kt_response response = this._kt.delete_document(this._session, this._docId, "Delete - cleaning up after add");
  142 + Assert.AreEqual(0, response.status_code);
  143 + }
  144 +
  145 + [Test]
  146 + public void FindDocumentAfterDelete()
  147 + {
  148 + if (this._verbose) System.Console.WriteLine("Checking that document is gone!");
  149 +
  150 + kt_document_detail documentDetail = this._kt.get_document_detail_by_title(this._session, 1, "Root Folder/kt test folder/kt unit test1", "");
  151 + Assert.IsTrue(0 != documentDetail.status_code);
  152 + }
  153 +
  154 +
  155 +
  156 +
  157 + [Test]
  158 + public void Add2PhaseDocument()
  159 + {
  160 +
  161 +
  162 + String filename = "kt unit test31";
  163 +
  164 + if (this._verbose) System.Console.WriteLine("Adding document : " + filename);
  165 + FileUploader uploader = new FileUploader();
  166 +
  167 + uploader.upload(this._session, this._filename);
  168 + String tempname = uploader.getFilename();
  169 +
  170 + kt_document_detail response1 = this._kt.add_document(this._session, this._folderId, filename, this._filename, "Default", tempname);
  171 +
  172 + Assert.AreEqual(0, response1.status_code);
  173 + Assert.AreEqual(filename, response1.title);
  174 + Assert.AreEqual("Default", response1.document_type);
  175 + Assert.AreEqual(0.1, response1.version);
  176 + Assert.AreEqual("kt_unit_test1.txt", response1.filename);
  177 +
  178 + Assert.IsFalse(response1.created_date == null);
  179 + Assert.IsFalse(response1.created_date == "");
  180 +
  181 + Assert.AreEqual("Administrator", response1.created_by);
  182 +
  183 + //Assert.IsTrue(response1.modified_date == null);
  184 + Assert.IsTrue("" != response1.modified_date);
  185 +
  186 + Assert.AreEqual("Administrator", response1.modified_by);
  187 +
  188 + Assert.IsTrue(response1.document_id > 0);
  189 +
  190 + Assert.AreEqual(this._folderId, response1.folder_id);
  191 +
  192 +
  193 + Assert.AreEqual("n/a",response1.workflow);
  194 +
  195 +
  196 + Assert.AreEqual("n/a",response1.workflow_state);
  197 +
  198 +
  199 + this._docId = response1.document_id;
  200 +
  201 + kt_response response = this._kt.delete_document(this._session, this._docId, "Delete - cleaning up after add");
  202 + Assert.AreEqual(0, response.status_code);
  203 + }
  204 +
  205 + [Test]
  206 + public void DropFolder()
  207 + {
  208 + if (this._verbose) System.Console.WriteLine("Drop Folder!");
  209 +
  210 + kt_response documentDetail = this._kt.delete_folder(this._session, this._folderId, "delete - cleaning up");
  211 + Assert.AreEqual(0, documentDetail.status_code);
  212 + }
  213 +
  214 + }
  215 +}
ktwebservice/nunit/document_checkout.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class CheckoutDocumentTest : KTTest
  9 + {
  10 + private int _docId;
  11 + private int _folderId;
  12 + private String _filename;
  13 + private String _content;
  14 +
  15 +
  16 + [SetUp]
  17 + public void SetUp()
  18 + {
  19 +
  20 + this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt";
  21 +
  22 + String filename = "kt unit test1";
  23 +
  24 + this._content = "hello world!";
  25 +
  26 + Helper.writeFile(this._filename, this._content);
  27 +
  28 +
  29 +
  30 + this._folderId = 1;
  31 +
  32 + kt_document_detail response1 = this._kt.add_base64_document(this._session, this._folderId, filename, this._filename, "Default", Helper.ConvertFileToBase64Encoding(this._filename));
  33 +
  34 + if (this._verbose && response1.status_code != 0)
  35 + {
  36 + System.Console.WriteLine("Could not create file: " + this._filename);
  37 + }
  38 + this._docId = response1.document_id;
  39 +
  40 +
  41 + }
  42 +
  43 + [TearDown]
  44 + public void TearDown()
  45 + {
  46 +
  47 + Helper.deleteFile(this._filename);
  48 +
  49 + kt_response response = this._kt.delete_document(this._session, this._docId, "Delete - cleaning up");
  50 + if (this._verbose && response.status_code != 0)
  51 + {
  52 + System.Console.WriteLine("Could not delete file: " + this._filename);
  53 + }
  54 +
  55 + }
  56 +
  57 + [Test]
  58 + public void CheckoutDocument()
  59 + {
  60 + String filename = "kt unit test1";
  61 +
  62 + if (this._verbose) System.Console.WriteLine("Checking out document : " + filename);
  63 +
  64 + kt_document_detail response = this._kt.checkout_base64_document(this._session, this._docId, "unit test - going to checkout and then undo", false);
  65 + Assert.AreEqual(0, response.status_code);
  66 + Assert.AreEqual("Administrator",response.checked_out_by);
  67 + Assert.IsTrue(null != response.checked_out_date);
  68 +
  69 + response = this._kt.undo_document_checkout(this._session, this._docId, "unit test - doing undo");
  70 + Assert.AreEqual(0, response.status_code);
  71 + Assert.AreEqual("n/a",response.checked_out_by);
  72 + Assert.AreEqual("n/a", response.checked_out_date);
  73 + }
  74 +
  75 + [Test]
  76 + public void CheckinDocument()
  77 + {
  78 + String filename = "kt unit test1";
  79 +
  80 + if (this._verbose) System.Console.WriteLine("Checking out document : " + filename);
  81 +
  82 + kt_document_detail response = this._kt.checkout_base64_document(this._session, this._docId, "unit test - going to checkout and then checkin", false);
  83 + Assert.AreEqual(0, response.status_code);
  84 + Assert.AreEqual("Administrator",response.checked_out_by);
  85 + Assert.IsTrue(null != response.checked_out_date);
  86 +
  87 +
  88 + kt_document_detail checkin = this._kt.checkin_base64_document(this._session, this._docId, filename, "unit test - doing checkin", Helper.ConvertFileToBase64Encoding(this._filename), false);
  89 + Assert.AreEqual(0, checkin.status_code);
  90 + Assert.AreEqual("n/a",checkin.checked_out_by);
  91 + Assert.AreEqual("n/a", checkin.checked_out_date);
  92 + }
  93 +
  94 + [Test]
  95 + public void Checkin2PhaseDocument()
  96 + {
  97 + String filename = "kt unit test1";
  98 +
  99 + if (this._verbose) System.Console.WriteLine("Checking out document : " + filename);
  100 +
  101 + kt_document_detail response = this._kt.checkout_document(this._session, this._docId, "unit test - going to checkout and then checkin", false);
  102 + Assert.AreEqual(0, response.status_code);
  103 + Assert.AreEqual("Administrator",response.checked_out_by);
  104 + Assert.IsTrue(null != response.checked_out_date);
  105 +
  106 + FileUploader uploader = new FileUploader();
  107 +
  108 + uploader.upload(this._session, this._filename);
  109 + String tempname = uploader.getFilename();
  110 +
  111 + kt_document_detail checkin = this._kt.checkin_document(this._session, this._docId, filename, "unit test - doing checkin", tempname, false);
  112 + Assert.AreEqual(0, checkin.status_code);
  113 + Assert.AreEqual("n/a",checkin.checked_out_by);
  114 + Assert.AreEqual("n/a", checkin.checked_out_date);
  115 + }
  116 +
  117 +
  118 +
  119 + }
  120 +}
ktwebservice/nunit/document_contents.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentContentsTest : KTTest
  9 + {
  10 + private int _folderId;
  11 + private Document _doc1;
  12 +
  13 +
  14 + [SetUp]
  15 + public void SetUp()
  16 + {
  17 +
  18 + this._doc1 = new Document(1, this._session, this._kt, this._verbose,false);
  19 + this._doc1.createFile(1);
  20 +
  21 + kt_folder_detail response = this._kt.create_folder(this._session, 1, "kt_unit_testabc");
  22 +
  23 +
  24 + this._folderId = response.id;
  25 +
  26 + }
  27 +
  28 + [TearDown]
  29 + public void TearDown()
  30 + {
  31 + this._doc1.deleteFile();
  32 + }
  33 +
  34 + [Test]
  35 + public void Query()
  36 + {
  37 +
  38 + kt_folder_contents response = this._kt.get_folder_contents(this._session, 1, 1, "DF");
  39 +
  40 + Assert.AreEqual(0, response.status_code);
  41 + Assert.AreEqual(2, response.items.Length);
  42 +
  43 + Assert.AreEqual(this._doc1.docId, response.items[1].id);
  44 +
  45 + Assert.AreEqual("n/a", response.items[1].custom_document_no);
  46 + Assert.AreEqual("n/a", response.items[1].oem_document_no);
  47 +
  48 + Assert.AreEqual("D", response.items[1].item_type);
  49 + Assert.AreEqual(this._doc1.title, response.items[1].title);
  50 + Assert.AreEqual(this._doc1.realFilename, response.items[1].filename);
  51 + Assert.AreEqual("Default", response.items[1].document_type);
  52 + Assert.AreEqual(this._doc1.filesize+1 + "", response.items[1].filesize);
  53 +
  54 + Assert.AreEqual("Administrator", response.items[1].created_by);
  55 + Assert.AreEqual("Administrator", response.items[1].modified_by);
  56 + Assert.AreEqual("n/a", response.items[1].checked_out_by);
  57 + Assert.AreEqual("Administrator", response.items[1].owned_by);
  58 + Assert.AreEqual("0.1", response.items[1].version);
  59 + Assert.AreEqual("false", response.items[1].is_immutable);
  60 + Assert.AreEqual("n/a", response.items[1].permissions);
  61 + Assert.AreEqual("n/a", response.items[1].workflow);
  62 + Assert.AreEqual("n/a", response.items[1].workflow_state);
  63 + Assert.AreEqual("text/plain", response.items[1].mime_type);
  64 + Assert.AreEqual("text", response.items[1].mime_icon_path);
  65 + Assert.AreEqual("Plain Text", response.items[1].mime_display);
  66 + Assert.IsTrue("" != response.items[1].storage_path);
  67 +
  68 + Assert.AreEqual(this._folderId, response.items[0].id);
  69 + Assert.AreEqual("F", response.items[0].item_type);
  70 + Assert.AreEqual("kt_unit_testabc", response.items[0].title);
  71 +
  72 + Assert.AreEqual("kt_unit_testabc", response.items[0].filename);
  73 + Assert.AreEqual("n/a", response.items[0].document_type);
  74 + Assert.AreEqual("n/a", response.items[0].filesize);
  75 +
  76 + Assert.AreEqual("Administrator", response.items[0].created_by);
  77 + Assert.AreEqual("n/a", response.items[0].modified_by);
  78 + Assert.AreEqual("n/a", response.items[0].checked_out_by);
  79 + Assert.AreEqual("n/a", response.items[0].owned_by);
  80 + Assert.AreEqual("n/a", response.items[0].version);
  81 + Assert.AreEqual("n/a", response.items[0].is_immutable);
  82 + Assert.AreEqual("n/a", response.items[0].permissions);
  83 + Assert.AreEqual("n/a", response.items[0].workflow);
  84 + Assert.AreEqual("n/a", response.items[0].workflow_state);
  85 + Assert.AreEqual("folder", response.items[0].mime_type);
  86 + Assert.AreEqual("folder", response.items[0].mime_icon_path);
  87 + Assert.AreEqual("Folder", response.items[0].mime_display);
  88 + Assert.AreEqual("n/a",response.items[0].storage_path);
  89 + }
  90 + }
  91 +}
ktwebservice/nunit/document_copy.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 +
  8 +
  9 + [TestFixture]
  10 + public class DocumentCopyTest : KTTest
  11 + {
  12 + private int _folderId;
  13 + private Document _doc1;
  14 +
  15 +
  16 + [SetUp]
  17 + public void SetUp()
  18 + {
  19 + this._folderId = 1;
  20 +
  21 + this._doc1 = new Document(1, this._session, this._kt, this._verbose, false);
  22 + this._doc1.createFile(this._folderId);
  23 +
  24 +
  25 +
  26 + }
  27 +
  28 + [TearDown]
  29 + public void TearDown()
  30 + {
  31 + this._doc1.deleteFile();
  32 + }
  33 +
  34 + [Test]
  35 + public void FindDocumentBeforeCopy()
  36 + {
  37 + String filename = "Root Folder/test123";
  38 + if (this._verbose) System.Console.WriteLine("Finding document before add: " + filename);
  39 + kt_document_detail documentDetail = this._kt.get_document_detail_by_title(this._session, 1, filename, "");
  40 + if (0 == documentDetail.status_code)
  41 + {
  42 + if (this._verbose) System.Console.WriteLine("Found document - deleting");
  43 + kt_response response = this._kt.delete_document(this._session, documentDetail.document_id, "Delete - cleaning up before add");
  44 + Assert.AreEqual(0, response.status_code);
  45 + }
  46 + else if (this._verbose)
  47 + {
  48 + System.Console.WriteLine("document not found. that is ok!");
  49 + }
  50 + }
  51 +
  52 +
  53 + [Test]
  54 + public void CopyTest()
  55 + {
  56 + kt_document_detail linkresp = this._kt.copy_document(this._session, this._doc1.docId, 1, "copy", "test123", "test123.txt");
  57 + Assert.AreEqual(0, linkresp.status_code);
  58 + Assert.AreEqual("test123.txt", linkresp.filename);
  59 + Assert.AreEqual("test123", linkresp.title);
  60 +
  61 +
  62 +
  63 + }
  64 +
  65 + [Test]
  66 + public void FindDocumentAfterCopy()
  67 + {
  68 + String filename = "Root Folder/test123";
  69 + if (this._verbose) System.Console.WriteLine("Finding document before add: " + filename);
  70 + kt_document_detail documentDetail = this._kt.get_document_detail_by_title(this._session, 1, filename, "");
  71 + Assert.AreEqual(0, documentDetail.status_code);
  72 +
  73 + if (this._verbose) System.Console.WriteLine("Found document - deleting");
  74 + kt_response response = this._kt.delete_document(this._session, documentDetail.document_id, "Delete - cleaning up before add");
  75 + Assert.AreEqual(0, response.status_code);
  76 +
  77 + }
  78 +
  79 +
  80 +
  81 + }
  82 +}
ktwebservice/nunit/document_detail.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentDetailTest : KTTest
  9 + {
  10 + private int _docId;
  11 + private int _folderId;
  12 + private String _filename;
  13 + private String _content;
  14 +
  15 +
  16 + [SetUp]
  17 + public void SetUp()
  18 + {
  19 +
  20 + this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt";
  21 +
  22 + String filename = "kt unit test1";
  23 +
  24 + this._content = "hello world!";
  25 +
  26 + Helper.writeFile(this._filename, this._content);
  27 + this._folderId = 1;
  28 +
  29 + kt_document_detail response1 = this._kt.add_base64_document(this._session, this._folderId, filename, this._filename, "Default", Helper.ConvertFileToBase64Encoding(this._filename));
  30 +
  31 + if (this._verbose && response1.status_code != 0)
  32 + {
  33 + System.Console.WriteLine("Could not create file: " + this._filename);
  34 + }
  35 + this._docId = response1.document_id;
  36 +
  37 +
  38 + }
  39 +
  40 + [TearDown]
  41 + public void TearDown()
  42 + {
  43 +
  44 + Helper.deleteFile(this._filename);
  45 +
  46 + kt_response response = this._kt.delete_document(this._session, this._docId, "Delete - cleaning up");
  47 + if (this._verbose && response.status_code != 0)
  48 + {
  49 + System.Console.WriteLine("Could not delete file: " + this._filename);
  50 + }
  51 +
  52 + }
  53 +
  54 + [Test]
  55 + public void NonExistantDocumentTest()
  56 + {
  57 + kt_document_detail response = this._kt.get_document_detail(this._session, -1,"");
  58 + Assert.IsFalse(response.status_code == 0);
  59 + }
  60 +
  61 + [Test]
  62 + public void DocumentExistanceTest()
  63 + {
  64 + kt_document_detail response = this._kt.get_document_detail(this._session, this._docId,"MLTVH");
  65 + Assert.AreEqual(0, response.status_code);
  66 + Assert.AreEqual(this._docId, response.document_id);
  67 + Assert.AreEqual("kt unit test1", response.title);
  68 + Assert.AreEqual("n/a", response.custom_document_no);
  69 + Assert.AreEqual("n/a", response.oem_document_no);
  70 + Assert.AreEqual("Default", response.document_type);
  71 + Assert.AreEqual("Root Folder/kt unit test1", response.full_path);
  72 + Assert.AreEqual("kt_unit_test1.txt", response.filename);
  73 + Assert.AreEqual(this._content.Length + 1, response.filesize);
  74 + Assert.AreEqual(this._folderId, response.folder_id);
  75 + Assert.AreEqual("Administrator", response.created_by);
  76 + Assert.IsTrue("" != response.created_date);
  77 + Assert.AreEqual("n/a", response.checked_out_by);
  78 + Assert.IsTrue("" != response.checked_out_date);
  79 + Assert.AreEqual("Administrator", response.modified_by);
  80 + Assert.IsTrue("" != response.modified_date);
  81 + Assert.AreEqual("Administrator", response.owned_by);
  82 + Assert.AreEqual(0.1, response.version);
  83 + Assert.AreEqual(false, response.is_immutable);
  84 + Assert.AreEqual("n/a", response.permissions);
  85 + Assert.AreEqual("n/a", response.workflow);
  86 + Assert.AreEqual("n/a", response.workflow_state);
  87 + Assert.AreEqual("text/plain", response.mime_type);
  88 + Assert.AreEqual("text", response.mime_icon_path);
  89 + Assert.AreEqual("Plain Text", response.mime_display);
  90 + Assert.IsTrue("" != response.storage_path);
  91 + Assert.AreEqual(2, response.metadata.Length);
  92 + Assert.AreEqual(null, response.links);
  93 +
  94 + Assert.AreEqual(1, response.transaction_history.Length);
  95 + Assert.AreEqual("Create", response.transaction_history[0].transaction_name);
  96 + Assert.AreEqual("Administrator", response.transaction_history[0].username);
  97 + Assert.AreEqual(0.1, response.transaction_history[0].version);
  98 + Assert.AreEqual("Document created", response.transaction_history[0].comment);
  99 + Assert.IsTrue("" != response.transaction_history[0].datetime);
  100 +
  101 + Assert.AreEqual(1, response.version_history.Length);
  102 + Assert.AreEqual("Administrator", response.version_history[0].user);
  103 + Assert.AreEqual(0, response.version_history[0].metadata_version);
  104 + Assert.AreEqual(0.1, response.version_history[0].content_version);
  105 +
  106 +
  107 +
  108 + Assert.AreEqual(null, response.transitions);
  109 + }
  110 +
  111 + //[Test]
  112 + public void GetDetailByTitleTest()
  113 + {
  114 + kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt unit test1", "T","");
  115 +
  116 + Assert.AreEqual(0, response.status_code);
  117 + Assert.AreEqual(this._docId, response.document_id);
  118 + }
  119 +
  120 +
  121 + //[Test]
  122 + public void GetDetailByTitle2Test()
  123 + {
  124 + kt_document_detail response = this._kt.get_document_detail_by_title(this._session, 1, "Root Folder/kt unit test1", "");
  125 +
  126 + Assert.AreEqual(0, response.status_code);
  127 + Assert.AreEqual(this._docId, response.document_id);
  128 + }
  129 +
  130 + //[Test]
  131 + public void GetDetailByFileTest()
  132 + {
  133 + kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt_unit_test1.txt", "F","");
  134 +
  135 + Assert.AreEqual(0, response.status_code);
  136 + Assert.AreEqual(this._docId, response.document_id);
  137 + }
  138 + //[Test]
  139 + public void GetDetailByFile2Test()
  140 + {
  141 + kt_document_detail response = this._kt.get_document_detail_by_filename(this._session, 1, "Root Folder/kt_unit_test1.txt", "");
  142 +
  143 + Assert.AreEqual(0, response.status_code);
  144 + Assert.AreEqual(this._docId, response.document_id);
  145 + }
  146 +
  147 + //[Test]
  148 + public void GetDetailByUnknownNameTest()
  149 + {
  150 + kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt_unit_test1.ssssdasdasd", "F","");
  151 + Assert.IsFalse(response.status_code == 0);
  152 + }
  153 + }
  154 +}
ktwebservice/nunit/document_download.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +using System.Net;
  5 +
  6 +namespace MonoTests.KnowledgeTree
  7 +{
  8 + [TestFixture]
  9 + public class DocumentSystemMetadataTest : KTTest
  10 + {
  11 + private int _folderId;
  12 + private Document _doc1;
  13 +
  14 +
  15 + [SetUp]
  16 + public void SetUp()
  17 + {
  18 + this._folderId = 1;
  19 +
  20 + this._doc1 = new Document(1, this._session, this._kt, this._verbose,false);
  21 + this._doc1.createFile(this._folderId);
  22 + }
  23 +
  24 + [TearDown]
  25 + public void TearDown()
  26 + {
  27 + this._doc1.deleteFile();
  28 + }
  29 +
  30 + [Test]
  31 + public void DownloadTest()
  32 + {
  33 + kt_response update_resp = this._kt.download_document(this._session, this._doc1.docId );
  34 + Assert.AreEqual(0, update_resp.status_code);
  35 +
  36 + System.Console.WriteLine("Download...." + update_resp.message);
  37 +
  38 + String uri = update_resp.message;
  39 +
  40 + HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
  41 +
  42 + WebResponse response = webrequest.GetResponse();
  43 + StreamReader sr = new StreamReader(response.GetResponseStream());
  44 + String content = sr.ReadToEnd();
  45 +
  46 + System.Console.WriteLine(content);
  47 +
  48 +
  49 + }
  50 +
  51 + [Test]
  52 + public void SmallDownloadTest()
  53 + {
  54 + kt_response update_resp = this._kt.download_small_document(this._session, this._doc1.docId );
  55 + Assert.AreEqual(0, update_resp.status_code);
  56 +
  57 + String filename = Helper.isUnix()?("/tmp/kt_unit_test_tmp.txt"):("c:\\kt_unit_test_tmp.txt");
  58 +
  59 +
  60 +
  61 + long length = Helper.ConvertBase64EncodingToFile(update_resp.message, filename);
  62 + System.Console.WriteLine(Helper.readFile(filename));
  63 +
  64 + // TODO - why???
  65 + Assert.AreEqual(length, this._doc1.filesize+1);
  66 +
  67 + }
  68 + }
  69 +}
ktwebservice/nunit/document_history.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentHistoryTest : KTTest
  9 + {
  10 + private int _folderId;
  11 + private Document _doc1;
  12 +
  13 + [SetUp]
  14 + public void SetUp()
  15 + {
  16 + this._folderId = 1;
  17 +
  18 + this._doc1 = new Document(1, this._session, this._kt, this._verbose,false);
  19 + this._doc1.createFile(this._folderId);
  20 + }
  21 +
  22 + [TearDown]
  23 + public void TearDown()
  24 + {
  25 + this._doc1.deleteFile();
  26 + }
  27 +
  28 + [Test]
  29 + public void ChangeTypeTest()
  30 + {
  31 + kt_document_version_history_response version_resp = this._kt.get_document_version_history(this._session, this._doc1.docId);
  32 + Assert.AreEqual(0, version_resp.status_code);
  33 +
  34 + kt_document_transaction_history_response history_resp = this._kt.get_document_transaction_history(this._session, this._doc1.docId);
  35 + Assert.AreEqual(0, history_resp.status_code);
  36 + }
  37 + }
  38 +}
ktwebservice/nunit/document_links.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 +
  8 +
  9 + [TestFixture]
  10 + public class DocumentLinkTest : KTTest
  11 + {
  12 + private int _folderId;
  13 + private Document _doc1;
  14 + private Document _doc2;
  15 +
  16 +
  17 + [SetUp]
  18 + public void SetUp()
  19 + {
  20 + this._folderId = 1;
  21 +
  22 + this._doc1 = new Document(1, this._session, this._kt, this._verbose, false);
  23 + this._doc1.createFile(this._folderId);
  24 + this._doc2 = new Document(2, this._session, this._kt, this._verbose, false);
  25 + this._doc2.createFile(this._folderId);
  26 + }
  27 +
  28 + [TearDown]
  29 + public void TearDown()
  30 + {
  31 + this._doc1.deleteFile();
  32 + this._doc2.deleteFile();
  33 + }
  34 +
  35 + [Test]
  36 + public void LinkingTest()
  37 + {
  38 + kt_linked_document_response linkresp = this._kt.get_document_links(this._session, this._doc1.docId);
  39 + Assert.AreEqual(0, linkresp.status_code);
  40 + Assert.AreEqual(null, linkresp.links);
  41 +
  42 + kt_response response = this._kt.link_documents(this._session, this._doc1.docId, this._doc2.docId, "Reference");
  43 + Assert.AreEqual(0, response.status_code);
  44 +
  45 + linkresp = this._kt.get_document_links(this._session, this._doc1.docId);
  46 + Assert.AreEqual(0, linkresp.status_code);
  47 + Assert.AreEqual(this._doc1.docId, linkresp.parent_document_id);
  48 + Assert.AreEqual(1, linkresp.links.Length);
  49 + Assert.AreEqual(this._doc2.docId, linkresp.links[0].document_id);
  50 + Assert.AreEqual(this._doc2.title, linkresp.links[0].title);
  51 + Assert.AreEqual("Default", linkresp.links[0].document_type);
  52 + Assert.AreEqual(this._doc2.filesize+1, linkresp.links[0].filesize);
  53 + Assert.AreEqual(0.1, linkresp.links[0].version);
  54 + Assert.AreEqual("n/a", linkresp.links[0].workflow);
  55 + Assert.AreEqual("n/a", linkresp.links[0].workflow_state);
  56 + Assert.AreEqual("Reference", linkresp.links[0].link_type);
  57 + Assert.AreEqual("n/a", linkresp.links[0].custom_document_no);
  58 + Assert.AreEqual("n/a", linkresp.links[0].oem_document_no);
  59 +
  60 + response = this._kt.unlink_documents(this._session, this._doc1.docId, this._doc2.docId);
  61 + Assert.AreEqual(0, response.status_code);
  62 +
  63 + linkresp = this._kt.get_document_links(this._session, this._doc1.docId);
  64 + Assert.AreEqual(0, linkresp.status_code);
  65 + Assert.AreEqual(null, linkresp.links);
  66 +
  67 + }
  68 +
  69 +
  70 + }
  71 +}
ktwebservice/nunit/document_metadata.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentMetadataTest : KTTest
  9 + {
  10 + private int _docId;
  11 + private int _folderId;
  12 + private String _filename;
  13 + private String _content;
  14 +
  15 +
  16 + [SetUp]
  17 + public void SetUp()
  18 + {
  19 + this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt";
  20 +
  21 + String filename = "kt unit test1";
  22 +
  23 + this._content = "hello world!";
  24 +
  25 + Helper.writeFile(this._filename, this._content);
  26 +
  27 + this._folderId = 1;
  28 +
  29 + kt_document_detail response1 = this._kt.add_base64_document(this._session, this._folderId, filename, this._filename, "Default", Helper.ConvertFileToBase64Encoding(this._filename));
  30 +
  31 + if (this._verbose && response1.status_code != 0)
  32 + {
  33 + System.Console.WriteLine("Could not create file: " + this._filename);
  34 + }
  35 + this._docId = response1.document_id;
  36 +
  37 +
  38 + }
  39 +
  40 + [TearDown]
  41 + public void TearDown()
  42 + {
  43 +
  44 + Helper.deleteFile(this._filename);
  45 +
  46 + kt_response response = this._kt.delete_document(this._session, this._docId, "Delete - cleaning up");
  47 + if (this._verbose && response.status_code != 0)
  48 + {
  49 + System.Console.WriteLine("Could not delete file: " + this._filename);
  50 + }
  51 + }
  52 +
  53 + [Test]
  54 + public void GetDocumentTypesTest()
  55 + {
  56 + kt_document_types_response doc_types = this._kt.get_document_types(this._session);
  57 + Assert.AreEqual(0, doc_types.status_code);
  58 + }
  59 +
  60 + [Test]
  61 + public void GetDocumentTypeMetadataTest()
  62 + {
  63 +
  64 + kt_metadata_response metadata = this._kt.get_document_type_metadata(this._session, "Default");
  65 + Assert.AreEqual(0, metadata.status_code);
  66 + }
  67 +
  68 + [Test]
  69 + public void GetDocumentMetadataTest()
  70 + {
  71 +
  72 + kt_metadata_response metadata = this._kt.get_document_metadata(this._session, this._docId);
  73 + Assert.AreEqual(0, metadata.status_code);
  74 + }
  75 +
  76 + [Test]
  77 + public void UpdateDocumentMetadataTest()
  78 + {
  79 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  80 + fs[0] = new kt_metadata_fieldset();
  81 + fs[0].fieldset = "General information";
  82 + fs[0].fields = new kt_metadata_field[3];
  83 + fs[0].fields[0] = new kt_metadata_field();
  84 + fs[0].fields[0].name = "Document Author";
  85 + fs[0].fields[0].value = "Joe Soap";
  86 + fs[0].fields[1] = new kt_metadata_field();
  87 + fs[0].fields[1].name = "Category";
  88 + fs[0].fields[1].value = "Technical";
  89 + fs[0].fields[2] = new kt_metadata_field();
  90 + fs[0].fields[2].name = "Media Type";
  91 + fs[0].fields[2].value = "Text";
  92 +
  93 + kt_sysdata_item[] sysdata = new kt_sysdata_item[0];
  94 +
  95 + kt_document_detail update_resp = this._kt.update_document_metadata(this._session, this._docId, fs, sysdata);
  96 + Assert.AreEqual(0, update_resp.status_code);
  97 + Assert.AreEqual("General information", update_resp.metadata[1].fieldset);
  98 +
  99 + Assert.AreEqual("Document Author", update_resp.metadata[1].fields[0].name);
  100 + Assert.AreEqual("Joe Soap", update_resp.metadata[1].fields[0].value);
  101 +
  102 + Assert.AreEqual("Category", update_resp.metadata[1].fields[1].name);
  103 + Assert.AreEqual("Technical", update_resp.metadata[1].fields[1].value);
  104 +
  105 + Assert.AreEqual("Media Type", update_resp.metadata[1].fields[2].name);
  106 + Assert.AreEqual("Text", update_resp.metadata[1].fields[2].value);
  107 +
  108 +
  109 + }
  110 +
  111 + [Test]
  112 + public void UpdateDocumentMetadataWithSpecialCharactersTest()
  113 + {
  114 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  115 + fs[0] = new kt_metadata_fieldset();
  116 + fs[0].fieldset = "General information";
  117 + fs[0].fields = new kt_metadata_field[3];
  118 + fs[0].fields[0] = new kt_metadata_field();
  119 + fs[0].fields[0].name = "Document Author";
  120 + fs[0].fields[0].value = "Joe \\Soap";
  121 + fs[0].fields[1] = new kt_metadata_field();
  122 + fs[0].fields[1].name = "Category";
  123 + fs[0].fields[1].value = "Tec/hn\\ical/";
  124 + fs[0].fields[2] = new kt_metadata_field();
  125 + fs[0].fields[2].name = "Media Type";
  126 + fs[0].fields[2].value = "Text'";
  127 +
  128 + kt_sysdata_item[] sysdata = new kt_sysdata_item[0];
  129 +
  130 + kt_document_detail update_resp = this._kt.update_document_metadata(this._session, this._docId, fs, sysdata);
  131 + Assert.AreEqual(0, update_resp.status_code);
  132 + Assert.AreEqual("General information", update_resp.metadata[1].fieldset);
  133 +
  134 + Assert.AreEqual("Document Author", update_resp.metadata[1].fields[0].name);
  135 + Assert.AreEqual("Joe \\Soap", update_resp.metadata[1].fields[0].value);
  136 +
  137 + Assert.AreEqual("Category", update_resp.metadata[1].fields[1].name);
  138 + Assert.AreEqual("Tec/hn\\ical/", update_resp.metadata[1].fields[1].value);
  139 +
  140 + Assert.AreEqual("Media Type", update_resp.metadata[1].fields[2].name);
  141 + Assert.AreEqual("Text'", update_resp.metadata[1].fields[2].value);
  142 +
  143 +
  144 + }
  145 +
  146 +
  147 +
  148 + }
  149 +}
ktwebservice/nunit/document_owner.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentOwnerTest : KTTest
  9 + {
  10 + private int _folderId;
  11 + private Document _doc1;
  12 +
  13 + [SetUp]
  14 + public void SetUp()
  15 + {
  16 + this._folderId = 1;
  17 +
  18 + this._doc1 = new Document(1, this._session, this._kt, this._verbose, false);
  19 + this._doc1.createFile(this._folderId);
  20 + }
  21 +
  22 + [TearDown]
  23 + public void TearDown()
  24 + {
  25 + this._doc1.deleteFile();
  26 + }
  27 +
  28 + [Test]
  29 + public void ChangeOwnerTest()
  30 + {
  31 + kt_document_detail response = this._kt.change_document_owner(this._session, this._doc1.docId, "anonymous", "just trying to change owner");
  32 + Assert.AreEqual(0, response.status_code);
  33 +
  34 + // test to non existant user
  35 + response = this._kt.change_document_owner(this._session, this._doc1.docId, "blah", "just trying to change owner");
  36 + Assert.IsFalse(0 == response.status_code);
  37 + }
  38 + }
  39 +}
ktwebservice/nunit/document_rename.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentRenameTest : KTTest
  9 + {
  10 + private int _folderId;
  11 + private Document _doc1;
  12 +
  13 + [SetUp]
  14 + public void SetUp()
  15 + {
  16 + this._folderId = 1;
  17 +
  18 + this._doc1 = new Document(1, this._session, this._kt, this._verbose,false);
  19 + this._doc1.createFile(this._folderId);
  20 + }
  21 +
  22 + [TearDown]
  23 + public void TearDown()
  24 + {
  25 + this._doc1.deleteFile();
  26 + }
  27 +
  28 + [Test]
  29 + public void RenameTest()
  30 + {
  31 + kt_document_detail response = this._kt.rename_document_filename(this._session, this._doc1.docId, "test fname");
  32 + Assert.AreEqual(0, response.status_code);
  33 + Assert.AreEqual("test fname", response.filename);
  34 +
  35 + response = this._kt.rename_document_title(this._session, this._doc1.docId, "test title");
  36 + Assert.AreEqual(0, response.status_code);
  37 + Assert.AreEqual("test title", response.title);
  38 + }
  39 + }
  40 +}
ktwebservice/nunit/document_system_metadata.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 +
  8 +
  9 + [TestFixture]
  10 + public class DocumentSystemMetadataTest : KTTest
  11 + {
  12 + private int _folderId;
  13 + private Document _doc1;
  14 + private Document _doc2;
  15 +
  16 +
  17 + [SetUp]
  18 + public void SetUp()
  19 + {
  20 + this._folderId = 1;
  21 +
  22 +
  23 + this._doc1 = new Document(1, this._session, this._kt, this._verbose,false);
  24 + this._doc1.createFile(this._folderId);
  25 + this._doc2 = new Document(2, this._session, this._kt, this._verbose,true);
  26 + }
  27 +
  28 + [TearDown]
  29 + public void TearDown()
  30 + {
  31 + this._doc1.deleteFile();
  32 + this._doc2.deleteFile();
  33 + }
  34 +
  35 +// [Test]
  36 + public void UpdateDocumentMetadataTest()
  37 + {
  38 +
  39 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  40 + fs[0] = new kt_metadata_fieldset();
  41 + fs[0].fieldset = "General information";
  42 + fs[0].fields = new kt_metadata_field[3];
  43 + fs[0].fields[0] = new kt_metadata_field();
  44 + fs[0].fields[0].name = "Document Author";
  45 + fs[0].fields[0].value = "Joe Soap";
  46 + fs[0].fields[1] = new kt_metadata_field();
  47 + fs[0].fields[1].name = "Category";
  48 + fs[0].fields[1].value = "Technical";
  49 + fs[0].fields[2] = new kt_metadata_field();
  50 + fs[0].fields[2].name = "Media Type";
  51 + fs[0].fields[2].value = "Text";
  52 +
  53 + kt_sysdata_item[] sysdata = new kt_sysdata_item[3];
  54 + sysdata[0] = new kt_sysdata_item();
  55 + sysdata[0].name = "created_by";
  56 + sysdata[0].value = "Anonymous";
  57 + sysdata[1] = new kt_sysdata_item();
  58 + sysdata[1].name = "created_date";
  59 + sysdata[1].value = "2007-01-17";
  60 + sysdata[2] = new kt_sysdata_item();
  61 + sysdata[2].name = "modified_by";
  62 + sysdata[2].value = "admin";
  63 +
  64 +
  65 + kt_document_detail update_resp = this._kt.update_document_metadata(this._session, this._doc1.docId, fs, sysdata);
  66 + Assert.AreEqual(0, update_resp.status_code);
  67 + Assert.AreEqual("General information", update_resp.metadata[1].fieldset);
  68 +
  69 + Assert.AreEqual("Document Author", update_resp.metadata[1].fields[0].name);
  70 + Assert.AreEqual("Joe Soap", update_resp.metadata[1].fields[0].value);
  71 +
  72 + Assert.AreEqual("Category", update_resp.metadata[1].fields[1].name);
  73 + Assert.AreEqual("Technical", update_resp.metadata[1].fields[1].value);
  74 +
  75 + Assert.AreEqual("Media Type", update_resp.metadata[1].fields[2].name);
  76 + Assert.AreEqual("Text", update_resp.metadata[1].fields[2].value);
  77 +
  78 + Assert.AreEqual("Anonymous", update_resp.created_by);
  79 + Assert.AreEqual("2007-01-17 00:00:00", update_resp.created_date);
  80 + Assert.AreEqual("Administrator", update_resp.modified_by);
  81 + Assert.AreEqual("2007-01-17 00:00:00", update_resp.created_date);
  82 + }
  83 +
  84 +// [Test]
  85 + public void AddSmallDocumentWithMetadataTest()
  86 + {
  87 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  88 + fs[0] = new kt_metadata_fieldset();
  89 + fs[0].fieldset = "General information";
  90 + fs[0].fields = new kt_metadata_field[3];
  91 + fs[0].fields[0] = new kt_metadata_field();
  92 + fs[0].fields[0].name = "Document Author";
  93 + fs[0].fields[0].value = "Joe Soap";
  94 + fs[0].fields[1] = new kt_metadata_field();
  95 + fs[0].fields[1].name = "Category";
  96 + fs[0].fields[1].value = "Technical";
  97 + fs[0].fields[2] = new kt_metadata_field();
  98 + fs[0].fields[2].name = "Media Type";
  99 + fs[0].fields[2].value = "Text";
  100 +
  101 + kt_sysdata_item[] sysdata = new kt_sysdata_item[2];
  102 + sysdata[0] = new kt_sysdata_item();
  103 + sysdata[0].name = "created_by";
  104 + sysdata[0].value = "Anonymous";
  105 + sysdata[1] = new kt_sysdata_item();
  106 + sysdata[1].name = "created_date";
  107 + sysdata[1].value = "2007-01-17";
  108 +
  109 + this._doc2.local=false;
  110 + kt_document_detail update_resp = this._doc2.createFileWithMetadata(this._folderId, fs, sysdata);
  111 +
  112 + Assert.AreEqual(0, update_resp.status_code);
  113 + Assert.AreEqual("General information", update_resp.metadata[1].fieldset);
  114 +
  115 + Assert.AreEqual("Document Author", update_resp.metadata[1].fields[0].name);
  116 + Assert.AreEqual("Joe Soap", update_resp.metadata[1].fields[0].value);
  117 +
  118 + Assert.AreEqual("Category", update_resp.metadata[1].fields[1].name);
  119 + Assert.AreEqual("Technical", update_resp.metadata[1].fields[1].value);
  120 +
  121 + Assert.AreEqual("Media Type", update_resp.metadata[1].fields[2].name);
  122 + Assert.AreEqual("Text", update_resp.metadata[1].fields[2].value);
  123 +
  124 + Assert.AreEqual("Anonymous", update_resp.created_by);
  125 + Assert.AreEqual("2007-01-17 00:00:00", update_resp.created_date);
  126 + }
  127 +
  128 +// [Test]
  129 + public void CheckinSmallDocumentWithMetadataTest()
  130 + {
  131 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  132 + fs[0] = new kt_metadata_fieldset();
  133 + fs[0].fieldset = "General information";
  134 + fs[0].fields = new kt_metadata_field[3];
  135 + fs[0].fields[0] = new kt_metadata_field();
  136 + fs[0].fields[0].name = "Document Author";
  137 + fs[0].fields[0].value = "Joe Soap";
  138 + fs[0].fields[1] = new kt_metadata_field();
  139 + fs[0].fields[1].name = "Category";
  140 + fs[0].fields[1].value = "Technical";
  141 + fs[0].fields[2] = new kt_metadata_field();
  142 + fs[0].fields[2].name = "Media Type";
  143 + fs[0].fields[2].value = "Text";
  144 +
  145 + kt_sysdata_item[] sysdata = new kt_sysdata_item[2];
  146 + sysdata[0] = new kt_sysdata_item();
  147 + sysdata[0].name = "created_by";
  148 + sysdata[0].value = "Anonymous";
  149 + sysdata[1] = new kt_sysdata_item();
  150 + sysdata[1].name = "created_date";
  151 + sysdata[1].value = "2007-01-17";
  152 +
  153 + kt_document_detail resp = this._kt.checkout_base64_document(this._session, this._doc1.docId, "test checkin", false);
  154 + Assert.AreEqual(0, resp.status_code);
  155 +
  156 +
  157 +
  158 + kt_document_detail update_resp = this._doc1.checkinFileWithMetadata(this._folderId, fs, sysdata);
  159 +
  160 + Assert.AreEqual(0, update_resp.status_code);
  161 + Assert.AreEqual("General information", update_resp.metadata[1].fieldset);
  162 +
  163 + Assert.AreEqual("Document Author", update_resp.metadata[1].fields[0].name);
  164 + Assert.AreEqual("Joe Soap", update_resp.metadata[1].fields[0].value);
  165 +
  166 + Assert.AreEqual("Category", update_resp.metadata[1].fields[1].name);
  167 + Assert.AreEqual("Technical", update_resp.metadata[1].fields[1].value);
  168 +
  169 + Assert.AreEqual("Media Type", update_resp.metadata[1].fields[2].name);
  170 + Assert.AreEqual("Text", update_resp.metadata[1].fields[2].value);
  171 +
  172 + Assert.AreEqual("Anonymous", update_resp.created_by);
  173 + Assert.AreEqual("2007-01-17 00:00:00", update_resp.created_date);
  174 + }
  175 +
  176 + [Test]
  177 + public void AddDocumentWithMetadataTest()
  178 + {
  179 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  180 + fs[0] = new kt_metadata_fieldset();
  181 + fs[0].fieldset = "General information";
  182 + fs[0].fields = new kt_metadata_field[3];
  183 + fs[0].fields[0] = new kt_metadata_field();
  184 + fs[0].fields[0].name = "Document Author";
  185 + fs[0].fields[0].value = "Joe Soap";
  186 + fs[0].fields[1] = new kt_metadata_field();
  187 + fs[0].fields[1].name = "Category";
  188 + fs[0].fields[1].value = "Technical";
  189 + fs[0].fields[2] = new kt_metadata_field();
  190 + fs[0].fields[2].name = "Media Type";
  191 + fs[0].fields[2].value = "Text";
  192 +
  193 + kt_sysdata_item[] sysdata = new kt_sysdata_item[2];
  194 + sysdata[0] = new kt_sysdata_item();
  195 + sysdata[0].name = "created_by";
  196 + sysdata[0].value = "Anonymous";
  197 + sysdata[1] = new kt_sysdata_item();
  198 + sysdata[1].name = "created_date";
  199 + sysdata[1].value = "2007-01-17";
  200 +
  201 +
  202 +
  203 + this._doc2.local = true;
  204 + this._doc2.createFile(this._folderId);
  205 +
  206 +
  207 + FileUploader uploader = new FileUploader( );
  208 +
  209 + uploader.upload(this._session, this._doc2.filename);
  210 +
  211 + System.Console.WriteLine("uploaded: " + uploader.filename);
  212 + kt_document_detail response1 = this._kt.add_document_with_metadata(this._session, this._folderId, this._doc2.title, this._doc2.filename, "Default", uploader.filename,fs, sysdata);
  213 +
  214 + Assert.AreEqual(0, response1.status_code);
  215 + }
  216 +
  217 + [Test]
  218 + public void CheckinDocumentWithMetadataTest()
  219 + {
  220 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  221 + fs[0] = new kt_metadata_fieldset();
  222 + fs[0].fieldset = "General information";
  223 + fs[0].fields = new kt_metadata_field[3];
  224 + fs[0].fields[0] = new kt_metadata_field();
  225 + fs[0].fields[0].name = "Document Author";
  226 + fs[0].fields[0].value = "Joe Soap";
  227 + fs[0].fields[1] = new kt_metadata_field();
  228 + fs[0].fields[1].name = "Category";
  229 + fs[0].fields[1].value = "Technical";
  230 + fs[0].fields[2] = new kt_metadata_field();
  231 + fs[0].fields[2].name = "Media Type";
  232 + fs[0].fields[2].value = "Text";
  233 +
  234 + kt_sysdata_item[] sysdata = new kt_sysdata_item[2];
  235 + sysdata[0] = new kt_sysdata_item();
  236 + sysdata[0].name = "created_by";
  237 + sysdata[0].value = "Anonymous";
  238 + sysdata[1] = new kt_sysdata_item();
  239 + sysdata[1].name = "created_date";
  240 + sysdata[1].value = "2007-01-17";
  241 +
  242 + kt_document_detail resp = this._kt.checkout_base64_document(this._session, this._doc1.docId, "test checkin", false);
  243 + Assert.AreEqual(0, resp.status_code);
  244 +
  245 + FileUploader uploader = new FileUploader( );
  246 +
  247 + uploader.upload(this._session, this._doc1.filename);
  248 +
  249 + kt_document_detail update_resp = this._kt.checkin_document(this._session, this._doc1.docId, this._doc1.filename, "unit test - doing checkin", uploader.filename, false);
  250 + Assert.AreEqual(0, update_resp.status_code);
  251 + }
  252 +
  253 + }
  254 +}
ktwebservice/nunit/document_type.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentOwnerTest : KTTest
  9 + {
  10 + private int _folderId;
  11 + private Document _doc1;
  12 +
  13 + [SetUp]
  14 + public void SetUp()
  15 + {
  16 + this._folderId = 1;
  17 +
  18 +
  19 + this._doc1 = new Document(1, this._session, this._kt, this._verbose,false);
  20 + this._doc1.createFile(this._folderId);
  21 +
  22 + this._verbose = true;
  23 +
  24 + }
  25 +
  26 + [TearDown]
  27 + public void TearDown()
  28 + {
  29 + this._doc1.deleteFile();
  30 + }
  31 +
  32 + [Test]
  33 + public void ChangeTypeTest()
  34 + {
  35 + // NOTE: Create the following type 'NewType' via the admin pages
  36 +
  37 + kt_document_detail response = this._kt.change_document_type(this._session, this._doc1.docId, "NewType");
  38 + Assert.AreEqual(0, response.status_code);
  39 + if (0 != response.status_code)
  40 + {
  41 + System.Console.WriteLine("Please check that the document type 'NewType' exists in the database! This test should pass if it exists!");
  42 + System.Console.WriteLine("SQL: insert into document_types_lookup(name) values('NewType');");
  43 + }
  44 +
  45 + // NOTE: we need to test with an unknown type as well
  46 +
  47 + response = this._kt.change_document_type(this._session, this._doc1.docId, "UnknownType");
  48 + Assert.IsTrue(0 != response.status_code);
  49 +
  50 + }
  51 + }
  52 +}
ktwebservice/nunit/document_workflow.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class WorkflowTest : KTTest
  9 + {
  10 + private int _folderId;
  11 + private Document _doc1;
  12 +
  13 + [SetUp]
  14 + public void SetUp()
  15 + {
  16 + this._folderId = 1;
  17 +
  18 + this._doc1 = new Document(1, this._session, this._kt, this._verbose, false);
  19 + this._doc1.createFile(this._folderId);
  20 + }
  21 +
  22 + [TearDown]
  23 + public void TearDown()
  24 + {
  25 + this._doc1.deleteFile();
  26 + }
  27 +
  28 + [Test]
  29 + public void NonExistantWorkflowTest()
  30 + {
  31 + kt_document_detail response = this._kt.start_document_workflow(this._session, this._doc1.docId, "Non Existant Workflow");
  32 + Assert.IsTrue(0 != response.status_code);
  33 + }
  34 +
  35 + [Test]
  36 + public void StartWorkflowTest()
  37 + {
  38 + kt_document_detail response = this._kt.start_document_workflow(this._session, this._doc1.docId, "Review Process");
  39 + Assert.AreEqual(0, response.status_code);
  40 + Assert.AreEqual("Review Process", response.workflow);
  41 + }
  42 +
  43 + [Test]
  44 + public void StopWorkflowTest()
  45 + {
  46 + kt_document_detail response = this._kt.start_document_workflow(this._session, this._doc1.docId, "Review Process");
  47 + Assert.AreEqual(0, response.status_code);
  48 + Assert.AreEqual("Review Process", response.workflow);
  49 +
  50 + response = this._kt.delete_document_workflow(this._session, this._doc1.docId);
  51 + Assert.AreEqual(0, response.status_code);
  52 + Assert.AreEqual("n/a", response.workflow);
  53 + }
  54 +
  55 + [Test]
  56 + public void GetTransitionsTest()
  57 + {
  58 + kt_document_detail response = this._kt.start_document_workflow(this._session, this._doc1.docId, "Review Process");
  59 + Assert.AreEqual(0, response.status_code);
  60 + Assert.AreEqual("Review Process", response.workflow);
  61 +
  62 + kt_workflow_transitions_response trans_resp = this._kt.get_document_workflow_transitions(this._session, this._doc1.docId);
  63 + Assert.AreEqual(0, trans_resp.status_code);
  64 + Assert.AreEqual(1, trans_resp.transitions.Length);
  65 + Assert.AreEqual("Request Approval", trans_resp.transitions[0]);
  66 + }
  67 +
  68 + [Test]
  69 + public void WorkflowTransitionTest()
  70 + {
  71 + kt_document_detail response = this._kt.start_document_workflow(this._session, this._doc1.docId, "Review Process");
  72 + Assert.AreEqual(0, response.status_code);
  73 + Assert.AreEqual("Review Process", response.workflow);
  74 + Assert.AreEqual("Draft", response.workflow_state);
  75 +
  76 + response = this._kt.perform_document_workflow_transition(this._session, this._doc1.docId, "Request Approval", "Please approve me");
  77 + Assert.AreEqual(0, response.status_code);
  78 + Assert.AreEqual("Review Process", response.workflow);
  79 + Assert.AreEqual("Approval", response.workflow_state);
  80 +
  81 + response = this._kt.perform_document_workflow_transition(this._session, this._doc1.docId, "Approve", "Ok!");
  82 + Assert.AreEqual(0, response.status_code);
  83 + Assert.AreEqual("Review Process", response.workflow);
  84 + Assert.AreEqual("Published", response.workflow_state);
  85 + }
  86 + }
  87 +}
ktwebservice/nunit/folder.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class FolderTest : KTTest
  9 + {
  10 +
  11 + private int _folder_id;
  12 + private int _subfolder_id;
  13 +
  14 + [SetUp]
  15 + public void SetUp()
  16 + {
  17 + }
  18 +
  19 + [TearDown]
  20 + public void TearDown()
  21 + {
  22 + }
  23 +
  24 + [Test]
  25 + public void GetFolderDetail()
  26 + {
  27 +
  28 + kt_folder_detail response = this._kt.get_folder_detail(this._session, 1);
  29 + Assert.AreEqual(0, response.status_code);
  30 + Assert.AreEqual(1, response.id);
  31 + Assert.AreEqual("Root Folder", response.folder_name);
  32 + Assert.AreEqual(0, response.parent_id);
  33 + Assert.AreEqual("Root Folder", response.full_path);
  34 + }
  35 +
  36 + [Test]
  37 + public void AddFolder()
  38 + {
  39 +
  40 + kt_folder_detail response = this._kt.create_folder(this._session, 1, "kt_unit_test");
  41 + Assert.AreEqual(0,response.status_code);
  42 +
  43 + this._folder_id = response.id;
  44 +
  45 + response = this._kt.create_folder(this._session, this._folder_id, "subfolder");
  46 + Assert.AreEqual(0,response.status_code);
  47 +
  48 + this._subfolder_id = response.id;
  49 +
  50 + }
  51 +
  52 + [Test]
  53 + public void GetFolderByName()
  54 + {
  55 +
  56 + kt_folder_detail response = this._kt.get_folder_detail_by_name(this._session, "/kt_unit_test");
  57 + Assert.AreEqual(0,response.status_code);
  58 + Assert.AreEqual(this._folder_id, response.id);
  59 +
  60 + response = this._kt.get_folder_detail_by_name(this._session, "kt_unit_test");
  61 + Assert.AreEqual(0,response.status_code);
  62 + Assert.AreEqual(this._folder_id, response.id);
  63 +
  64 + response = this._kt.get_folder_detail_by_name(this._session, "kt_unit_test/subfolder");
  65 + Assert.AreEqual(0,response.status_code);
  66 + Assert.AreEqual(this._subfolder_id,response.id);
  67 +
  68 + response = this._kt.get_folder_detail_by_name(this._session, "kt_unit_test/subfolder2");
  69 + Assert.IsFalse(response.status_code == 0);
  70 +
  71 +
  72 + }
  73 +
  74 + [Test]
  75 + public void GetFolderContents()
  76 + {
  77 + kt_folder_contents response = this._kt.get_folder_contents(this._session, this._folder_id, 1, "DF");
  78 + Assert.AreEqual(0,response.status_code);
  79 + Assert.AreEqual(this._folder_id,response.folder_id);
  80 + Assert.AreEqual("kt_unit_test", response.folder_name);
  81 + Assert.AreEqual("Root Folder/kt_unit_test", response.full_path);
  82 +
  83 + kt_folder_contents response2 = this._kt.get_folder_contents(this._session, this._subfolder_id, 1, "DF");
  84 + Assert.AreEqual(0, response2.status_code);
  85 + Assert.AreEqual(this._subfolder_id, response2.folder_id);
  86 + Assert.AreEqual("subfolder", response2.folder_name);
  87 + Assert.AreEqual("Root Folder/kt_unit_test/subfolder", response2.full_path);
  88 + }
  89 +
  90 + [Test]
  91 + public void RenameFolder()
  92 + {
  93 + kt_response response = this._kt.rename_folder(this._session, this._subfolder_id, "subfolde'r2");
  94 + Assert.AreEqual(0, response.status_code);
  95 +
  96 + kt_folder_detail response2 = this._kt.get_folder_detail(this._session, this._subfolder_id);
  97 + Assert.AreEqual(0, response2.status_code);
  98 + Assert.AreEqual(this._subfolder_id, response2.id);
  99 + Assert.AreEqual("subfolde'r2", response2.folder_name);
  100 + Assert.AreEqual(this._folder_id, response2.parent_id);
  101 + Assert.AreEqual("Root Folder/kt_unit_test/subfolde'r2", response2.full_path);
  102 + }
  103 +
  104 + [Test]
  105 + public void RemoveFolder()
  106 + {
  107 + kt_response response = this._kt.delete_folder(this._session, this._folder_id, "unit testing remove");
  108 + Assert.AreEqual(0, response.status_code);
  109 + }
  110 +
  111 + [Test]
  112 + public void AddFolderWithSpecialCharacters()
  113 + {
  114 + kt_folder_detail response = this._kt.create_folder(this._session, 1, "kt.unit.test");
  115 + Assert.AreEqual(0,response.status_code);
  116 + Assert.AreEqual("kt.unit.test",response.folder_name);
  117 +
  118 + response = this._kt.create_folder(this._session, 1, "kt ' unit \" test");
  119 + Assert.AreEqual(0,response.status_code);
  120 + Assert.AreEqual("kt ' unit \" test",response.folder_name);
  121 +
  122 + response = this._kt.create_folder(this._session, 1, "kt - unit - test");
  123 + Assert.AreEqual(0,response.status_code);
  124 + Assert.AreEqual("kt - unit - test",response.folder_name);
  125 + }
  126 + }
  127 +}
ktwebservice/nunit/helper.cs 0 โ†’ 100644
  1 +using System;
  2 +using System.Text;
  3 +using System.Net;
  4 +using System.IO;
  5 +using System.Collections;
  6 +using System.Data;
  7 +using System.Data.Odbc;
  8 +
  9 +namespace MonoTests.KnowledgeTree
  10 +{
  11 +
  12 +
  13 +
  14 + [System.Web.Services.WebServiceBinding(Name="KnowledgeTreePort", Namespace="urn:KnowledgeTree")]
  15 + public class KTWebService : KnowledgeTreeService
  16 + {
  17 + public KTWebService() : base()
  18 + {
  19 + this.Url = Environment.GetEnvironmentVariable("KT_ROOT_URL") + "/ktwebservice/webservice.php";
  20 + }
  21 + }
  22 +
  23 + public class KTTest
  24 + {
  25 + protected KTWebService _kt;
  26 + protected String _session;
  27 + protected bool _verbose;
  28 +
  29 +
  30 + public KTTest()
  31 + {
  32 + this._kt = new KTWebService();
  33 + kt_response response = this._kt.login("admin","admin","127.0.0.1");
  34 + this._session = response.message;
  35 + this._verbose = false;
  36 + this.setupDb();
  37 + }
  38 +
  39 + void setupDb()
  40 + {
  41 +
  42 + String connectionString = "DSN=ktdms;" + "UID=root;" + "PWD=";
  43 + try
  44 + {
  45 + IDbConnection dbcon = new OdbcConnection(connectionString);
  46 + if (dbcon == null)
  47 + {
  48 + System.Console.WriteLine("Cannot create connection");
  49 + }
  50 + dbcon.Open();
  51 + IDbCommand dbcmd = dbcon.CreateCommand();
  52 + if (dbcmd == null)
  53 + {
  54 + System.Console.WriteLine("Cannot create command");
  55 + }
  56 + dbcmd.CommandText = "DELETE FROM folders WHERE id > 1";
  57 + dbcmd.CommandType = CommandType.Text;
  58 + dbcmd.ExecuteNonQuery();
  59 + dbcmd.CommandText = "DELETE FROM documents";
  60 + dbcmd.CommandType = CommandType.Text;
  61 + dbcmd.ExecuteNonQuery();
  62 + dbcmd.CommandText = "DELETE FROM document_types_lookup WHERE name = 'NewType'";
  63 + dbcmd.ExecuteNonQuery();
  64 + dbcmd.CommandText = "INSERT INTO document_types_lookup(id,name) VALUES(2,'NewType')";
  65 + dbcmd.ExecuteNonQuery();
  66 + dbcmd.Dispose();
  67 + dbcmd = null;
  68 + dbcon.Close();
  69 + dbcon = null;
  70 + }
  71 + catch(Exception ex)
  72 + {
  73 + System.Console.WriteLine(ex.Message);
  74 + }
  75 + }
  76 +
  77 + ~KTTest()
  78 + {
  79 + this._kt.logout(this._session);
  80 + }
  81 + }
  82 +
  83 +
  84 +
  85 + public class FileUploader
  86 + {
  87 + private String boundary;
  88 + private String uri;
  89 + public String filename;
  90 +
  91 +
  92 + public FileUploader(String uri)
  93 + {
  94 + this.uri = uri;
  95 + System.Console.WriteLine("Using upload URL: " + uri);
  96 + this.boundary = "----" + DateTime.Now.Ticks.ToString("x");
  97 + }
  98 +
  99 + public FileUploader() : this(Environment.GetEnvironmentVariable("KT_ROOT_URL") + "/ktwebservice/upload.php")
  100 + {
  101 + }
  102 +
  103 +
  104 + public String getFilename()
  105 + {
  106 + return this.filename;
  107 + }
  108 +
  109 +
  110 + public void upload(String sessionid, String filename)
  111 + {
  112 + String displayname = Path.GetFileName(filename);
  113 + StringBuilder header = new StringBuilder();
  114 +
  115 + header.Append("--" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"session_id\"\r\n\r\n" + sessionid + "\r\n");
  116 + header.Append("--" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"action\"\r\n\r\nA\r\n");
  117 + header.Append("--" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"output\"\r\n\r\nxml\r\n");
  118 +
  119 + header.Append("--" + boundary + "\r\n");
  120 + header.Append("Content-Disposition: form-data; name=\"name\";");
  121 + header.Append("filename=\"" + displayname + "\"\r\nContent-Type: application/octet-stream\r\n\r\n");
  122 +
  123 +
  124 + HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(this.uri);
  125 + webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
  126 + webrequest.Method = "POST";
  127 +
  128 +
  129 + byte[] headerArray = Encoding.UTF8.GetBytes(header.ToString());
  130 + byte[] boundaryArray = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
  131 +
  132 + FileStream file = new FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
  133 +
  134 + long filesize = file.Length;
  135 + webrequest.ContentLength = headerArray.Length + filesize + boundaryArray.Length;
  136 +
  137 + Stream requestStream = webrequest.GetRequestStream();
  138 + requestStream.Write(headerArray, 0, headerArray.Length);
  139 +
  140 + byte[] buffer = new byte[10240];
  141 +
  142 + int read = 0;
  143 +
  144 + while ((read = file.Read(buffer, 0, buffer.Length)) > 0)
  145 + {
  146 +
  147 + requestStream.Write(buffer, 0, read);
  148 + }
  149 +
  150 + requestStream.Write(boundaryArray, 0, boundaryArray.Length);
  151 +
  152 +
  153 + WebResponse response = webrequest.GetResponse();
  154 + StreamReader sr = new StreamReader(response.GetResponseStream());
  155 + String xml = sr.ReadToEnd();
  156 + //System.Console.WriteLine("xml: " + xml);
  157 +
  158 +
  159 +
  160 + if (xml.IndexOf("<status_code>0</status_code>") != -1)
  161 + {
  162 + long tmp = this.tokenInt("filesize",xml);
  163 + if (tmp != filesize)
  164 + {
  165 + throw new Exception("Filesize should be " + filesize + " but appears to be "+ tmp);
  166 + }
  167 +
  168 + tmp = this.tokenInt("error",xml);
  169 + if (tmp > 0)
  170 + {
  171 + throw new Exception("The server reported error code " + tmp + " for the file upload");
  172 + }
  173 + this.filename = this.tokenString("filename",xml);
  174 + // yay, all is good!
  175 + return;
  176 + }
  177 +
  178 + String msg = this.tokenString("msg", xml);
  179 + long error = this.tokenInt("error", xml);
  180 + if (error > 0)
  181 + {
  182 + throw new Exception("The server reported error code " + error + " for the file upload");
  183 + }
  184 +
  185 + throw new Exception("Upload error: " + msg);
  186 +
  187 + }
  188 +
  189 + private String tokenString(String token, String xml)
  190 + {
  191 + int tokStart = xml.IndexOf("<"+token+">") + token.Length+2;
  192 + int tokEnd = xml.IndexOf("</"+token+">");
  193 + if (tokEnd == -1) return "";
  194 +
  195 + String value = xml.Substring(tokStart, tokEnd-tokStart);
  196 + //System.Console.WriteLine(token + ": " + value);
  197 + return value;
  198 + }
  199 +
  200 + private long tokenInt(String token, String xml)
  201 + {
  202 + String value = this.tokenString(token, xml);
  203 + if (value.Equals(""))
  204 + {
  205 + return -1;
  206 + }
  207 + return long.Parse(value);
  208 + }
  209 +
  210 + }
  211 +
  212 +
  213 +
  214 + public class Document
  215 + {
  216 + public String title;
  217 + public String filename;
  218 + public String realFilename;
  219 + public String content;
  220 + public int docId;
  221 + public String session;
  222 + public KnowledgeTreeService kt;
  223 + public long filesize;
  224 + public bool verbose;
  225 + public bool local;
  226 +
  227 + public Document(int offset, String session, KnowledgeTreeService kt, bool verbose, bool local)
  228 + {
  229 + this.title = "kt unit test" + offset;
  230 + this.realFilename = "kt_unit_test" + offset + ".txt";
  231 + this.filename = (Helper.isUnix()?("/tmp/"):("c:\\")) + this.realFilename;
  232 + this.content = "Hello World!\nThis is a test! And more!\n\n\r\n";
  233 + this.docId = 0;
  234 + this.session = session;
  235 + this.kt = kt;
  236 + this.verbose =verbose;
  237 + this.local = local;
  238 + }
  239 +
  240 + public kt_document_detail createFile(int folderId)
  241 + {
  242 + Helper.writeFile(this.filename, this.content);
  243 + this.filesize = this.content.Length;
  244 +
  245 + if (this.local)
  246 + {
  247 + return null;
  248 + }
  249 + kt_document_detail d1 = this.kt.get_document_detail_by_title(this.session, folderId, this.title, "");
  250 + if (d1.status_code == 1)
  251 + {
  252 + this.docId = d1.document_id;
  253 + this.deleteFile();
  254 + }
  255 +
  256 + kt_document_detail response1 = this.kt.add_base64_document(this.session, folderId, this.title, this.filename, "Default", Helper.ConvertFileToBase64Encoding(this.filename));
  257 +
  258 + if (response1.status_code == 0)
  259 + {
  260 + this.docId = response1.document_id;
  261 + }
  262 +
  263 + if (this.verbose)
  264 + {
  265 + if (response1.status_code == 0)
  266 + {
  267 + System.Console.WriteLine("docid: " + this.docId + " filename: " + this.filename);
  268 + }
  269 + else
  270 + {
  271 + System.Console.WriteLine("Could not create file: " + this.filename);
  272 + }
  273 + }
  274 +
  275 + return response1;
  276 +
  277 + }
  278 +
  279 + public kt_document_detail createFileWithMetadata(int folderId, kt_metadata_fieldset[] metadata, kt_sysdata_item[] sysdata)
  280 + {
  281 + Helper.writeFile(this.filename, this.content);
  282 +
  283 + this.filesize = this.content.Length;
  284 +
  285 + if (this.local)
  286 + {
  287 + return null;
  288 + }
  289 +
  290 + kt_document_detail d1 = this.kt.get_document_detail_by_title(this.session, folderId, this.title, "");
  291 + if (d1.status_code == 1)
  292 + {
  293 + this.docId = d1.document_id;
  294 + this.deleteFile();
  295 + }
  296 +
  297 + kt_document_detail response1 = this.kt.add_base64_document_with_metadata(this.session, folderId, this.title, this.filename, "Default", Helper.ConvertFileToBase64Encoding(this.filename), metadata, sysdata);
  298 +
  299 + if (response1.status_code == 0)
  300 + {
  301 + this.docId = response1.document_id;
  302 + }
  303 +
  304 + if (this.verbose)
  305 + {
  306 + if (response1.status_code == 0)
  307 + {
  308 + System.Console.WriteLine("docid: " + this.docId + " filename: " + this.filename);
  309 + }
  310 + else
  311 + {
  312 + System.Console.WriteLine("Could not create file: " + this.filename);
  313 + }
  314 + }
  315 +
  316 + return response1;
  317 + }
  318 +
  319 + public kt_document_detail checkinFileWithMetadata(int folderId, kt_metadata_fieldset[] metadata, kt_sysdata_item[] sysdata)
  320 + {
  321 + Helper.writeFile(this.filename, this.content);
  322 + this.filesize = this.content.Length;
  323 +
  324 + if (this.local)
  325 + {
  326 + return null;
  327 + }
  328 +
  329 + kt_document_detail d1 = this.kt.get_document_detail_by_title(this.session, folderId, this.title, "");
  330 + if (d1.status_code == 1)
  331 + {
  332 + this.docId = d1.document_id;
  333 + this.deleteFile();
  334 + }
  335 +
  336 + kt_document_detail response1 = this.kt.checkin_base64_document_with_metadata(this.session, this.docId, this.filename, "checkin reason", Helper.ConvertFileToBase64Encoding(this.filename), false, metadata, sysdata);
  337 +
  338 + if (response1.status_code == 0)
  339 + {
  340 + this.docId = response1.document_id;
  341 + }
  342 +
  343 + if (this.verbose)
  344 + {
  345 + if (response1.status_code == 0)
  346 + {
  347 + System.Console.WriteLine("docid: " + this.docId + " filename: " + this.filename);
  348 + }
  349 + else
  350 + {
  351 + System.Console.WriteLine("Could not create file: " + this.filename);
  352 + }
  353 + }
  354 +
  355 + return response1;
  356 + }
  357 +
  358 +
  359 +
  360 + public void deleteFile()
  361 + {
  362 + Helper.deleteFile(this.filename);
  363 +
  364 + if (this.local)
  365 + {
  366 + return;
  367 + }
  368 +
  369 + if (this.docId > 0)
  370 + {
  371 +
  372 + kt_response response = this.kt.delete_document(this.session, this.docId, "Delete - cleaning up");
  373 + if (this.verbose && response.status_code != 0)
  374 + {
  375 + System.Console.WriteLine("Could not delete file: " + this.filename);
  376 + }
  377 + }
  378 + }
  379 + }
  380 +
  381 +
  382 + public class Helper
  383 + {
  384 + public static bool isUnix()
  385 + {
  386 + // found reference on: http://www.mono-project.com/FAQ:_Technical
  387 + int platform = (int) Environment.OSVersion.Platform;
  388 + return (platform == 4) || (platform == 128);
  389 + }
  390 +
  391 + public static void writeFile(String filename, String text)
  392 + {
  393 + try
  394 + {
  395 + TextWriter tw = new StreamWriter(filename);
  396 + tw.WriteLine(text );
  397 + tw.Close();
  398 + }
  399 + catch (System.Exception exp)
  400 + {
  401 + System.Console.WriteLine("{0}", exp.Message);
  402 + throw;
  403 + }
  404 + }
  405 +
  406 + public static String readFile(String filename)
  407 + {
  408 + String text = null;
  409 + try
  410 + {
  411 + FileStream inFile = new FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
  412 + StreamReader sr = new StreamReader(inFile);
  413 + text = sr.ReadToEnd();
  414 + inFile.Close();
  415 + }
  416 + catch (System.Exception exp)
  417 + {
  418 + System.Console.WriteLine("{0}", exp.Message);
  419 + throw;
  420 + }
  421 +
  422 + return text;
  423 + }
  424 +
  425 + public static void deleteFile(string filename)
  426 + {
  427 + try
  428 + {
  429 + File.Delete(filename);
  430 + }
  431 + catch(System.Exception)
  432 + {
  433 + // we are using this to cleanup, so don't handle
  434 + }
  435 + }
  436 +
  437 + public static string ConvertFileToBase64Encoding(string filename)
  438 + {
  439 + System.IO.FileStream inFile;
  440 +
  441 + byte[] binaryData;
  442 + string base64String = "";
  443 +
  444 + try
  445 + {
  446 + inFile = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
  447 + binaryData = new Byte[inFile.Length];
  448 + inFile.Read(binaryData, 0, (int)inFile.Length);
  449 + inFile.Close();
  450 +
  451 + base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length);
  452 + }
  453 + catch (System.Exception exp)
  454 + {
  455 + System.Console.WriteLine("{0}", exp.Message);
  456 + throw;
  457 + }
  458 +
  459 + return base64String;
  460 + }
  461 +
  462 + public static long ConvertBase64EncodingToFile(String encoding, string filename)
  463 + {
  464 + System.IO.FileStream inFile;
  465 +
  466 + byte[] binaryData;
  467 +
  468 + try
  469 + {
  470 + binaryData = Convert.FromBase64String (encoding);
  471 +
  472 + inFile = new System.IO.FileStream(filename, System.IO.FileMode.Create);
  473 +
  474 + inFile.Write(binaryData, 0, (int)binaryData.Length);
  475 + inFile.Close();
  476 + }
  477 + catch (System.Exception exp)
  478 + {
  479 + System.Console.WriteLine("{0}", exp.Message);
  480 + throw;
  481 + }
  482 + return binaryData.Length;
  483 + }
  484 +
  485 + }
  486 +}
ktwebservice/nunit/inventory.txt 0 โ†’ 100644
  1 +authentication.cs
  2 +=================
  3 +*login
  4 +*logout
  5 +
  6 +document_add.cs
  7 +===============
  8 +
  9 +*add_base64_document
  10 +*delete_document
  11 +*delete_folder
  12 +*get_document_detail_by_name
  13 +*get_folder_detail_by_name
  14 +
  15 +document_checkout.cs
  16 +====================
  17 +
  18 +*checkin_base64_document
  19 +*checkout_base64_document
  20 +*undo_document_checkout
  21 +
  22 +document_detail.cs
  23 +==================
  24 +
  25 +*get_document_detail
  26 +*get_document_detail_by_name
  27 +
  28 +document_links.cs
  29 +=================
  30 +
  31 +*get_document_links
  32 +*link_documents
  33 +*unlink_documents
  34 +
  35 +document_owner.cs
  36 +=================
  37 +
  38 +*change_document_owner
  39 +
  40 +
  41 +document_type.cs
  42 +================
  43 +
  44 +*change_document_type
  45 +
  46 +document_history.cs
  47 +===================
  48 +
  49 +*get_document_version_history
  50 +*get_document_transaction_history
  51 +
  52 +document_rename.cs
  53 +==================
  54 +
  55 +*rename_document_filename
  56 +*rename_document_title
  57 +
  58 +document_workflow.cs
  59 +====================
  60 +
  61 +*start_document_workflow
  62 +*stop_document_workflow
  63 +*perform_document_workflow_transition
  64 +*get_document_workflow_transitions
  65 +
  66 +document_metadata.cs
  67 +====================
  68 +
  69 +*get_document_types
  70 +*get_document_type_metadata
  71 +*get_document_metadata
  72 +*update_document_metadata
  73 +
  74 +folder.cs
  75 +=========
  76 +
  77 +*get_folder_detail
  78 +*create_folder
  79 +*get_folder_detail_by_name
  80 +*get_folder_contents
  81 +*delete_folder
  82 +
  83 +document_system_metadata.cs
  84 +===========================
  85 +
  86 +*update_document_metadata
ktwebservice/nunit/makefile 0 โ†’ 100644
  1 +RESULTS= authentication.result document_detail.result document_contents.result document_history.result folder.result document_metadata.result document_add.result document_checkout.result document_type.result document_links.result document_owner.result document_rename.result document_workflow.result document_copy.result document_system_metadata.result document_download.result
  2 +PROXY=KTproxy.cs
  3 +WSDL=ktdms.wsdl
  4 +ROOT_URL=http://ktdms.trunk
  5 +WSDL_URL=${ROOT_URL}/ktwebservice/index.php?wsdl
  6 +
  7 +all: ${RESULTS}
  8 +
  9 +results: clean-results ${RESULTS}
  10 +
  11 +KTproxy.dll: KTproxy.cs helper.cs
  12 + mcs -r:System.Web.Services -r:System.Data.dll /target:library KTproxy.cs helper.cs
  13 +
  14 +KTproxy.cs: ktdms.wsdl
  15 + wsdl -out:${PROXY} ${WSDL}
  16 +
  17 +ktdms.wsdl:
  18 + curl ${WSDL_URL} > ${WSDL}
  19 +
  20 +clean:
  21 + rm -f *.dll *.exe ${WSDL} ${PROXY} TestResult.xml *.dll.mdb *.result
  22 +
  23 +clean-results:
  24 + rm -f ${RESULTS}
  25 +
  26 +%.dll: %.cs KTproxy.dll
  27 + mcs -r:System.Web.Services -r:nunit.framework /r:KTproxy.dll -debug /target:library -out:$@ $<
  28 +
  29 +%.result: %.dll
  30 + (export KT_ROOT_URL=${ROOT_URL}; nunit-console $<)
  31 + mv TestResult.xml $@
ktwebservice/nunit/query.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class QueryTest : KTTest
  9 + {
  10 +
  11 +
  12 + [SetUp]
  13 + public void SetUp()
  14 + {
  15 + }
  16 +
  17 + [TearDown]
  18 + public void TearDown()
  19 + {
  20 + }
  21 +
  22 + [Test]
  23 + public void Query()
  24 + {
  25 + Document doc = new Document(0,this._session, this._kt, false, false);
  26 + doc.createFile(1);
  27 + int filesize = doc.content.Length+1;
  28 + kt_search_response response = this._kt.search(this._session, "Filesize = \""+filesize+"\"", "");
  29 +
  30 + Assert.AreEqual(0,response.status_code);
  31 + Assert.AreEqual("n/a", response.hits[0].custom_document_no);
  32 + Assert.AreEqual("n/a", response.hits[0].oem_document_no);
  33 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
  34 + Assert.AreEqual(doc.title,response.hits[0].title);
  35 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  36 +
  37 + response = this._kt.search(this._session, "DocumentId = \""+ response.hits[0].document_id +"\"", "");
  38 +
  39 + Assert.AreEqual(0,response.status_code);
  40 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
  41 + Assert.AreEqual(doc.title,response.hits[0].title);
  42 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  43 +
  44 + response = this._kt.search(this._session, "Title = \""+ response.hits[0].title +"\"", "");
  45 +
  46 + Assert.AreEqual(0,response.status_code);
  47 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
  48 + Assert.AreEqual(doc.title,response.hits[0].title);
  49 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  50 +
  51 +
  52 + response = this._kt.search(this._session, "Filename = \""+ response.hits[0].filename +"\"", "");
  53 +
  54 + Assert.AreEqual(0,response.status_code);
  55 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
  56 + Assert.AreEqual(doc.title,response.hits[0].title);
  57 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  58 +
  59 + doc.deleteFile();
  60 + }
  61 + }
  62 +}
lib/documentmanagement/DocumentFieldLink.inc
@@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
33 require_once(KT_LIB_DIR . "/util/sanitize.inc"); 33 require_once(KT_LIB_DIR . "/util/sanitize.inc");
34 34
35 class DocumentFieldLink extends KTEntity { 35 class DocumentFieldLink extends KTEntity {
36 - 36 +
37 /** document field link primary key */ 37 /** document field link primary key */
38 var $iId; 38 var $iId;
39 /** primary key of document to which field is linked */ 39 /** primary key of document to which field is linked */
@@ -49,9 +49,9 @@ class DocumentFieldLink extends KTEntity { @@ -49,9 +49,9 @@ class DocumentFieldLink extends KTEntity {
49 'iDocumentFieldId' => 'document_field_id', 49 'iDocumentFieldId' => 'document_field_id',
50 'sValue' => 'value', 50 'sValue' => 'value',
51 ); 51 );
52 - 52 +
53 /** 53 /**
54 - * Default constructor 54 + * Default constructor
55 * 55 *
56 * @param Primary key of document to which field is linked 56 * @param Primary key of document to which field is linked
57 * @param Primary key of field to which document is linked 57 * @param Primary key of field to which document is linked
@@ -65,7 +65,7 @@ class DocumentFieldLink extends KTEntity { @@ -65,7 +65,7 @@ class DocumentFieldLink extends KTEntity {
65 $this->iDocumentFieldId = $iNewDocumentFieldId; 65 $this->iDocumentFieldId = $iNewDocumentFieldId;
66 $this->sValue = $sNewValue; 66 $this->sValue = $sNewValue;
67 } 67 }
68 - 68 +
69 /** 69 /**
70 * Get the document field link primary key 70 * Get the document field link primary key
71 * 71 *
@@ -75,7 +75,7 @@ class DocumentFieldLink extends KTEntity { @@ -75,7 +75,7 @@ class DocumentFieldLink extends KTEntity {
75 function getId() { 75 function getId() {
76 return $this->iId; 76 return $this->iId;
77 } 77 }
78 - 78 +
79 /** 79 /**
80 * Get the primary key of the document to which the field is linked 80 * Get the primary key of the document to which the field is linked
81 * 81 *
@@ -85,7 +85,7 @@ class DocumentFieldLink extends KTEntity { @@ -85,7 +85,7 @@ class DocumentFieldLink extends KTEntity {
85 function getMetadataVersionId() { 85 function getMetadataVersionId() {
86 return $this->iMetadataVersionId; 86 return $this->iMetadataVersionId;
87 } 87 }
88 - 88 +
89 /** 89 /**
90 * Set the primary key of the document to which the field is linked 90 * Set the primary key of the document to which the field is linked
91 * 91 *
@@ -95,7 +95,7 @@ class DocumentFieldLink extends KTEntity { @@ -95,7 +95,7 @@ class DocumentFieldLink extends KTEntity {
95 function setMetadataVersionId($iNewValue) { 95 function setMetadataVersionId($iNewValue) {
96 $this->iMetadataVersionId = $iNewValue; 96 $this->iMetadataVersionId = $iNewValue;
97 } 97 }
98 - 98 +
99 /** 99 /**
100 * Get the primary key of the field to which the document is linked 100 * Get the primary key of the field to which the document is linked
101 * 101 *
@@ -105,7 +105,7 @@ class DocumentFieldLink extends KTEntity { @@ -105,7 +105,7 @@ class DocumentFieldLink extends KTEntity {
105 function getDocumentFieldId() { 105 function getDocumentFieldId() {
106 return $this->iDocumentFieldId; 106 return $this->iDocumentFieldId;
107 } 107 }
108 - 108 +
109 /** 109 /**
110 * Set the primary key of the field to which the document is related 110 * Set the primary key of the field to which the document is related
111 * 111 *
@@ -115,7 +115,7 @@ class DocumentFieldLink extends KTEntity { @@ -115,7 +115,7 @@ class DocumentFieldLink extends KTEntity {
115 function setDocumentFieldId($iNewVale) { 115 function setDocumentFieldId($iNewVale) {
116 $this->iDocumentFieldId = $iNewValue; 116 $this->iDocumentFieldId = $iNewValue;
117 } 117 }
118 - 118 +
119 /** 119 /**
120 * Get the value of the field 120 * Get the value of the field
121 * 121 *
@@ -123,9 +123,9 @@ class DocumentFieldLink extends KTEntity { @@ -123,9 +123,9 @@ class DocumentFieldLink extends KTEntity {
123 * 123 *
124 */ 124 */
125 function getValue() { 125 function getValue() {
126 - return sanitizeForSQLtoHTML($this->sValue); 126 + return $this->sValue;
127 } 127 }
128 - 128 +
129 /** 129 /**
130 * Set the value of the field 130 * Set the value of the field
131 * 131 *
@@ -139,7 +139,7 @@ class DocumentFieldLink extends KTEntity { @@ -139,7 +139,7 @@ class DocumentFieldLink extends KTEntity {
139 function _table () { 139 function _table () {
140 return KTUtil::getTableName('document_fields_link'); 140 return KTUtil::getTableName('document_fields_link');
141 } 141 }
142 - 142 +
143 /** 143 /**
144 * 144 *
145 * Static function. Given a document fields link primary key will create 145 * Static function. Given a document fields link primary key will create
lib/documentmanagement/documentutil.inc.php
@@ -106,7 +106,7 @@ class KTDocumentUtil { @@ -106,7 +106,7 @@ class KTDocumentUtil {
106 } 106 }
107 107
108 // create the document transaction record 108 // create the document transaction record
109 - $oDocumentTransaction = & new DocumentTransaction($oDocument, $sCheckInComment, 'ktcore.transactions.check_in'); 109 + $oDocumentTransaction = new DocumentTransaction($oDocument, $sCheckInComment, 'ktcore.transactions.check_in');
110 $oDocumentTransaction->create(); 110 $oDocumentTransaction->create();
111 111
112 $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); 112 $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
@@ -122,6 +122,11 @@ class KTDocumentUtil { @@ -122,6 +122,11 @@ class KTDocumentUtil {
122 } 122 }
123 } 123 }
124 124
  125 + // NEW SEARCH
  126 +
  127 + Indexer::index($oDocument);
  128 +
  129 + /*
125 $aTriggers = $oKTTriggerRegistry->getTriggers('content', 'transform'); 130 $aTriggers = $oKTTriggerRegistry->getTriggers('content', 'transform');
126 foreach ($aTriggers as $aTrigger) { 131 foreach ($aTriggers as $aTrigger) {
127 $sTrigger = $aTrigger[0]; 132 $sTrigger = $aTrigger[0];
@@ -132,6 +137,7 @@ class KTDocumentUtil { @@ -132,6 +137,7 @@ class KTDocumentUtil {
132 $oTrigger->setDocument($oDocument); 137 $oTrigger->setDocument($oDocument);
133 $oTrigger->transform(); 138 $oTrigger->transform();
134 } 139 }
  140 + */
135 141
136 // fire subscription alerts for the checked in document 142 // fire subscription alerts for the checked in document
137 $oSubscriptionEvent = new SubscriptionEvent(); 143 $oSubscriptionEvent = new SubscriptionEvent();
@@ -169,10 +175,10 @@ class KTDocumentUtil { @@ -169,10 +175,10 @@ class KTDocumentUtil {
169 } 175 }
170 } 176 }
171 177
172 - $oDocumentTransaction = & new DocumentTransaction($oDocument, $sCheckoutComment, 'ktcore.transactions.check_out'); 178 + $oDocumentTransaction = new DocumentTransaction($oDocument, $sCheckoutComment, 'ktcore.transactions.check_out');
173 $oDocumentTransaction->create(); 179 $oDocumentTransaction->create();
174 180
175 - // fire subscription alerts for the checked in document 181 + // fire subscription alerts for the downloaded document
176 $oSubscriptionEvent = new SubscriptionEvent(); 182 $oSubscriptionEvent = new SubscriptionEvent();
177 $oFolder = Folder::get($oDocument->getFolderID()); 183 $oFolder = Folder::get($oDocument->getFolderID());
178 $oSubscriptionEvent->CheckOutDocument($oDocument, $oFolder); 184 $oSubscriptionEvent->CheckOutDocument($oDocument, $oFolder);
@@ -180,6 +186,45 @@ class KTDocumentUtil { @@ -180,6 +186,45 @@ class KTDocumentUtil {
180 return true; 186 return true;
181 } 187 }
182 188
  189 + function archive($oDocument, $sReason) {
  190 +
  191 + $this->startTransaction();
  192 + $oDocument->setStatusID(ARCHIVED);
  193 + $res = $oDocument->update();
  194 +
  195 + if (PEAR::isError($res) || ($res === false)) {
  196 + return PEAR::raiseError(_kt('There was a database error while trying to archive this file'));
  197 + }
  198 +
  199 + $oDocumentTransaction = & new DocumentTransaction($oDocument, sprintf(_kt('Document archived: %s'), $sReason), 'ktcore.transactions.update');
  200 + $oDocumentTransaction->create();
  201 +
  202 + $this->commitTransaction();
  203 +
  204 + $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
  205 + $aTriggers = $oKTTriggerRegistry->getTriggers('archive', 'postValidate');
  206 + foreach ($aTriggers as $aTrigger) {
  207 + $sTrigger = $aTrigger[0];
  208 + $oTrigger = new $sTrigger;
  209 + $aInfo = array(
  210 + 'document' => $oDocument,
  211 + );
  212 + $oTrigger->setInfo($aInfo);
  213 + $ret = $oTrigger->postValidate();
  214 + if (PEAR::isError($ret)) {
  215 + $oDocument->delete();
  216 + return $ret;
  217 + }
  218 + }
  219 +
  220 + // fire subscription alerts for the archived document
  221 + $oSubscriptionEvent = new SubscriptionEvent();
  222 + $oFolder = Folder::get($oDocument->getFolderID());
  223 + $oSubscriptionEvent->ArchivedDocument($oDocument, $oFolder);
  224 +
  225 + return true;
  226 + }
  227 +
183 function &_add($oFolder, $sFilename, $oUser, $aOptions) { 228 function &_add($oFolder, $sFilename, $oUser, $aOptions) {
184 global $default; 229 global $default;
185 230
@@ -204,9 +249,6 @@ class KTDocumentUtil { @@ -204,9 +249,6 @@ class KTDocumentUtil {
204 'creatorid' => $oUser->getID(), 249 'creatorid' => $oUser->getID(),
205 'documenttypeid' => $iDocumentTypeId, 250 'documenttypeid' => $iDocumentTypeId,
206 )); 251 ));
207 - if (PEAR::isError($oDocument)) {  
208 - return $oDocument;  
209 - }  
210 252
211 // if (is_null($oContents)) { 253 // if (is_null($oContents)) {
212 // $res = KTDocumentUtil::setIncomplete($oDocument, 'contents'); 254 // $res = KTDocumentUtil::setIncomplete($oDocument, 'contents');
@@ -244,6 +286,81 @@ class KTDocumentUtil { @@ -244,6 +286,81 @@ class KTDocumentUtil {
244 return $oDocument; 286 return $oDocument;
245 } 287 }
246 288
  289 + // Overwrite the document
  290 + function overwrite($oDocument, $sFilename, $sTempFileName, $oUser, $aOptions) {
  291 + //$oDocument, $sFilename, $sCheckInComment, $oUser, $aOptions = false
  292 + $oStorage =& KTStorageManagerUtil::getSingleton();
  293 + $iFileSize = filesize($sTempFileName);
  294 +
  295 + // Check that document is not checked out
  296 + if($oDocument->getIsCheckedOut()) {
  297 + return PEAR::raiseError(_kt('Document is checkout and cannot be overwritten'));
  298 + }
  299 +
  300 + if (!$oStorage->upload($oDocument, $sTempFileName)) {
  301 + return PEAR::raiseError(_kt('An error occurred while storing the new file'));
  302 + }
  303 +
  304 + $oDocument->setLastModifiedDate(getCurrentDateTime());
  305 + $oDocument->setModifiedUserId($oUser->getId());
  306 +
  307 + $oDocument->setFileSize($iFileSize);
  308 +
  309 + $sOriginalFilename = $oDocument->getFileName();
  310 +
  311 + if($sOriginalFilename != $sFilename){
  312 + if(strlen($sFilename)) {
  313 + global $default;
  314 + $oDocument->setFileName($sFilename);
  315 + $default->log->info('renamed document ' . $oDocument->getId() . ' to ' . $sFilename);
  316 + }
  317 + $oDocument->setMinorVersionNumber($oDocument->getMinorVersionNumber()+1);
  318 + }
  319 +
  320 + $sType = KTMime::getMimeTypeFromFile($sFilename);
  321 + $iMimeTypeId = KTMime::getMimeTypeID($sType, $oDocument->getFileName());
  322 + $oDocument->setMimeTypeId($iMimeTypeId);
  323 +
  324 + $bSuccess = $oDocument->update();
  325 + if ($bSuccess !== true) {
  326 + if (PEAR::isError($bSuccess)) {
  327 + return $bSuccess;
  328 + }
  329 + return PEAR::raiseError(_kt('An error occurred while storing this document in the database'));
  330 + }
  331 +/*
  332 + // create the document transaction record
  333 + $oDocumentTransaction = new DocumentTransaction($oDocument, $sCheckInComment, 'ktcore.transactions.check_in');
  334 + $oDocumentTransaction->create();
  335 +
  336 + $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
  337 + $aTriggers = $oKTTriggerRegistry->getTriggers('content', 'scan');
  338 + foreach ($aTriggers as $aTrigger) {
  339 + $sTrigger = $aTrigger[0];
  340 + $oTrigger = new $sTrigger;
  341 + $oTrigger->setDocument($oDocument);
  342 + $ret = $oTrigger->scan();
  343 + if (PEAR::isError($ret)) {
  344 + $oDocument->delete();
  345 + return $ret;
  346 + }
  347 + }
  348 +
  349 + // NEW SEARCH
  350 +
  351 + Indexer::index($oDocument);
  352 +
  353 +
  354 + // fire subscription alerts for the checked in document
  355 + $oSubscriptionEvent = new SubscriptionEvent();
  356 + $oFolder = Folder::get($oDocument->getFolderID());
  357 + $oSubscriptionEvent->CheckinDocument($oDocument, $oFolder);
  358 +
  359 + KTDocumentUtil::updateSearchableText($oDocument);
  360 +*/
  361 + return true;
  362 + }
  363 +
247 // {{{ validateMetadata 364 // {{{ validateMetadata
248 function validateMetadata(&$oDocument, $aMetadata) { 365 function validateMetadata(&$oDocument, $aMetadata) {
249 $aFieldsets =& KTFieldset::getGenericFieldsets(); 366 $aFieldsets =& KTFieldset::getGenericFieldsets();
@@ -425,34 +542,15 @@ class KTDocumentUtil { @@ -425,34 +542,15 @@ class KTDocumentUtil {
425 // {{{ _in_add 542 // {{{ _in_add
426 function &_in_add($oFolder, $sFilename, $oUser, $aOptions) { 543 function &_in_add($oFolder, $sFilename, $oUser, $aOptions) {
427 $aOrigOptions = $aOptions; 544 $aOrigOptions = $aOptions;
428 - if (KTDocumentUtil::fileExists($oFolder, $sFilename)) {  
429 - $oDoc = Document::getByFilenameAndFolder($sFilename, $oFolder->getId());  
430 - if (PEAR::isError($oDoc)) {  
431 - return PEAR::raiseError(_kt('Document with that filename already exists in this folder, and appears to be invalid. Please contact the system administrator.'));  
432 - } else {  
433 - if ($oDoc->getStatusID() != LIVE) {  
434 - $sError = _kt('Document with that filename already exists in this folder, but it has been archived or deleted and is still available for restoration. To prevent it being overwritten, you are not allowed to add a document with the same title or filename.');  
435 - } else {  
436 - $sError = _kt('Document with that filename already exists in this folder.');  
437 - }  
438 -  
439 - $sError .= _kt(' Document') . ': ' . $oDoc->getName() . ' (ID:' . $oDoc->getId() . ')';  
440 - return PEAR::raiseError($sError);  
441 - } 545 + while(KTDocumentUtil::fileExists($oFolder, $sFilename)) {
  546 + $oDoc = Document::getByFilenameAndFolder($sFilename, $oFolder->getId());
  547 + $sFilename = KTDocumentUtil::generateNewDocumentFilename($oDoc->getFileName());
442 } 548 }
443 $sName = KTUtil::arrayGet($aOptions, 'description', $sFilename); 549 $sName = KTUtil::arrayGet($aOptions, 'description', $sFilename);
444 - if (KTDocumentUtil::nameExists($oFolder, $sName)) {  
445 - $oDoc = Document::getByNameAndFolder($sName, $oFolder->getId());  
446 - if (PEAR::isError($oDoc)) {  
447 - return PEAR::raiseError(_kt('Document with that title already exists in this folder, and appears to be invalid. Please contact the system administrator.'));  
448 - } else {  
449 - if ($oDoc->getStatusID != LIVE) {  
450 - return PEAR::raiseError(_kt('Document with that title already exists in this folder, but it has been archived or deleted and is still available for restoration. To prevent it being overwritten, you are not allowed to add a document with the same title or filename.'));  
451 - } else {  
452 - return PEAR::raiseError(_kt('Document with that title already exists in this folder.'));  
453 - }  
454 - }  
455 - 550 + while(KTDocumentUtil::nameExists($oFolder, $sName)) {
  551 + $oDoc = Document::getByNameAndFolder($sName, $oFolder->getId());
  552 + $aOptions['description'] = KTDocumentUtil::generateNewDocumentName($oDoc->getName());
  553 + $sName = KTDocumentUtil::generateNewDocumentName($oDoc->getName());
456 } 554 }
457 555
458 $oUploadChannel =& KTUploadChannel::getSingleton(); 556 $oUploadChannel =& KTUploadChannel::getSingleton();
@@ -479,6 +577,10 @@ class KTDocumentUtil { @@ -479,6 +577,10 @@ class KTDocumentUtil {
479 } 577 }
480 } 578 }
481 579
  580 + // NEW SEARCH
  581 +
  582 + Indexer::index($oDocument);
  583 + /*
482 $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('Transforming file'))); 584 $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('Transforming file')));
483 $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); 585 $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
484 $aTriggers = $oKTTriggerRegistry->getTriggers('content', 'transform'); 586 $aTriggers = $oKTTriggerRegistry->getTriggers('content', 'transform');
@@ -491,12 +593,12 @@ class KTDocumentUtil { @@ -491,12 +593,12 @@ class KTDocumentUtil {
491 $oTrigger->setDocument($oDocument); 593 $oTrigger->setDocument($oDocument);
492 // $oUploadChannel->sendMessage(new KTUploadGenericMessage(sprintf(_kt(" (trigger %s)"), $sTrigger))); 594 // $oUploadChannel->sendMessage(new KTUploadGenericMessage(sprintf(_kt(" (trigger %s)"), $sTrigger)));
493 $oTrigger->transform(); 595 $oTrigger->transform();
494 - } 596 + }*/
495 597
496 // $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('Creating transaction'))); 598 // $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('Creating transaction')));
497 $aOptions = array('user' => $oUser); 599 $aOptions = array('user' => $oUser);
498 //create the document transaction record 600 //create the document transaction record
499 - $oDocumentTransaction = & new DocumentTransaction($oDocument, _kt('Document created'), 'ktcore.transactions.create', $aOptions); 601 + $oDocumentTransaction = new DocumentTransaction($oDocument, _kt('Document created'), 'ktcore.transactions.create', $aOptions);
500 $res = $oDocumentTransaction->create(); 602 $res = $oDocumentTransaction->create();
501 if (PEAR::isError($res)) { 603 if (PEAR::isError($res)) {
502 $oDocument->delete(); 604 $oDocument->delete();
@@ -531,6 +633,45 @@ class KTDocumentUtil { @@ -531,6 +633,45 @@ class KTDocumentUtil {
531 } 633 }
532 // }}} 634 // }}}
533 635
  636 + function generateNewDocumentFilename($sDocFilename){
  637 + if(preg_match("/\([0-9]+\)(\.[^\.]+){1,}$/", $sDocFilename)){
  638 + preg_match("/\([0-9]+\)\./", $sDocFilename, $matches);
  639 + $new_one = substr($matches[0], 1);
  640 + $new_two = explode(')', $new_one);
  641 + $new = $new_two[0]+1;
  642 +
  643 + $pattern[0] = '/\([0-9]+\)\./';
  644 + $replacement[0] = ' ('.$new.').';
  645 + $sFilename = preg_replace($pattern, $replacement, $sDocFilename);
  646 + }else{
  647 + $matches = explode('.', $sDocFilename);
  648 + $prefix = $matches[0].' (2)';
  649 + for($i = 1; $i < count($matches); $i++ ){
  650 + $suffix .= '.'.$matches[$i];
  651 + }
  652 + $sFilename = $prefix.$suffix;
  653 + }
  654 +
  655 + return $sFilename;
  656 + }
  657 +
  658 + function generateNewDocumentName($sDocName){
  659 + if(preg_match("/\([0-9]+\)$/", $sDocName)){
  660 + preg_match("/\([0-9]+\)$/", $sDocName, $matches);
  661 + $new_one = substr($matches[0], 1);
  662 + $new_two = explode(')', $new_one);
  663 + $new = $new_two[0]+1;
  664 +
  665 + $pattern[0] = '/\([0-9]+\)$/';
  666 + $replacement[0] = '('.$new.')';
  667 + $sName = preg_replace($pattern, $replacement, $sDocName);
  668 + }else{
  669 + $sName = $sDocName.' (2)';
  670 + }
  671 +
  672 + return $sName;
  673 + }
  674 +
534 // {{{ fileExists 675 // {{{ fileExists
535 function fileExists($oFolder, $sFilename) { 676 function fileExists($oFolder, $sFilename) {
536 return Document::fileExists($sFilename, $oFolder->getID()); 677 return Document::fileExists($sFilename, $oFolder->getID());
@@ -571,7 +712,7 @@ class KTDocumentUtil { @@ -571,7 +712,7 @@ class KTDocumentUtil {
571 $iMimeTypeId = KTMime::getMimeTypeID($sType, $oDocument->getFileName()); 712 $iMimeTypeId = KTMime::getMimeTypeID($sType, $oDocument->getFileName());
572 $oDocument->setMimeTypeId($iMimeTypeId); 713 $oDocument->setMimeTypeId($iMimeTypeId);
573 714
574 - $res = $oStorage->upload($oDocument, $sFilename); 715 + $res = $oStorage->upload($oDocument, $sFilename, $aOptions);
575 if ($res === false) { 716 if ($res === false) {
576 return PEAR::raiseError(sprintf(_kt("Couldn't store contents: %s"), _kt('No reason given'))); 717 return PEAR::raiseError(sprintf(_kt("Couldn't store contents: %s"), _kt('No reason given')));
577 } 718 }
@@ -590,6 +731,11 @@ class KTDocumentUtil { @@ -590,6 +731,11 @@ class KTDocumentUtil {
590 731
591 // {{{ updateTransactionText 732 // {{{ updateTransactionText
592 function updateTransactionText($oDocument) { 733 function updateTransactionText($oDocument) {
  734 +
  735 + // NEW SEARCH
  736 +
  737 + return;
  738 +
593 $iDocumentId = KTUtil::getId($oDocument); 739 $iDocumentId = KTUtil::getId($oDocument);
594 $aTransactions = DocumentTransaction::getByDocument($iDocumentId); 740 $aTransactions = DocumentTransaction::getByDocument($iDocumentId);
595 foreach ($aTransactions as $oTransaction) { 741 foreach ($aTransactions as $oTransaction) {
@@ -612,6 +758,10 @@ class KTDocumentUtil { @@ -612,6 +758,10 @@ class KTDocumentUtil {
612 758
613 // {{{ updateSearchableText 759 // {{{ updateSearchableText
614 function updateSearchableText($oDocument, $bOverride = false) { 760 function updateSearchableText($oDocument, $bOverride = false) {
  761 +
  762 + // NEW SEARCH
  763 + return;
  764 +
615 if (isset($GLOBALS['_IN_ADD']) && empty($bOverride)) { 765 if (isset($GLOBALS['_IN_ADD']) && empty($bOverride)) {
616 return; 766 return;
617 } 767 }
@@ -716,7 +866,7 @@ class KTDocumentUtil { @@ -716,7 +866,7 @@ class KTDocumentUtil {
716 return PEAR::raiseError(_kt('There was a problem deleting the document from storage.')); 866 return PEAR::raiseError(_kt('There was a problem deleting the document from storage.'));
717 } 867 }
718 868
719 - $oDocumentTransaction = & new DocumentTransaction($oDocument, _kt('Document deleted: ') . $sReason, 'ktcore.transactions.delete'); 869 + $oDocumentTransaction = new DocumentTransaction($oDocument, _kt('Document deleted: ') . $sReason, 'ktcore.transactions.delete');
720 $oDocumentTransaction->create(); 870 $oDocumentTransaction->create();
721 871
722 $oDocument->setFolderID(1); 872 $oDocument->setFolderID(1);
@@ -752,6 +902,14 @@ class KTDocumentUtil { @@ -752,6 +902,14 @@ class KTDocumentUtil {
752 // }}} 902 // }}}
753 903
754 function reindexDocument($oDocument) { 904 function reindexDocument($oDocument) {
  905 +
  906 + // NEW SEARCH
  907 +
  908 + Indexer::index($oDocument);
  909 +
  910 + return;
  911 +
  912 + /*
755 $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); 913 $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
756 $aTriggers = $oKTTriggerRegistry->getTriggers('content', 'transform'); 914 $aTriggers = $oKTTriggerRegistry->getTriggers('content', 'transform');
757 foreach ($aTriggers as $aTrigger) { 915 foreach ($aTriggers as $aTrigger) {
@@ -763,7 +921,7 @@ class KTDocumentUtil { @@ -763,7 +921,7 @@ class KTDocumentUtil {
763 $oTrigger->setDocument($oDocument); 921 $oTrigger->setDocument($oDocument);
764 $oTrigger->transform(); 922 $oTrigger->transform();
765 } 923 }
766 - KTDocumentUtil::updateSearchableText($oDocument); 924 + KTDocumentUtil::updateSearchableText($oDocument);*/
767 } 925 }
768 926
769 927
@@ -778,7 +936,7 @@ class KTDocumentUtil { @@ -778,7 +936,7 @@ class KTDocumentUtil {
778 } 936 }
779 937
780 938
781 - function copy($oDocument, $oDestinationFolder, $sReason = null) { 939 + function copy($oDocument, $oDestinationFolder, $sReason = null, $sDestinationDocName = null) {
782 // 1. generate a new triad of content, metadata and core objects. 940 // 1. generate a new triad of content, metadata and core objects.
783 // 2. update the storage path. 941 // 2. update the storage path.
784 //print '--------------------------------- BEFORE'; 942 //print '--------------------------------- BEFORE';
@@ -797,23 +955,36 @@ class KTDocumentUtil { @@ -797,23 +955,36 @@ class KTDocumentUtil {
797 // we still have a bogus md_version, but integrity holds, so fix it now. 955 // we still have a bogus md_version, but integrity holds, so fix it now.
798 $oCore = KTDocumentCore::get($id); 956 $oCore = KTDocumentCore::get($id);
799 957
  958 + // Get the metadata version for the source document
800 $sTable = KTUtil::getTableName('document_metadata_version'); 959 $sTable = KTUtil::getTableName('document_metadata_version');
801 $sQuery = 'SELECT * FROM ' . $sTable . ' WHERE id = ?'; 960 $sQuery = 'SELECT * FROM ' . $sTable . ' WHERE id = ?';
802 $aParams = array($oDocument->getMetadataVersionId()); 961 $aParams = array($oDocument->getMetadataVersionId());
803 $aMDRow = DBUtil::getOneResult(array($sQuery, $aParams)); 962 $aMDRow = DBUtil::getOneResult(array($sQuery, $aParams));
804 unset($aMDRow['id']); 963 unset($aMDRow['id']);
  964 +
  965 + // Copy the source metadata into the destination document
805 $aMDRow['document_id'] = $oCore->getId(); 966 $aMDRow['document_id'] = $oCore->getId();
  967 + if(!empty($sDestinationDocName)){
  968 + $aMDRow['name'] = $sDestinationDocName;
  969 + $aMDRow['description'] = $sDestinationDocName;
  970 + }
806 $id = DBUtil::autoInsert($sTable, $aMDRow); 971 $id = DBUtil::autoInsert($sTable, $aMDRow);
807 if (PEAR::isError($id)) { return $id; } 972 if (PEAR::isError($id)) { return $id; }
808 $oCore->setMetadataVersionId($id); 973 $oCore->setMetadataVersionId($id);
809 $oMDV = KTDocumentMetadataVersion::get($id); 974 $oMDV = KTDocumentMetadataVersion::get($id);
810 975
  976 + // Get the content version for the source document
811 $sTable = KTUtil::getTableName('document_content_version'); 977 $sTable = KTUtil::getTableName('document_content_version');
812 $sQuery = 'SELECT * FROM ' . $sTable . ' WHERE id = ?'; 978 $sQuery = 'SELECT * FROM ' . $sTable . ' WHERE id = ?';
813 $aParams = array($oDocument->_oDocumentContentVersion->getId()); 979 $aParams = array($oDocument->_oDocumentContentVersion->getId());
814 $aContentRow = DBUtil::getOneResult(array($sQuery, $aParams)); 980 $aContentRow = DBUtil::getOneResult(array($sQuery, $aParams));
815 unset($aContentRow['id']); 981 unset($aContentRow['id']);
  982 +
  983 + // Copy the source content into the destination document
816 $aContentRow['document_id'] = $oCore->getId(); 984 $aContentRow['document_id'] = $oCore->getId();
  985 + if(!empty($sDestinationDocName)){
  986 + $aContentRow['filename'] = $sDestinationDocName;
  987 + }
817 $id = DBUtil::autoInsert($sTable, $aContentRow); 988 $id = DBUtil::autoInsert($sTable, $aContentRow);
818 if (PEAR::isError($id)) { return $id; } 989 if (PEAR::isError($id)) { return $id; }
819 $oMDV->setContentVersionId($id); 990 $oMDV->setContentVersionId($id);
@@ -835,6 +1006,10 @@ class KTDocumentUtil { @@ -835,6 +1006,10 @@ class KTDocumentUtil {
835 $res = KTDocumentUtil::copyMetadata($oNewDocument, $oDocument->getMetadataVersionId()); 1006 $res = KTDocumentUtil::copyMetadata($oNewDocument, $oDocument->getMetadataVersionId());
836 if (PEAR::isError($res)) { return $res; } 1007 if (PEAR::isError($res)) { return $res; }
837 1008
  1009 + // Ensure the copied document is not checked out
  1010 + $oNewDocument->setIsCheckedOut(false);
  1011 + $oNewDocument->setCheckedOutUserID(-1);
  1012 +
838 // finally, copy the actual file. 1013 // finally, copy the actual file.
839 $oStorage =& KTStorageManagerUtil::getSingleton(); 1014 $oStorage =& KTStorageManagerUtil::getSingleton();
840 $res = $oStorage->copy($oDocument, $oNewDocument); 1015 $res = $oStorage->copy($oDocument, $oNewDocument);
@@ -851,6 +1026,11 @@ class KTDocumentUtil { @@ -851,6 +1026,11 @@ class KTDocumentUtil {
851 $res = $oNewDocument->update(); 1026 $res = $oNewDocument->update();
852 if (PEAR::isError($res)) { return $res; } 1027 if (PEAR::isError($res)) { return $res; }
853 1028
  1029 + // NEW SEARCH
  1030 +
  1031 +
  1032 + /*
  1033 +
854 $sTable = KTUtil::getTableName('document_text'); 1034 $sTable = KTUtil::getTableName('document_text');
855 $aQuery = array("SELECT document_text FROM $sTable WHERE document_id = ?", array($oDocument->getId())); 1035 $aQuery = array("SELECT document_text FROM $sTable WHERE document_id = ?", array($oDocument->getId()));
856 $sData = DBUtil::getOneResultKey($aQuery, 'document_text'); 1036 $sData = DBUtil::getOneResultKey($aQuery, 'document_text');
@@ -860,6 +1040,8 @@ class KTDocumentUtil { @@ -860,6 +1040,8 @@ class KTDocumentUtil {
860 'document_text' => $contents, 1040 'document_text' => $contents,
861 ); 1041 );
862 DBUtil::autoInsert($sTable, $aInsertValues, array('noid' => true)); 1042 DBUtil::autoInsert($sTable, $aInsertValues, array('noid' => true));
  1043 +
  1044 + */
863 KTDocumentUtil::updateSearchableText($oNewDocument); 1045 KTDocumentUtil::updateSearchableText($oNewDocument);
864 KTPermissionUtil::updatePermissionLookup($oNewDocument); 1046 KTPermissionUtil::updatePermissionLookup($oNewDocument);
865 1047
@@ -867,14 +1049,36 @@ class KTDocumentUtil { @@ -867,14 +1049,36 @@ class KTDocumentUtil {
867 $sReason = ''; 1049 $sReason = '';
868 } 1050 }
869 1051
870 -  
871 - $oDocumentTransaction = & new DocumentTransaction($oDocument, sprintf(_kt("Copied to folder \"%s\". %s"), $oDestinationFolder->getName(), $sReason), 'ktcore.transactions.copy'); 1052 + $oDocumentTransaction = new DocumentTransaction($oDocument, sprintf(_kt("Copied to folder \"%s\". %s"), $oDestinationFolder->getName(), $sReason), 'ktcore.transactions.copy');
872 $oDocumentTransaction->create(); 1053 $oDocumentTransaction->create();
873 1054
874 $oSrcFolder = Folder::get($oDocument->getFolderID()); 1055 $oSrcFolder = Folder::get($oDocument->getFolderID());
875 - $oDocumentTransaction = & new DocumentTransaction($oNewDocument, sprintf(_kt("Copied from original in folder \"%s\". %s"), $oSrcFolder->getName(), $sReason), 'ktcore.transactions.copy'); 1056 + $oDocumentTransaction = new DocumentTransaction($oNewDocument, sprintf(_kt("Copied from original in folder \"%s\". %s"), $oSrcFolder->getName(), $sReason), 'ktcore.transactions.copy');
876 $oDocumentTransaction->create(); 1057 $oDocumentTransaction->create();
877 1058
  1059 +
  1060 + $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
  1061 + $aTriggers = $oKTTriggerRegistry->getTriggers('copyDocument', 'postValidate');
  1062 + foreach ($aTriggers as $aTrigger) {
  1063 + $sTrigger = $aTrigger[0];
  1064 + $oTrigger = new $sTrigger;
  1065 + $aInfo = array(
  1066 + 'document' => $oNewDocument,
  1067 + 'old_folder' => $oSrcFolder,
  1068 + 'new_folder' => $oDestinationFolder,
  1069 + );
  1070 + $oTrigger->setInfo($aInfo);
  1071 + $ret = $oTrigger->postValidate();
  1072 + if (PEAR::isError($ret)) {
  1073 + return $ret;
  1074 + }
  1075 + }
  1076 +
  1077 + // fire subscription alerts for the copied document
  1078 + $oSubscriptionEvent = new SubscriptionEvent();
  1079 + $oFolder = Folder::get($oDocument->getFolderID());
  1080 + $oSubscriptionEvent->MoveDocument($oDocument, $oDestinationFolder, $oSrcFolder, 'CopiedDocument');
  1081 +
878 return $oNewDocument; 1082 return $oNewDocument;
879 } 1083 }
880 1084
@@ -907,7 +1111,7 @@ class KTDocumentUtil { @@ -907,7 +1111,7 @@ class KTDocumentUtil {
907 } 1111 }
908 1112
909 // create the document transaction record 1113 // create the document transaction record
910 - $oDocumentTransaction = & new DocumentTransaction($oDocument, _kt('Document renamed'), 'ktcore.transactions.update'); 1114 + $oDocumentTransaction = new DocumentTransaction($oDocument, _kt('Document renamed'), 'ktcore.transactions.update');
911 $oDocumentTransaction->create(); 1115 $oDocumentTransaction->create();
912 1116
913 // fire subscription alerts for the checked in document 1117 // fire subscription alerts for the checked in document
@@ -959,7 +1163,7 @@ class KTDocumentUtil { @@ -959,7 +1163,7 @@ class KTDocumentUtil {
959 1163
960 // create the document transaction record 1164 // create the document transaction record
961 1165
962 - $oDocumentTransaction = & new DocumentTransaction($oDocument, $sMoveMessage, 'ktcore.transactions.move'); 1166 + $oDocumentTransaction = new DocumentTransaction($oDocument, $sMoveMessage, 'ktcore.transactions.move');
963 $oDocumentTransaction->create(); 1167 $oDocumentTransaction->create();
964 1168
965 1169
@@ -980,15 +1184,79 @@ class KTDocumentUtil { @@ -980,15 +1184,79 @@ class KTDocumentUtil {
980 } 1184 }
981 } 1185 }
982 1186
  1187 + // fire subscription alerts for the moved document
  1188 + $oSubscriptionEvent = new SubscriptionEvent();
  1189 + $oSubscriptionEvent->MoveDocument($oDocument, $oFolder, $oOriginalFolder);
  1190 +
983 return KTPermissionUtil::updatePermissionLookup($oDocument); 1191 return KTPermissionUtil::updatePermissionLookup($oDocument);
984 } 1192 }
985 1193
  1194 + /**
  1195 + * Delete a selected version of the document.
  1196 + */
  1197 + function deleteVersion($oDocument, $iVersionID, $sReason){
  1198 +
  1199 + $oDocument =& KTUtil::getObject('Document', $oDocument);
  1200 + $oVersion =& KTDocumentMetadataVersion::get($iVersionID);
  1201 +
  1202 + $oStorageManager =& KTStorageManagerUtil::getSingleton();
  1203 +
  1204 + global $default;
  1205 +
  1206 + if (empty($sReason)) {
  1207 + return PEAR::raiseError(_kt('Deletion requires a reason'));
  1208 + }
  1209 +
  1210 + if (PEAR::isError($oDocument) || ($oDocument == false)) {
  1211 + return PEAR::raiseError(_kt('Invalid document object.'));
  1212 + }
  1213 +
  1214 + if (PEAR::isError($oVersion) || ($oVersion == false)) {
  1215 + return PEAR::raiseError(_kt('Invalid document version object.'));
  1216 + }
  1217 +
  1218 + $iContentId = $oVersion->getContentVersionId();
  1219 + $oContentVersion = KTDocumentContentVersion::get($iContentId);
  1220 +
  1221 + if (PEAR::isError($oContentVersion) || ($oContentVersion == false)) {
  1222 + DBUtil::rollback();
  1223 + return PEAR::raiseError(_kt('Invalid document content version object.'));
  1224 + }
  1225 +
  1226 + DBUtil::startTransaction();
  1227 +
  1228 + // now delete the document version
  1229 + $res = $oStorageManager->deleteVersion($oVersion);
  1230 + if (PEAR::isError($res) || ($res == false)) {
  1231 + //could not delete the document version from the file system
  1232 + $default->log->error('Deletion: Filesystem error deleting the metadata version ' .
  1233 + $oVersion->getMetadataVersion() . ' of the document ' .
  1234 + $oDocument->getFileName() . ' from folder ' .
  1235 + Folder::getFolderPath($oDocument->getFolderID()) .
  1236 + ' id=' . $oDocument->getFolderID());
  1237 +
  1238 + // we use a _real_ transaction here ...
  1239 +
  1240 + DBUtil::rollback();
  1241 +
  1242 + return PEAR::raiseError(_kt('There was a problem deleting the document from storage.'));
  1243 + }
  1244 +
  1245 + // change status for the metadata version
  1246 + $oVersion->setStatusId(VERSION_DELETED);
  1247 + $oVersion->update();
  1248 +
  1249 + // set the storage path to empty
  1250 +// $oContentVersion->setStoragePath('');
  1251 +
  1252 + DBUtil::commit();
  1253 + }
986 } 1254 }
987 1255
988 class KTMetadataValidationError extends PEAR_Error { 1256 class KTMetadataValidationError extends PEAR_Error {
989 function KTMetadataValidationError ($aFailed) { 1257 function KTMetadataValidationError ($aFailed) {
990 $this->aFailed = $aFailed; 1258 $this->aFailed = $aFailed;
991 - $message = _kt('Validation Failed'); 1259 + $message = _kt('Please be sure to enter information for all the Required fields below');
992 parent::PEAR_Error($message); 1260 parent::PEAR_Error($message);
993 } 1261 }
994 } 1262 }
lib/util/sanitize.inc
@@ -51,13 +51,13 @@ function sanitize($string) { @@ -51,13 +51,13 @@ function sanitize($string) {
51 } 51 }
52 52
53 function sanitizeForSQL($string, $min='', $max='') { 53 function sanitizeForSQL($string, $min='', $max='') {
54 - 54 +
55 $string = trim($string); 55 $string = trim($string);
56 if(get_magic_quotes_gpc()) $string = stripslashes($string); 56 if(get_magic_quotes_gpc()) $string = stripslashes($string);
57 - 57 +
58 $len = strlen($string); 58 $len = strlen($string);
59 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false; 59 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false;
60 - 60 +
61 if(function_exists("mysql_real_escape_string")) { 61 if(function_exists("mysql_real_escape_string")) {
62 return mysql_real_escape_string($string); 62 return mysql_real_escape_string($string);
63 } else { 63 } else {
@@ -65,12 +65,10 @@ function sanitizeForSQL($string, $min=&#39;&#39;, $max=&#39;&#39;) { @@ -65,12 +65,10 @@ function sanitizeForSQL($string, $min=&#39;&#39;, $max=&#39;&#39;) {
65 } 65 }
66 } 66 }
67 67
68 -function sanitizeForSQLtoHTML($string, $min='', $max='') {  
69 -  
70 - $string = str_ireplace("\r", "", $string);  
71 - $string = str_ireplace("\n", "", $string);  
72 - return stripslashes(trim($string));  
73 - 68 +function sanitizeForSQLtoHTML($string, $min='', $max='')
  69 +{
  70 + $string = str_replace(array("\r","\n"), array('',''), $string);
  71 + return $string;
74 } 72 }
75 73
76 function sanitizeForHTML($string, $min='', $max='') 74 function sanitizeForHTML($string, $min='', $max='')
@@ -80,7 +78,7 @@ function sanitizeForHTML($string, $min=&#39;&#39;, $max=&#39;&#39;) @@ -80,7 +78,7 @@ function sanitizeForHTML($string, $min=&#39;&#39;, $max=&#39;&#39;)
80 78
81 $len = strlen($string); 79 $len = strlen($string);
82 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false; 80 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false;
83 - 81 +
84 if(function_exists("htmlspecialchars")) { 82 if(function_exists("htmlspecialchars")) {
85 return htmlspecialchars($string); 83 return htmlspecialchars($string);
86 } else { 84 } else {
@@ -117,8 +115,8 @@ function sanitizeForSYSTEM($string, $min=&#39;&#39;, $max=&#39;&#39;) @@ -117,8 +115,8 @@ function sanitizeForSYSTEM($string, $min=&#39;&#39;, $max=&#39;&#39;)
117 115
118 $len = strlen($string); 116 $len = strlen($string);
119 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false; 117 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false;
120 -  
121 - $pattern = '/( ;|\||`|>|<|&|^|"|'."\n|\r|'".'|{|}|[|]|\)|\( )/i'; 118 +
  119 + $pattern = '/( ;|\||`|>|<|&|^|"|'."\n|\r|'".'|{|}|[|]|\)|\( )/i';
122 $string = preg_replace( $pattern, '', $string); 120 $string = preg_replace( $pattern, '', $string);
123 return '"'.preg_replace( '/\$/', '\\\$', $string).'"'; 121 return '"'.preg_replace( '/\$/', '\\\$', $string).'"';
124 } 122 }