SET VERIFY OFF
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
CREATE OR REPLACE PACKAGE BODY OTNCMS_XMLCONTENT IS
acc_denied VARCHAR2(140) := '<EXC>Access Denied</EXC>';
no_resfound VARCHAR2(140) := '<EXC>No Resource Found</EXC>';
not_a_vcr VARCHAR2(140) := '<EXC>Not a Version Controlled Resource</EXC>';
not_chkdout VARCHAR2(140) := '<EXC>Resource has not been Checked Out</EXC>';
ald_chkdout VARCHAR2(140) := '<EXC>Resource is already Checked Out</EXC>';
successmsg VARCHAR2(140) := '<MSG>Operation Successful</MSG>';
invalidres VARCHAR2(140) := '<EXC>Invalid resource handle or path name</EXC>';
xslrefmsg VARCHAR2(140) := '<EXC>Cannot delete/rename XSL ' ||
'referenced by other resources</EXC>';
FUNCTION checkin (abspath IN VARCHAR2) RETURN VARCHAR2 IS
resid XDB.DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
resid := XDB.DBMS_XDB_VERSION.CheckIn(pathname => abspath);
COMMIT;
return successmsg;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31190') THEN
return not_a_vcr;
ELSIF (SQLCODE = '-31192') THEN
return not_chkdout;
ELSIF (SQLCODE = '-31001') THEN
return invalidres;
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END checkin;
FUNCTION checkout (abspath IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
XDB.DBMS_XDB_VERSION.CheckOut(pathname => abspath);
COMMIT;
return successmsg;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31190') THEN
return not_a_vcr;
ELSIF (SQLCODE = '-31191') THEN
return ald_chkdout;
ELSIF (SQLCODE = '-31001') THEN
return invalidres;
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END checkout;
FUNCTION checkresourcestatus (abspath IN VARCHAR2) RETURN VARCHAR2 IS
CURSOR c_version(p_path VARCHAR2) IS
SELECT extractvalue(res, '/Resource@VersionID') ,
extractvalue(res, '/Resource@ActivityID')
FROM XDB.resource_view
WHERE any_path = p_path;
versionId NUMBER := 0;
activityId NUMBER := 0;
returnmsg VARCHAR2(140) := NULL;
BEGIN
OPEN c_version(abspath);
LOOP
FETCH c_version INTO versionId, activityId;
IF c_version%NOTFOUND THEN
returnmsg := no_resfound;
ELSE
IF versionId IS NULL THEN
returnmsg := not_a_vcr;
ELSE
returnmsg := 'Version Id : ' || versionId;
END IF;
END IF;
EXIT;
END LOOP;
return returnmsg;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END checkresourcestatus;
FUNCTION changeuser (abspath IN VARCHAR2, newuser IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
UPDATE XDB.resource_view
SET res = updatexml(res, '/Resource/Owner/text()', UPPER(newuser))
WHERE any_path LIKE abspath;
COMMIT;
RETURN '<MSG>SUCCESS</MSG>';
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END changeuser;
FUNCTION ResourceExists(path IN VARCHAR2) RETURN NUMBER IS
result NUMBER;
BEGIN
SELECT COUNT(*)
INTO result
FROM XDB.resource_view
WHERE equals_path(res, path) = 1;
RETURN result;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END ResourceExists;
FUNCTION createfolder (abspath IN VARCHAR2) RETURN VARCHAR2 IS
status BOOLEAN := FALSE;
chkres VARCHAR2(140) := null;
BEGIN
chkres := checkresourcestatus(abspath => abspath);
IF (chkres = no_resfound) THEN
status := XDB.dbms_xdb.CreateFolder(abspath => abspath);
XDB.dbms_xdb.setAcl( res_path => abspath,
acl_path => '/sys/acls/owner_cmsadmin_acl.xml' );
IF (status) THEN
COMMIT;
return '<MSG>Folder created successfully</MSG>';
ELSE
return '<EXC>Folder could not be created</EXC>';
END IF;
ELSE
return '<EXC>Folder already exists</EXC>';
END IF;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END createfolder;
FUNCTION checkuser (inusername IN VARCHAR2) RETURN NUMBER IS
user VARCHAR2(30) := NULL;
BEGIN
SELECT username
INTO user
FROM all_users
WHERE UPPER(username) = UPPER(inusername);
return -1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
return 0;
WHEN OTHERS THEN
RAISE;
END checkuser;
FUNCTION insertResourceInfo(abspath IN VARCHAR2, resdir IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
INSERT INTO CMSADMIN.OTNCMS_CONTENT_VIEW ( OWNER,
RESOURCEDIR,
RESOURCEURI )
VALUES ( UPPER(USER),
resdir,
SYS.XDBURITYPE(abspath));
return '<MSG>SUCCESS</MSG>';
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END insertResourceInfo;
FUNCTION createresource (abspath IN VARCHAR2, resdir IN VARCHAR2, data IN VARCHAR2) RETURN VARCHAR2 IS
status BOOLEAN := FALSE;
chkres VARCHAR2(140) := null;
inssts VARCHAR2(140) := null;
BEGIN
chkres := checkresourcestatus(abspath => abspath);
IF (chkres = no_resfound) THEN
status := XDB.dbms_xdb.CreateResource(abspath => abspath,
data => data);
IF (status) THEN
inssts := insertResourceInfo(abspath => abspath,
resdir => resdir);
XDB.dbms_xdb.setAcl( res_path => abspath,
acl_path => '/sys/acls/owner_cmsadmin_acl.xml' );
COMMIT;
return '<MSG>Resource created successfully</MSG>';
ELSE
return '<EXC>Resource could not be created</EXC>';
END IF;
ELSE
return '<EXC>Resource with same name already exists in this path</EXC>';
END IF;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31003') THEN
return '<EXC>Resource with same name already exists in this path</EXC>';
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
ROLLBACK;
RAISE;
END IF;
END createresource;
FUNCTION createresource (abspath IN VARCHAR2, resdir IN VARCHAR2, data IN OUT CLOB) RETURN VARCHAR2 IS
status BOOLEAN := FALSE;
chkres VARCHAR2(140) := null;
inssts VARCHAR2(140) := null;
absext VARCHAR2(140) := null;
BEGIN
chkres := checkresourcestatus(abspath => abspath);
IF (chkres = no_resfound) THEN
absext := LOWER( SUBSTR(abspath, (LENGTH(abspath) - 3) ));
IF ( absext IN ('.xml','.xsl','.xsd','.rdf' ) ) THEN
status := XDB.dbms_xdb.CreateResource(abspath => abspath,
data => SYS.XMLTYPE(data));
ELSE
status := XDB.dbms_xdb.CreateResource(abspath => abspath,
data => data);
END IF;
IF (status) THEN
inssts := insertResourceInfo(abspath => abspath,
resdir => resdir);
XDB.dbms_xdb.setAcl(res_path => abspath,
acl_path => '/sys/acls/owner_cmsadmin_acl.xml');
COMMIT;
DBMS_LOB.FREETEMPORARY(data);
return '<MSG>Resource created successfully</MSG>';
ELSE
return '<EXC>Resource could not be created</EXC>';
END IF;
ELSE
return '<EXC>Resource with same name already exists in this path</EXC>';
END IF;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31003') THEN
return '<EXC>Resource with same name already exists in this path</EXC>';
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
ROLLBACK;
RAISE;
END IF;
END createresource;
FUNCTION createblobresource (abspath IN VARCHAR2, resdir IN VARCHAR2, data IN OUT BLOB) RETURN VARCHAR2 IS
status BOOLEAN := FALSE;
chkres VARCHAR2(140) := null;
inssts VARCHAR2(140) := null;
BEGIN
chkres := checkresourcestatus(abspath => abspath);
IF (chkres = no_resfound) THEN
status := XDB.dbms_xdb.CreateResource(abspath => abspath,
data => data);
IF (status) THEN
inssts := insertResourceInfo(abspath => abspath,
resdir => resdir);
XDB.dbms_xdb.setAcl(res_path => abspath,
acl_path => '/sys/acls/owner_cmsadmin_acl.xml');
COMMIT;
DBMS_LOB.FREETEMPORARY(data);
return '<MSG>Resource created successfully</MSG>';
ELSE
return '<EXC>Resource could not be created</EXC>';
END IF;
ELSE
return '<EXC>Resource with same name already exists in this path</EXC>';
END IF;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31003') THEN
return '<EXC>Resource with same name already exists in this path</EXC>';
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
ROLLBACK;
RAISE;
END IF;
END createblobresource;
FUNCTION createresource (abspath IN VARCHAR2, resdir IN VARCHAR2, data IN SYS.XMLTYPE) RETURN VARCHAR2 IS
status BOOLEAN := FALSE;
chkres VARCHAR2(140) := null;
inssts VARCHAR2(140) := null;
BEGIN
chkres := checkresourcestatus(abspath => abspath);
IF (chkres = no_resfound) THEN
status := XDB.dbms_xdb.CreateResource(abspath => abspath,
data => data);
IF (status) THEN
inssts := insertResourceInfo(abspath => abspath,
resdir => resdir);
XDB.dbms_xdb.setAcl(res_path => abspath,
acl_path => '/sys/acls/owner_cmsadmin_acl.xml');
COMMIT;
return '<MSG>Resource created successfully</MSG>';
ELSE
return '<EXC>Resource could not be created</EXC>';
END IF;
ELSE
return '<EXC>Resource with same name already exists in this path</EXC>';
END IF;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31003') THEN
return '<EXC>Resource with same name already exists in this path</EXC>';
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
ROLLBACK;
RAISE;
END IF;
END createresource;
FUNCTION xslcheck(resloc IN VARCHAR2) RETURN BOOLEAN IS
reccount NUMBER;
BEGIN
SELECT count(*)
INTO reccount
FROM CMSADMIN.otncms_pers_view op
WHERE op.XSLLOC.geturl() = resloc;
IF (reccount = 0) THEN
return TRUE;
ELSE
return FALSE;
END IF;
END xslcheck;
FUNCTION deleteresource (abspath IN VARCHAR2) RETURN VARCHAR2 IS
updflg BOOLEAN := FALSE;
BEGIN
updflg := xslcheck(resloc => abspath);
IF (NOT updflg) THEN
return xslrefmsg;
END IF;
XDB.dbms_xdb.DeleteResource(abspath => abspath);
DELETE FROM CMSADMIN.OTNCMS_CONTENT_VIEW e
WHERE e.RESOURCEURI.geturl() = abspath
AND UPPER(e.owner) = UPPER(USER);
DELETE FROM CMSADMIN.OTNCMS_PERS_VIEW op
WHERE op.RESOURCELOC.geturl() = abspath
AND UPPER(op.username) = UPPER(USER);
COMMIT;
return '<MSG>Successfully deleted</MSG>';
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31007') THEN
return '<EXC>Cannot delete non-empty resource</EXC>';
ELSIF (SQLCODE = '-31001') THEN
return invalidres;
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
ROLLBACK;
RAISE;
END IF;
END deleteresource;
FUNCTION makeversioned (abspath IN VARCHAR2) RETURN VARCHAR2 IS
resid XDB.DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
resid := XDB.DBMS_XDB_VERSION.MakeVersioned(pathname => abspath);
COMMIT;
return '<MSG>Version Control successful</MSG>';
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END makeversioned;
FUNCTION undocheckout (abspath IN VARCHAR2) RETURN VARCHAR2 IS
resid XDB.DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
resid := XDB.DBMS_XDB_VERSION.UncheckOut(pathname => abspath);
COMMIT;
return successmsg;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31190') THEN
return not_a_vcr;
ELSIF (SQLCODE = '-31192') THEN
return not_chkdout;
ELSIF (SQLCODE = '-31001') THEN
return invalidres;
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END undocheckout;
FUNCTION rename(abspath IN VARCHAR2, oldname IN VARCHAR2,
newname IN VARCHAR2, chkmsg IN VARCHAR2 DEFAULT 'NONE') RETURN VARCHAR2 IS
chkres VARCHAR2(140) := null;
updflg BOOLEAN := FALSE;
BEGIN
chkres := checkresourcestatus(abspath => abspath || '/' || newname);
IF (chkres = no_resfound) THEN
updflg := xslcheck(resloc => abspath || '/' || oldname);
IF ((NOT updflg) AND (chkmsg = 'NONE')) THEN
return xslrefmsg;
END IF;
IF (updflg OR chkmsg = 'UPDATE') THEN
XDB.DBMS_XDB.renameresource( srcpath => abspath || '/' || oldname,
destfolder => abspath,
newname => newname);
UPDATE CMSADMIN.OTNCMS_PERS_VIEW op
SET resourceloc = SYS.XDBURITYPE(abspath || '/' || newname)
WHERE UPPER(op.username) = UPPER(USER)
AND op.resourceloc.geturl() = (abspath || '/' || oldname);
UPDATE CMSADMIN.OTNCMS_CONTENT_VIEW oc
SET resourceuri = SYS.XDBURITYPE(abspath || '/' || newname)
WHERE UPPER(oc.owner) = UPPER(USER)
AND oc.resourceuri.geturl() = (abspath || '/' || oldname);
IF (chkmsg = 'UPDATE') THEN
UPDATE CMSADMIN.OTNCMS_PERS_VIEW op
SET xslloc = SYS.XDBURITYPE(abspath || '/' || newname)
WHERE UPPER(op.username) = UPPER(USER)
AND op.xslloc.geturl() = (abspath || '/' || oldname);
END IF;
COMMIT;
END IF;
return '<MSG>Rename successful</MSG>';
ELSE
return '<EXC>Failed to Rename, another resource exists with this name</EXC>';
END IF;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
RAISE;
END IF;
END rename;
FUNCTION updateresource (abspath IN VARCHAR2, data IN SYS.XMLTYPE) RETURN VARCHAR2 IS
BEGIN
UPDATE XDB.resource_view
SET res = updateXML(res, '/Resource/Contents/*', data,
'/Resource/ModificationDate/text()',
to_char (CURRENT_TIMESTAMP,
'SYYYY-MM-DD"T"HH24:MI:SS.FF') )
WHERE any_path = abspath;
COMMIT;
RETURN '<MSG>Successfully updated the Resource</MSG>';
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31001') THEN
return invalidres;
ELSIF (SQLCODE = '-31192') THEN
return not_chkdout;
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
ROLLBACK;
RAISE;
END IF;
END updateresource;
FUNCTION updateresource (abspath IN VARCHAR2, data IN CLOB) RETURN VARCHAR2 IS
BEGIN
UPDATE XDB.resource_view
SET res = updateXML(res, '/Resource/Contents/*', data,
'/Resource/ModificationDate/text()',
to_char (CURRENT_TIMESTAMP,
'SYYYY-MM-DD"T"HH24:MI:SS.FF') )
WHERE any_path = abspath;
COMMIT;
RETURN '<MSG>Successfully updated the Resource</MSG>';
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31001') THEN
return invalidres;
ELSIF (SQLCODE = '-31192') THEN
return not_chkdout;
ELSIF (SQLCODE = '-31050') THEN
return acc_denied;
ELSE
ROLLBACK;
RAISE;
END IF;
END updateresource;
FUNCTION getprevcontents(abspath IN VARCHAR2, version IN VARCHAR2,
action IN VARCHAR2) RETURN SYS.XMLTYPE IS
residlist XDB.DBMS_XDB_VERSION.resid_list_type;
resid XDB.DBMS_XDB_VERSION.resid_type;
value SYS.XMLTYPE := NULL;
ressts VARCHAR2(140) := NULL;
vercount NUMBER := 0;
tempnum NUMBER := 0;
BEGIN
SELECT extractvalue(res, '/Resource@VersionID')
INTO vercount
FROM XDB.resource_view
WHERE any_path = abspath;
IF (TO_NUMBER(version) < vercount) THEN
residlist := XDB.DBMS_XDB_VERSION.GetPredecessors(pathname => abspath);
resid := residlist(1);
tempnum := vercount - 1;
IF (tempnum = TO_NUMBER(version)) THEN
value := XDB.DBMS_XDB_VERSION.GETCONTENTSXMLBYRESID(resid => resid);
ELSE
WHILE (tempnum > TO_NUMBER(version)) LOOP
tempnum := tempnum - 1;
residlist := XDB.DBMS_XDB_VERSION.GETPREDSBYRESID(resid => resid);
resid := residlist(1);
IF (tempnum = TO_NUMBER(version)) THEN
value := XDB.DBMS_XDB_VERSION.GETCONTENTSXMLBYRESID(resid => resid);
END IF;
END LOOP;
END IF;
ELSIF ((TO_NUMBER(version) >= vercount) OR (TO_NUMBER(version) = 0)) THEN
value := NULL;
END IF;
IF (value IS NOT NULL) THEN
IF (action = 'EDITVERSION') THEN
ressts := CMSADMIN.otncms_xmlcontent.checkout(abspath => abspath);
IF (NOT(ressts = successmsg)) THEN
value := SYS.XMLTYPE('<GPCERROR>'||ressts||'</GPCERROR>');
END IF;
END IF;
ELSE
value := SYS.XMLTYPE('<GPCERROR>' ||
'Failed to get contents of this version' ||
'</GPCERROR>');
END IF;
RETURN value;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = '-31050') THEN
value := SYS.XMLTYPE('<GPCERROR>' || acc_denied || '</GPCERROR>');
return value;
ELSE
RAISE;
END IF;
END getprevcontents;
FUNCTION checkPrivileges(respath IN VARCHAR2) RETURN VARCHAR2 IS
haspriv VARCHAR2(2000);
status PLS_INTEGER;
privnamespace VARCHAR2(1000);
priv VARCHAR2(4000);
TYPE VARLIST IS TABLE OF VARCHAR2(100);
privlist VARLIST;
BEGIN
privlist := VARLIST('<dav:read/>','<dav:write/>','<dav:write-acl/>','<dav:all/>');
privnamespace := '<privilege xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
http://xmlns.oracle.com/xdb/acl.xsd
DAV: http://xmlns.oracle.com/xdb/dav.xsd"
xmlns:xdbacl="http://xmlns.oracle.com/xdb/acl.xsd"
xmlns:dav="DAV:">';
FOR i IN 1..privlist.count LOOP
priv := privnamespace || privlist(i) || '</privilege>';
status := DBMS_XDB.checkPrivileges( respath, SYS.XMLTYPE.createXML( priv ) );
IF status > 0 THEN
IF i = privlist.count THEN
haspriv := haspriv || privlist(i);
ELSE
haspriv := haspriv || privlist(i) || ',';
END IF;
END IF;
END LOOP;
RETURN haspriv;
END checkPrivileges;
END OTNCMS_XMLCONTENT;
/
SHOW ERRORS;
COMMIT;
REM EXIT;