[prev in list] [next in list] [prev in thread] [next in thread]
List: slide-dev
Subject: svn commit: r524298 [5/5] - in
From: ollie () apache ! org
Date: 2007-03-30 22:24:28
Message-ID: 20070330222431.EC0731A984E () eris ! apache ! org
[Download RAW message or body]
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/JDBCAwareInputStream.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/JDBCAwareInputStream.java?view=auto&rev=524298
==============================================================================
--- jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/JDBCAwareInputStream.java \
(added)
+++ jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/JDBCAwareInputStream.java \
Fri Mar 30 15:24:26 2007 @@ -0,0 +1,117 @@
+/*
+ * $Header: /cvs/slide/src/stores/com/ibm/db2/purexml/JDBCAwareInputStream.java,v \
1.1 2006/11/28 19:44:20 zocourto Exp $ + * $Revision: 1.1 $
+ * $Date: 2006/11/28 19:44:20 $
+ *
+ * ====================================================================
+ *
+ * Copyright 1999-2002 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.ibm.db2.purexml;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * Wrapper for an input stream that has come from a JDBC connection. This
+ * wrapper also closes the underlying JDBC result set - freeing precious system
+ * resources - or at least Oracle cursors ;-)
+ *
+ * @version $Revision: 1.1 $
+ */
+class JDBCAwareInputStream
+ extends FilterInputStream {
+
+
+ // ---------------------------------------------------------- Instance Data
+
+
+ /**
+ * The JDBC statement that will be closed along with its result set when the
+ * input stream is told to close itself.
+ */
+ private Statement stmt = null;
+ private ResultSet rs = null;
+ private Connection connection = null;
+
+
+ // ----------------------------------------------------------- Constructors
+
+
+ /**
+ * Creates an input stream that closes a statmenet, a resultset and a connection
+ * when the stream itself is closed.
+ *
+ */
+ public JDBCAwareInputStream(InputStream in, Statement stmt, ResultSet rs, \
Connection connection) { + super(in);
+
+ this.stmt = stmt;
+ this.rs = rs;
+ this.connection = connection;
+ }
+
+
+ // --------------------------------------------- InputStream Implementation
+
+
+ /**
+ * Overridden to close the associated JDBC statement, result set and connection \
together with the + * input stream.
+ */
+ public void close() throws IOException {
+ try {
+ if (rs != null) {
+ rs.close();
+ }
+ } catch (SQLException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ try {
+ if (stmt != null) {
+ stmt.close();
+ }
+ } catch (SQLException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ try {
+ if (connection != null) {
+ try {
+ connection.commit();
+ } catch (SQLException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ try {
+ connection.close();
+ } catch (SQLException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+ }
+ } finally {
+ super.close();
+ }
+ }
+ }
+ }
+}
+
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLAdapter.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLAdapter.java?view=auto&rev=524298
==============================================================================
--- jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLAdapter.java \
(added)
+++ jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLAdapter.java \
Fri Mar 30 15:24:26 2007 @@ -0,0 +1,734 @@
+/*
+ * $Header$
+ * $Revision: $
+ * $Date: $
+ *
+ * ====================================================================
+ *
+ * Copyright 1999-2003 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package com.ibm.db2.purexml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.slide.common.Service;
+import org.apache.slide.common.ServiceAccessException;
+import org.apache.slide.common.UnknownObjectClassException;
+import org.apache.slide.content.NodeProperty;
+import org.apache.slide.content.NodeRevisionDescriptor;
+import org.apache.slide.content.NodeRevisionDescriptors;
+import org.apache.slide.content.NodeRevisionNumber;
+import org.apache.slide.lock.NodeLock;
+import org.apache.slide.security.NodePermission;
+import org.apache.slide.store.impl.rdbms.StandardRDBMSAdapter;
+import org.apache.slide.structure.LinkNode;
+import org.apache.slide.structure.ObjectNode;
+import org.apache.slide.structure.ObjectNotFoundException;
+import org.apache.slide.util.logger.Logger;
+import org.jdom.Attribute;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.Format;
+import org.jdom.output.XMLOutputter;
+/**
+ * Adapter for DB2 pureXML.
+ *
+ * @version $Revision: $
+ */
+public class PureXMLAdapter extends StandardRDBMSAdapter {
+
+ protected static final String PATH_EXTENSION = ".def.xml";
+ protected final Format outputFormat;
+ protected SimpleDateFormat dateFormat;
+ protected String characterEncoding = "UTF-8";
+ protected String uri;
+
+ /** Stored object.*/
+ protected ObjectNode object;
+
+ /** Permissions vector. */
+ protected Vector permissions;
+
+ /** Locks vector.*/
+ protected Vector locks;
+
+ /** Revision descriptors.*/
+ protected NodeRevisionDescriptors revisionDescriptors;
+
+ /** Revision descriptor hashtable.*/
+ protected Hashtable descriptor;
+
+ public PureXMLAdapter(Service service, Logger logger){
+ super(service, logger);
+ bcompress = false;
+
+ outputFormat = Format.getPrettyFormat();
+ outputFormat.setEncoding(characterEncoding);
+
+ dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z");
+ }
+
+ protected String getLoadPath(){
+ return this.uri + PATH_EXTENSION;
+ }
+
+ protected boolean contentExists(Connection cnn, String uri)throws \
ServiceAccessException{ + boolean isFound = false;
+ try{
+ PreparedStatement statement = null;
+ ResultSet res = null;
+ CollectionInfo cInfo = \
PureXMLUtilities.getCollectionInfo(PureXMLUtilities.getParentUri(this.getLoadPath(), \
cnn), cnn); +
+ try{
+ String strSQL = "SELECT 1 FROM " + cInfo.getTableSchema() + "." + \
cInfo.getTableName() + + " WHERE " + cInfo.getColumnIDName() + " = ?";
+ statement = cnn.prepareStatement(strSQL);//"SELECT 1 FROM WEBDAV.DATADEFAULT \
WHERE ID = ?"); + statement.setString(1,PureXMLUtilities.getResourceID(uri, cnn));
+ res = statement.executeQuery();
+ isFound = res.next();
+ }finally{
+ close(statement,res);
+ }
+ }catch(SQLException e){
+ throw createException(e,uri.toString());
+ }
+ return isFound;
+ }
+
+ protected boolean metadataExists(Connection cnn)throws ServiceAccessException{
+ boolean isFound = false;
+ try{
+ PreparedStatement statement = null;
+ ResultSet res = null;
+ try{
+ statement = cnn.prepareStatement("SELECT * FROM WEBDAV.SLIDEMETADATA WHERE URI = \
?"); + statement.setString(1,getLoadPath());
+ res = statement.executeQuery();
+ isFound = res.next();
+ }finally{
+ close(statement,res);
+ }
+ }catch(SQLException e){
+ throw createException(e,uri.toString());
+ }
+ return isFound;
+ }
+
+ protected void init() throws ServiceAccessException {
+ // need to set this null, as AbstractUriProperties.retrieveObject relies on \
it + object = null;
+ permissions = new Vector();
+ locks = new Vector();
+ revisionDescriptors =
+ new NodeRevisionDescriptors(uri, null, new Hashtable(), new Hashtable(), \
new Hashtable(), false); + descriptor = new Hashtable();
+ }
+
+ protected void save(Connection cnn) throws ServiceAccessException{
+ Element aRoot = encode();
+ Document aDocument = new Document(aRoot);
+
+ XMLOutputter aOutputter = new XMLOutputter(outputFormat);
+ String xmlDoc = aOutputter.outputString(aDocument);
+
+ CollectionInfo info = null;
+ try{
+ PreparedStatement statement = null;
+ try{
+ if(metadataExists(cnn)){
+ statement = cnn.prepareStatement("UPDATE WEBDAV.SLIDEMETADATA SET METADATA = ? \
WHERE URI = ?"); + statement.setString(1,xmlDoc);
+ statement.setString(2,this.getLoadPath());
+ statement.executeUpdate();
+ if(PureXMLUtilities.isCollection(descriptor)){
+ if(!PureXMLUtilities.isExposedCollection(descriptor)){
+ info = PureXMLUtilities.getCollectionInfo(PureXMLUtilities.getParentUri(object), \
cnn); + PureXMLUtilities.updateCollectionInfo(info, this.getLoadPath(), \
cnn);//if not exposed but may be a subfolder not create by SP \
+ if(PureXMLUtilities.isExposedCollection(PureXMLUtilities.getParentUri(this.getLoadPath(), \
cnn), cnn)){ + PureXMLUtilities.updateExposedCollection(this.getLoadPath(),cnn);
+ }
+ }else if(PureXMLUtilities.isExposedCollection(PureXMLUtilities.getParentUri(this.getLoadPath(), \
cnn), cnn)){ + info = \
PureXMLUtilities.getCollectionInfo(PureXMLUtilities.getParentUri(object), cnn); \
+ PureXMLUtilities.updateCollectionInfo(info, this.getLoadPath(), cnn); \
+ } + }
+ if(PureXMLUtilities.isVersioningMetadata(this.getLoadPath())){
+ boolean isXML = PureXMLUtilities.isVersionedDocXML(this.getLoadPath(), cnn);
+ info = PureXMLUtilities.getCollectionInfo(this.getLoadPath(), cnn);
+ PureXMLUtilities.updateCollectionInfo(info, \
PureXMLUtilities.getParentUri(this.getLoadPath(), cnn), cnn); \
+ PureXMLUtilities.updateResourceInfo(PureXMLUtilities.getHistoryResourceInfo(this.getLoadPath(),isXML), \
this.getLoadPath(), cnn); + }
+ }
+ else{
+ statement = cnn.prepareStatement("INSERT INTO \
WEBDAV.SLIDEMETADATA(URI,METADATA) VALUES(?,?)"); \
+ statement.setString(1,this.getLoadPath()); + statement.setString(2,xmlDoc);
+ statement.executeUpdate();
+ }
+ }finally{
+ close(statement);
+ }
+ }catch(SQLException e){
+ throw createException(e, uri.toString());
+ }
+ }
+
+ protected void delete(Connection cnn) throws ServiceAccessException{
+ try{
+ PreparedStatement statement = null;
+ try{
+ statement = cnn.prepareStatement("DELETE FROM WEBDAV.SLIDEMETADATA WHERE URI = \
?"); + statement.setString(1,this.getLoadPath());
+ statement.executeUpdate();
+ }finally{
+ close(statement);
+ }
+ }catch(SQLException e){
+ throw createException(e, uri.toString());
+ }
+ }
+
+
+ protected void load(InputStream is)throws ServiceAccessException, IOException, \
JDOMException{ + SAXBuilder aBuilder = new SAXBuilder();
+ Document aDocument = aBuilder.build(is);
+ decode(aDocument.getRootElement());
+ }
+
+ protected void load(Connection cnn) throws ServiceAccessException, \
ObjectNotFoundException{ + PreparedStatement statement = null;
+ ResultSet rs = null;
+ InputStream is = null;
+ try{
+ if(this.metadataExists(cnn)){
+ statement = cnn.prepareStatement("SELECT METADATA FROM WEBDAV.SLIDEMETADATA \
WHERE URI = ?"); + statement.setString(1,this.getLoadPath());
+ rs = statement.executeQuery();
+ while(rs.next()){
+ is = rs.getBinaryStream(1);
+ }
+ load(is);
+ }
+ else{
+ init();
+ }
+ }catch(SQLException e){
+ throw new ObjectNotFoundException(uri.toString()); //XXX May need the \
createException instead. + }catch (IOException ioe) {
+ getLogger().log(ioe, LOG_CHANNEL, Logger.ERROR);
+ throw new ServiceAccessException(service, ioe);
+ }catch (JDOMException je) {
+ throw createException(je, uri.toString());
+ }
+ finally{
+ close(statement,rs);
+ try{ if(is!=null) is.close();}
+ catch(IOException e){}
+ }
+ }
+
+ protected static String booleanToString(boolean aBoolean) {
+ return aBoolean ? "true" : "false";
+ }
+
+ protected static Element createBindings(String aParent, String aChild, \
Enumeration aEnum) { + Element aElement = new Element(aParent);
+ Element childNode;
+ ObjectNode.Binding binding;
+ while (aEnum.hasMoreElements()) {
+ binding = (ObjectNode.Binding) aEnum.nextElement();
+ childNode = new Element(aChild);
+ childNode.setAttribute(new Attribute("name", binding.getName()));
+ childNode.setAttribute(new Attribute("uuri", binding.getUuri()));
+ aElement.addContent(childNode);
+ }
+ return aElement;
+ }
+
+ protected static Element createElements(String aParent, String aChild, \
Enumeration aEnum) { + Element aElement = new Element(aParent);
+ while (aEnum.hasMoreElements()) {
+ Object aObject = aEnum.nextElement();
+ Element aItem = new Element(aChild);
+ aItem.setAttribute("val", aObject.toString());
+ aElement.addContent(aItem);
+ }
+ return aElement;
+ }
+
+ protected static NodePermission decodePermission(Element aElement, String aUri) \
{ + String aRevisionNumber = aElement.getAttributeValue("revisionNumber");
+ String aSubject = aElement.getAttributeValue("subjectUri");
+ String aAction = aElement.getAttributeValue("actionUri");
+ boolean aInheritable = new \
Boolean(aElement.getAttributeValue("inheritable")).booleanValue(); + boolean \
aNegative = new Boolean(aElement.getAttributeValue("negative")).booleanValue(); + \
return new NodePermission(aUri, aRevisionNumber, aSubject, aAction, aInheritable, \
aNegative); +
+ }
+
+ protected static Element encodeNodePermission(NodePermission aPermission) {
+ Element aElementPermission = new Element("permission");
+ NodeRevisionNumber aRevisionNumber = aPermission.getRevisionNumber();
+ if (aRevisionNumber != null) {
+ aElementPermission.setAttribute("revisionNumber", \
encodeRevisionNumber(aRevisionNumber)); + }
+ aElementPermission.setAttribute("subjectUri", aPermission.getSubjectUri());
+ aElementPermission.setAttribute("actionUri", aPermission.getActionUri());
+ aElementPermission.setAttribute("inheritable", \
booleanToString(aPermission.isInheritable())); + \
aElementPermission.setAttribute("negative", \
booleanToString(aPermission.isNegative())); + return aElementPermission;
+ }
+
+ protected static Element encodeRevisionDescriptor(NodeRevisionDescriptor \
aDescriptor) { + Element aRevisions = new Element("revisions");
+ aRevisions.setAttribute("branchName", aDescriptor.getBranchName());
+ aRevisions.setAttribute("number", \
encodeRevisionNumber(aDescriptor.getRevisionNumber())); + \
aRevisions.addContent(createElements("labels", "label", \
aDescriptor.enumerateLabels())); + Element aProperties = new \
Element("properties"); +
+ for (Enumeration aEnum = aDescriptor.enumerateProperties(); \
aEnum.hasMoreElements();) { + Object aObject = aEnum.nextElement();
+ NodeProperty aProp = (NodeProperty) aObject;
+ aProperties.addContent(encodeNodeProperty(aProp));
+ }
+ aRevisions.addContent(aProperties);
+ return aRevisions;
+ }
+
+ protected static Element encodeNodeProperty(NodeProperty aProp) {
+ Element aElement = new Element("property");
+ aElement.setAttribute("name", aProp.getName());
+ aElement.setAttribute("namespace", aProp.getNamespace());
+ aElement.setAttribute("value", aProp.getValue().toString());
+ aElement.setAttribute("type", aProp.getType());
+ aElement.setAttribute("protected", booleanToString(aProp.isProtected()));
+ Element aPermissions = new Element("permissions");
+
+ for (Enumeration aEnum = aProp.enumeratePermissions(); \
aEnum.hasMoreElements();) { + NodePermission aPermission = \
(NodePermission) aEnum.nextElement(); + \
aPermissions.addContent(encodeNodePermission(aPermission)); + }
+ aElement.addContent(aPermissions);
+ return aElement;
+ }
+
+ protected static Vector createVector(Element aElement, String aParentName, \
String aChildName) { + Element aParent = aElement.getChild(aParentName);
+ Vector aRet = new Vector();
+ List aList = aParent.getChildren(aChildName);
+ for (int i = 0; i < aList.size(); i++) {
+ Element aChild = (Element) aList.get(i);
+ aRet.addElement(aChild.getAttributeValue("val"));
+ }
+ return aRet;
+ }
+
+ protected static Vector createBindingVector(
+ Element aElement,
+ String aParentName,
+ String aChildName,
+ boolean parentBindings) {
+ Element aParent = aElement.getChild(aParentName);
+ Vector aRet = new Vector();
+ // System.out.println("--------- createVector aParentName="+aParentName+" \
aChildName="+aChildName); + Iterator it = aParent.getChildren().iterator();
+ while (it.hasNext()) {
+ Element aChild = (Element) it.next();
+ String name = aChild.getAttributeValue("name");
+ String uuri = aChild.getAttributeValue("uuri");
+ if (parentBindings) {
+ aRet.add(new ObjectNode.ParentBinding(name, uuri));
+ } else {
+ aRet.add(new ObjectNode.Binding(name, uuri));
+ }
+ }
+ return aRet;
+ }
+
+ protected static String encodeRevisionNumber(NodeRevisionNumber aRevisionNumber) \
{ + return aRevisionNumber.getMajor() + "." + aRevisionNumber.getMinor();
+ }
+
+ protected static Object createObject(String aNomClasse, Class aTypes[], Object \
aArgs[]) + throws UnknownObjectClassException {
+ Class aClasse = null;
+ try {
+ // First, load the object's class
+ aClasse = Class.forName(aNomClasse);
+ Constructor aConstructor = aClasse.getConstructor(aTypes);
+ if (aConstructor == null)
+ aConstructor = aClasse.getSuperclass().getConstructor(aTypes);
+ return aConstructor.newInstance(aArgs);
+
+ } catch (Exception e) {
+ throw new UnknownObjectClassException(aNomClasse);
+ }
+ }
+
+ protected static NodeRevisionNumber decodeRevisionNumber(Element aElement) {
+ Element aElementRevision = aElement.getChild("revision");
+ return new NodeRevisionNumber(
+ Integer.parseInt(aElementRevision.getAttributeValue("major")),
+ Integer.parseInt(aElementRevision.getAttributeValue("minor")));
+ }
+
+ protected static NodeRevisionNumber decodeRevisionNumber(String aStr) {
+ return (aStr == null ? null : new NodeRevisionNumber(aStr));
+ }
+
+ protected static NodeProperty decodeNodeProperty(Element aElement, String aUri) \
{ + String aName = aElement.getAttributeValue("name");
+ String aValue = aElement.getAttributeValue("value");
+ String aNamespace = aElement.getAttributeValue("namespace");
+ String aType = aElement.getAttributeValue("type");
+ boolean aProtected = new \
Boolean(aElement.getAttributeValue("protected")).booleanValue(); +
+ Element aPermisionsElement = aElement.getChild("permissions");
+ List aList = aPermisionsElement.getChildren();
+ Vector aPermission = new Vector();
+ for (int i = 0; i < aList.size(); i++) {
+ Element aChild = (Element) aList.get(i);
+ aPermission.addElement(decodePermission(aChild, aUri));
+ }
+ return new NodeProperty(aName, aValue, aNamespace, aType, aProtected);
+ }
+
+ /**
+ * Forms the *.def.xml document/metadata
+ *
+ * @return <code>aRoot</code> XML document
+ */
+ protected Element encode() throws ServiceAccessException {
+ Element aRoot = new Element("data");
+ aRoot.addContent(encodeObject());
+ aRoot.addContent(encodePermissions());
+ aRoot.addContent(encodeLocks());
+ aRoot.addContent(encodeRevisionDescriptors());
+ aRoot.addContent(encodeRevisionDescriptor());
+ return aRoot;
+ }
+
+ protected Element encodeObject() {
+ Element aElementObjectNode = new Element("objectnode");
+ if (object != null) {
+ aElementObjectNode.setAttribute("classname", \
object.getClass().getName()); + aElementObjectNode.setAttribute("uri", \
object.getUri()); + if (object instanceof LinkNode) {
+ aElementObjectNode.setAttribute("linkTo", ((LinkNode) \
object).getLinkedUri()); + }
+ aElementObjectNode.addContent(createBindings("children", "child", \
object.enumerateBindings())); + \
aElementObjectNode.addContent(createBindings("parents", "parent", \
object.enumerateParentBindings())); + \
aElementObjectNode.addContent(createElements("links", "link", \
object.enumerateLinks())); + } else {
+ // for null locks
+ aElementObjectNode.setAttribute("classname", "null");
+ aElementObjectNode.setAttribute("uri", uri.toString());
+ }
+ return aElementObjectNode;
+ }
+
+ protected Element encodePermissions() {
+ Element aPermissions = new Element("permissions");
+ if (permissions == null)
+ return aPermissions;
+
+ for (int aSize = permissions.size(), i = 0; i < aSize; i++) {
+ NodePermission aPermission = (NodePermission) permissions.elementAt(i);
+ aPermissions.addContent(encodeNodePermission(aPermission));
+ }
+ return aPermissions;
+ }
+
+ protected Element encodeLocks() {
+ Element aElementLocks = new Element("locks");
+ if (locks == null)
+ return aElementLocks;
+
+ for (int aSize = locks.size(), i = 0; i < aSize; i++) {
+ NodeLock aLock = (NodeLock) locks.elementAt(i);
+ Element aElementLock = new Element("lock");
+ aElementLock.setAttribute("subjectUri", aLock.getSubjectUri());
+ aElementLock.setAttribute("typeUri", aLock.getTypeUri());
+ aElementLock.setAttribute("date", \
dateFormat.format(aLock.getExpirationDate())); + \
aElementLock.setAttribute("inheritance", booleanToString(aLock.isInheritable())); + \
aElementLock.setAttribute("exclusive", booleanToString(aLock.isExclusive())); + \
aElementLock.setAttribute("lockId", aLock.getLockId()); + \
aElementLock.setAttribute("owner", + aLock.getOwnerInfo() == null ? \
"" : aLock.getOwnerInfo()); + aElementLocks.addContent(aElementLock);
+ }
+ return aElementLocks;
+ }
+
+ protected Element encodeRevisionDescriptors() {
+
+ Element aRevisionsHistory = new Element("revisionsHistory");
+ if (revisionDescriptors == null)
+ return aRevisionsHistory;
+
+ aRevisionsHistory.setAttribute(
+ "initialRevision",
+ encodeRevisionNumber(revisionDescriptors.getInitialRevision()));
+ aRevisionsHistory.setAttribute("useVersioning", \
booleanToString(revisionDescriptors.isVersioned())); +
+ // System.out.println("---------- encodeRevisionDescriptors \
getLatestRevision="+ + // revisionDescriptors.getLatestRevision());
+
+ Element aBranchesElement = new Element("branches");
+ Enumeration aBranches = revisionDescriptors.enumerateBranchNames();
+ while (aBranches.hasMoreElements()) {
+ String aBranchName = (String) aBranches.nextElement();
+ Element aElementBranch = new Element("branch");
+ aElementBranch.setAttribute("name", aBranchName);
+ NodeRevisionNumber aRevisionNumber = \
revisionDescriptors.getLatestRevision(aBranchName); + \
aElementBranch.setAttribute("lastestRevision", \
encodeRevisionNumber(aRevisionNumber)); + \
aBranchesElement.addContent(aElementBranch); + }
+ aRevisionsHistory.addContent(aBranchesElement);
+
+ Element aRevisionsElement = new Element("revisions");
+ Enumeration aRevisions = revisionDescriptors.enumerateRevisionNumbers();
+ while (aRevisions.hasMoreElements()) {
+ NodeRevisionNumber aRevisionNumber = (NodeRevisionNumber) \
aRevisions.nextElement(); + Element aRevisionElement = new \
Element("branch"); + aRevisionElement.setAttribute("start", \
encodeRevisionNumber(aRevisionNumber)); +
+ Enumeration aSuccessors = \
revisionDescriptors.getSuccessors(aRevisionNumber); + while \
(aSuccessors.hasMoreElements()) { + NodeRevisionNumber \
aSuccessorRevisionNumber = (NodeRevisionNumber) aSuccessors.nextElement(); + \
Element aSuccessorRevisionElement = new Element("revision"); + \
aSuccessorRevisionElement.setAttribute("number", \
encodeRevisionNumber(aSuccessorRevisionNumber)); + \
aRevisionElement.addContent(aSuccessorRevisionElement); + }
+ aRevisionsElement.addContent(aRevisionElement);
+ }
+ aRevisionsHistory.addContent(aRevisionsElement);
+
+ return aRevisionsHistory;
+ }
+
+ protected Element encodeRevisionDescriptor() {
+ Element aRet = new Element("descriptor");
+ if (descriptor == null)
+ return aRet;
+
+ for (Enumeration aEnum = descriptor.elements(); aEnum.hasMoreElements();) {
+ NodeRevisionDescriptor aRevisionDescriptor = (NodeRevisionDescriptor) \
aEnum.nextElement(); + \
aRet.addContent(encodeRevisionDescriptor(aRevisionDescriptor)); + }
+ return aRet;
+ }
+
+ protected void decode(Element aRoot) throws ServiceAccessException {
+ decodeObject(aRoot);
+ decodePermissions(aRoot);
+ decodeLocks(aRoot);
+ decodeRevisionDescriptors(aRoot);
+ decodeRevisionDescriptor(aRoot);
+ }
+
+ protected void decodeObject(Element aElement) throws ServiceAccessException {
+ Element aElementObjectNode = aElement.getChild("objectnode");
+ String aClasseName = aElementObjectNode.getAttributeValue("classname");
+ if (!"null".equals(aClasseName)) {
+ try {
+ String aUri = aElementObjectNode.getAttributeValue("uri");
+ Vector aChilds = createBindingVector(aElementObjectNode, "children", \
"child", false); + Vector aParents = \
createBindingVector(aElementObjectNode, "parents", "parent", true); + \
Vector aLinks = createVector(aElementObjectNode, "links", "link"); + \
// System.out.println("--------- decodeObject aChilds="+aChilds); + \
// System.out.println("--------- decodeObject aLinks="+aLinks); + \
Class aTypes[] = null; + Object aArgs[] = null;
+
+ if (aClasseName.equals(LinkNode.class.getName())) {
+ String aLinkTo = aElementObjectNode.getAttributeValue("linkTo");
+ aTypes = new Class[] { String.class, Vector.class, Vector.class, \
String.class }; + aArgs = new Object[] { aUri, aChilds, aLinks, \
aLinkTo }; + } else {
+ aTypes = new Class[] { String.class, Vector.class, Vector.class, \
Vector.class }; + aArgs = new Object[] { aUri, aChilds, aParents, \
aLinks }; + }
+ object = (ObjectNode) createObject(aClasseName, aTypes, aArgs);
+ object.setUri(object.getUuri());
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new ServiceAccessException(null, e);
+ }
+ uri = object.getUri();
+ } else {
+ object = null;
+ uri = aElementObjectNode.getAttributeValue("uri");
+ }
+ }
+
+ protected void decodePermissions(Element aElement) {
+ permissions = new Vector();
+ Element aPermissions = aElement.getChild("permissions");
+ List aList = aPermissions.getChildren();
+ for (int i = 0; i < aList.size(); i++) {
+ Element aChild = (Element) aList.get(i);
+ permissions.addElement(decodePermission(aChild, uri));
+ }
+ }
+
+ protected void decodeLocks(Element aElement) throws ServiceAccessException {
+ try {
+ locks = new Vector();
+ Element aElementLocks = aElement.getChild("locks");
+ List aList = aElementLocks.getChildren();
+
+ for (int i = 0; i < aList.size(); i++) {
+ Element aChild = (Element) aList.get(i);
+ String aSubject = aChild.getAttributeValue("subjectUri");
+ String aType = aChild.getAttributeValue("typeUri");
+ Date aDateExpiration = \
dateFormat.parse(aChild.getAttributeValue("date")); + boolean \
aInheritable = new Boolean(aChild.getAttributeValue("inheritance")).booleanValue(); + \
boolean aNegative = new \
Boolean(aChild.getAttributeValue("exclusive")).booleanValue(); + \
String aLockId = aChild.getAttributeValue("lockId"); + String \
ownerInfo = aChild.getAttributeValue("owner"); +
+ locks.addElement(
+ new NodeLock(aLockId, uri, aSubject, aType, aDateExpiration, \
aInheritable, aNegative, ownerInfo)); + }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new ServiceAccessException(null, e);
+ }
+
+ }
+
+ protected void decodeRevisionDescriptors(Element aElement) {
+ Element aRevisionsHistory = aElement.getChild("revisionsHistory");
+
+ NodeRevisionNumber aInitialRevision =
+ decodeRevisionNumber(aRevisionsHistory.getAttributeValue("initialRevision"));
+ boolean aUseVersionning = new \
Boolean(aRevisionsHistory.getAttributeValue("useVersioning")).booleanValue(); +
+ Element aBranchesElement = aRevisionsHistory.getChild("branches");
+ if (aBranchesElement == null) {
+ revisionDescriptors =
+ new NodeRevisionDescriptors(
+ uri,
+ aInitialRevision,
+ new Hashtable(),
+ new Hashtable(),
+ new Hashtable(),
+ aUseVersionning);
+ return;
+ }
+
+ List aList = aBranchesElement.getChildren();
+ Hashtable aLastestRevisions = new Hashtable();
+ for (int i = 0; i < aList.size(); i++) {
+ Element aChild = (Element) aList.get(i);
+ String aName = aChild.getAttributeValue("name");
+ NodeRevisionNumber aRevisionNumber = \
decodeRevisionNumber(aChild.getAttributeValue("lastestRevision")); + \
aLastestRevisions.put(aName, aRevisionNumber); + }
+ Hashtable aBranches = new Hashtable();
+ Element aRevisionsElement = aRevisionsHistory.getChild("revisions");
+ aList = aRevisionsElement.getChildren();
+ for (int i = 0; i < aList.size(); i++) {
+ Element aChild = (Element) aList.get(i);
+ NodeRevisionNumber aStartNumber = \
decodeRevisionNumber(aChild.getAttributeValue("start")); + List \
aSuccessors = aChild.getChildren(); + Vector aSuccessorsNumbers = new \
Vector(); + for (int k = 0; k < aSuccessors.size(); k++) {
+ Element aSuccessor = (Element) aSuccessors.get(k);
+ NodeRevisionNumber aRevisionNumber = \
decodeRevisionNumber(aSuccessor.getAttributeValue("number")); + \
aSuccessorsNumbers.addElement(aRevisionNumber); + }
+ aBranches.put(aStartNumber, aSuccessorsNumbers);
+ }
+ revisionDescriptors =
+ new NodeRevisionDescriptors(
+ uri,
+ aInitialRevision,
+ new Hashtable(),
+ aLastestRevisions,
+ aBranches,
+ aUseVersionning);
+ }
+
+ protected void decodeRevisionDescriptor(Element aParent) {
+ descriptor = new Hashtable();
+
+ Element aElement = aParent.getChild("descriptor");
+ if (aElement == null)
+ return;
+
+ List aList = aElement.getChildren();
+
+ for (int i = 0; i < aList.size(); i++) {
+ Element aChild = (Element) aList.get(i);
+ String aBranchName = aChild.getAttributeValue("branchName");
+ NodeRevisionNumber aRevisionNumber = \
decodeRevisionNumber(aChild.getAttributeValue("number")); +
+ Vector aLabels = new Vector();
+ Element aLabelsElement = (Element) aChild.getChild("labels");
+ List aLabelList = aLabelsElement.getChildren();
+ for (int k = 0; k < aLabelList.size(); k++) {
+ Element aLabel = (Element) aLabelList.get(k);
+ aLabels.addElement(aLabel.getAttributeValue("val"));
+ }
+
+ Hashtable aProperties = new Hashtable();
+ Element aPropertiesElement = (Element) aChild.getChild("properties");
+ List aPropertiesList = aPropertiesElement.getChildren();
+ for (int k = 0; k < aPropertiesList.size(); k++) {
+ Element aProperty = (Element) aPropertiesList.get(k);
+ NodeProperty aProp = decodeNodeProperty(aProperty, uri);
+ String key = aProperty.getAttributeValue("namespace") + \
aProperty.getAttributeValue("name"); + aProperties.put(key, aProp);
+ }
+ NodeRevisionDescriptor aNode =
+ new NodeRevisionDescriptor(aRevisionNumber, aBranchName, aLabels, \
aProperties); + descriptor.put(aRevisionNumber.toString(), aNode);
+ }
+ }
+
+ protected ServiceAccessException createException(JDOMException e, String uri) {
+ getLogger().log(
+ "JDOM error on " + uri + ": " + e.getMessage(),
+ LOG_CHANNEL,
+ Logger.ERROR);
+ return new ServiceAccessException(service, e);
+ }
+
+ protected ServiceAccessException createException(ObjectNotFoundException e, \
String uri) { + getLogger().log(
+ "JDOM error on " + uri + ": " + e.getMessage(),
+ LOG_CHANNEL,
+ Logger.ERROR);
+ return new ServiceAccessException(service, e);
+ }
+}
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLUtilities.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLUtilities.java?view=auto&rev=524298
==============================================================================
--- jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLUtilities.java \
(added)
+++ jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/PureXMLUtilities.java \
Fri Mar 30 15:24:26 2007 @@ -0,0 +1,333 @@
+
+package com.ibm.db2.purexml;
+
+import java.sql.*;
+import java.io.*;
+import java.util.*;
+import java.util.regex.Pattern;
+
+import org.jdom.input.*;
+import org.jdom.*;
+
+import org.apache.slide.content.*;
+import org.apache.slide.structure.ObjectNode;
+
+public class PureXMLUtilities {
+
+ public static String getResourceID(String uri, Connection cnn)throws SQLException{
+ if(uri.startsWith("/history"))
+ return uri;
+ PreparedStatement stmt = null;
+ String docID = null;
+ ResultSet rs = null;
+ String strSQL = "SELECT ID FROM WEBDAV.SLIDEMETADATA WHERE URI = ?";
+ stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, uri);
+ rs = stmt.executeQuery();
+ while(rs.next())
+ docID = rs.getString(1);
+ return docID;
+ }
+
+ public static int getColumnSQLType(Connection cnn, String schema, String tableName, \
String columnName)throws SQLException{ + ResultSet rs = null;
+ Object sqlType = null;
+ rs = cnn.getMetaData().getColumns(null,schema,tableName,columnName);
+ if(rs.next()){
+ sqlType = rs.getObject(5);
+ }
+ rs.close();
+
+ return Integer.parseInt(sqlType.toString());
+ }
+
+ public static boolean isVersioningMetadata(String uri){
+ return Pattern.matches("^/history/\\d{1,}/\\d{1,}\\.\\d{1,}\\.def\\.xml$", \
uri.trim()); + }
+
+ public static boolean isDocXML(String mimeType){
+ return mimeType.equalsIgnoreCase("text/xml");
+ }
+
+ public static boolean isVersionedDocXML(String uri, Connection cnn)throws \
SQLException{ + String parentUri = getParentUri(uri,cnn);
+ boolean isXML = false;
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+ String strSQL = "SELECT 1 FROM WEBDAV.SLIDEMETADATA as SLIDE WHERE " +
+ "XMLExists('$n/data/descriptor/revisions/properties[property/@value = \
\"text/xml\"]' " + + "passing slide.metadata as \"n\") AND slide.uri = ?";
+ stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, parentUri);
+ rs = stmt.executeQuery();
+ isXML = rs.next();
+ close(stmt);
+ return isXML;
+ }
+
+ public static boolean isExcelDoc(Connection cnn, CollectionInfo cInfo, ResourceInfo \
rInfo){ + String strSQL = "SELECT 1 FROM \
"+cInfo.getTableSchema()+"."+cInfo.getTableName() + + " WHERE XMLEXISTS('declare \
default element namespace \"urn:schemas-microsoft-com:office:excel\";" + + " \
$d//ExcelWorkbook' passing "+rInfo.getColumnContentName()+ " as \"d\") AND " + \
cInfo.getColumnIDName() +" = ?"; + boolean isExcel = false;
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+ try{
+ stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, rInfo.getDocID());
+ rs = stmt.executeQuery();
+ isExcel = rs.next();
+ }catch(Exception ex){
+ //System.out.println(ex.toString());
+ }finally{
+ try{
+ stmt.close();
+ rs.close();}
+ catch(Exception ex){}
+ }
+ return isExcel;
+ }
+
+ private static String formatMetadataUriToHistoryUri(String uri){
+ uri = uri.substring(0,uri.indexOf(".def.xml"));
+ String tmp1 = uri.substring(0,uri.lastIndexOf("/"));
+ String tmp2 = uri.substring(uri.lastIndexOf("/")+1,uri.length());
+ return tmp1 + "_" + tmp2;
+ }
+
+ public static ResourceInfo getHistoryResourceInfo(String versionedUri, boolean \
isXML){ + String columnName = (isXML) ? "DATA" : "ATTACHMENT";
+ String uri = formatMetadataUriToHistoryUri(versionedUri);
+ return new ResourceInfo(uri,columnName);
+ }
+
+ public static void updateResourceInfo(ResourceInfo info, String uri, Connection \
cnn)throws SQLException{ + PreparedStatement stmt = null;
+ String strSQL = "UPDATE WEBDAV.SLIDEMETADATA SET COLUMNCONTENTNAME = ?, ID = ? \
WHERE URI = ?"; + stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, info.getColumnContentName());
+ stmt.setString(2,info.getDocID());
+ stmt.setString(3, uri);
+ stmt.executeUpdate();
+ close(stmt);
+ }
+
+ public static void updateCollectionInfo(CollectionInfo info, String uri, Connection \
cnn)throws SQLException{ + PreparedStatement stmt = null;
+ String strSQL = "UPDATE WEBDAV.SLIDEMETADATA SET TABLESCHEMA = ?, TABLENAME = ?, \
COLUMNIDNAME = ?" + + " WHERE URI = ?";
+ //try{
+ stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, info.getTableSchema());
+ stmt.setString(2, info.getTableName());
+ //stmt.setString(3, info.getColumnName());
+ stmt.setString(3, info.getColumnIDName());
+ stmt.setString(4, uri);
+ stmt.executeUpdate();
+ //}catch(Exception ex){
+ //System.out.println(ex.toString());
+ //}
+ //finally{
+ close(stmt);
+ //}
+ }
+
+ public static boolean isExposedCollection(Hashtable descriptor){
+ if (descriptor != null){
+ for (Enumeration aEnum = descriptor.elements(); aEnum.hasMoreElements();) {
+ NodeRevisionDescriptor aRevisionDescriptor = (NodeRevisionDescriptor) \
aEnum.nextElement(); + NodeProperty prop = \
aRevisionDescriptor.getProperty("isExposedCollection"); + if(prop != null)
+ return true;
+ //String resourceType = aRevisionDescriptor.getResourceType();
+ //if(resourceType.indexOf("<collection/>") > -1)
+ //return true;
+ }
+ }
+ return false;
+ }
+
+ public static void updateExposedCollection(String uri, Connection cnn)throws \
SQLException{ + CallableStatement proc = null;
+
+ String strCommand = "<updates>" +
+ "<update col=\"1\" action=\"append\" \
path=\"data/descriptor/revisions/properties \">" + + "<property \
name=\"columncontentname\" namespace=\"DAV:\" \
value=\""+PureXMLUtilities.getExposedColumnContentName(PureXMLUtilities.getParentUri(uri, \
cnn), cnn)+"\" type=\"\" protected=\"false\">"+ + "<permissions/>"+
+ "</property>"+
+ "</update>" +
+ "</updates>";
+
+ String strCommand2 = "<updates>" +
+ "<update col=\"1\" action=\"append\" \
path=\"data/descriptor/revisions/properties \">" + + "<property \
name=\"isExposedCollection\" namespace=\"DAV:\" value=\"true\" type=\"\" \
protected=\"false\">"+ + "<permissions/>"+
+ "</property>"+
+ "</update>" +
+ "</updates>";
+
+ String strQuery = "SELECT METADATA FROM WEBDAV.SLIDEMETADATA WHERE URI = '"+ uri \
+"'"; + String strUpdate = "UPDATE WEBDAV.SLIDEMETADATA SET METADATA = ? WHERE URI = \
'"+ uri +"'"; +
+ proc = cnn.prepareCall("{ call WEBDAV.XMLUpdate(?,?,?,?,?) }");
+ proc.setString(1,strCommand);
+ proc.setString(2,strQuery);
+ proc.setString(3,strUpdate);
+ proc.registerOutParameter(4, Types.INTEGER);
+ proc.registerOutParameter(5, Types.VARCHAR);
+ proc.execute();
+
+ proc.setString(1, strCommand2);
+ proc.execute();
+
+ }
+
+ public static String getExposedColumnContentName(String uri, Connection cnn)throws \
SQLException{ + String strSQL = "SELECT \
xmlquery('$i//property[@name=\"columncontentname\"]' passing METADATA as \"i\") FROM \
WEBDAV.SLIDEMETADATA WHERE URI= ? "; + String retValue = null;
+ Document xmlDoc = null;
+ Element rootElem = null;
+ SAXBuilder sax = new SAXBuilder();
+ PreparedStatement stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1,uri);
+ ResultSet rs = stmt.executeQuery();
+ while(rs.next()){
+ retValue = rs.getString(1);
+ }
+ close(stmt);
+ if(retValue != null){
+ try{
+ xmlDoc = sax.build(new StringReader(retValue));
+ rootElem = xmlDoc.getRootElement();
+ retValue = rootElem.getAttributeValue("value");
+ }catch(JDOMException ex){
+ }catch(IOException io){}
+ }
+ return retValue;
+ }
+
+ public static boolean isExposedCollection(String uri, Connection cnn)throws \
SQLException{ + boolean isExposed = false;
+ String strSQL = "SELECT 1 FROM WEBDAV.SLIDEMETADATA as SLIDE " +
+ "WHERE XMLExists('$n/data/descriptor/revisions/properties[property/@name = \
\"isExposedCollection\"]' " + + "passing slide.metadata as \"n\") AND slide.uri = \
?"; +
+ PreparedStatement stmt = null;
+ stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, uri);
+ ResultSet rs = stmt.executeQuery();
+ isExposed = rs.next();
+
+ close(stmt);
+ return isExposed;
+ }
+
+ public static boolean isCollection(Hashtable descriptor){
+ if (descriptor != null){
+ for (Enumeration aEnum = descriptor.elements(); aEnum.hasMoreElements();) {
+ NodeRevisionDescriptor aRevisionDescriptor = (NodeRevisionDescriptor) \
aEnum.nextElement(); + String resourceType = \
aRevisionDescriptor.getResourceType(); \
+ if(resourceType.indexOf("<collection/>") > -1) + return true;
+ }
+ }
+ return false;
+ }
+
+ public static ResourceInfo getResourceInfo(String uri, Connection cnn)throws \
SQLException{ + PreparedStatement stmt = null;
+ ResultSet rs = null;
+ ResourceInfo rInfo = null;
+ String tmpColName = (uri.startsWith("/history")) ? "ID" : "URI";
+ String strSQL = "SELECT ID, COLUMNCONTENTNAME FROM WEBDAV.SLIDEMETADATA WHERE \
"+tmpColName+" = ?"; + stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, uri);
+ rs = stmt.executeQuery();
+ while(rs.next()){
+ rInfo = new ResourceInfo(rs.getString(1), rs.getString(2));
+ }
+ close(stmt);
+ return rInfo;
+ }
+
+ public static CollectionInfo getCollectionInfo(String uri, Connection cnn)throws \
SQLException{ + if(uri==null)
+ return null;
+ if(uri.equals("/.def.xml"))
+ return new CollectionInfo(uri);
+ if(uri.startsWith("/history"))
+ return new CollectionInfo(uri);
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+ CollectionInfo info = null;
+ String strSQL = "SELECT TABLESCHEMA, TABLENAME, COLUMNIDNAME FROM \
WEBDAV.SLIDEMETADATA WHERE URI = ?"; + //try{
+ stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, uri);
+ rs = stmt.executeQuery();
+ while(rs.next())
+ info = new CollectionInfo(rs.getString(1), rs.getString(2), rs.getString(3));
+ //}catch(Exception ex){
+ //System.out.println(ex.toString());
+ //}
+ //finally{
+ close(stmt);
+ //}
+ return info;
+ }
+
+ public static String getXMLQueryString(boolean isExcelDoc, CollectionInfo cInfo, \
ResourceInfo rInfo){ + if(isExcelDoc){
+ return "SELECT XMLSERIALIZE(" + rInfo.getColumnContentName() + " AS BLOB(1000M) \
INCLUDING XMLDECLARATION)" + + " FROM " + cInfo.getTableSchema() + "." + \
cInfo.getTableName() + " WHERE " + + cInfo.getColumnIDName() + " = ?";
+ }
+ return "SELECT XMLSERIALIZE(" + rInfo.getColumnContentName() + " AS BLOB(1000M))" \
+ + " FROM " + cInfo.getTableSchema() + "." + cInfo.getTableName() + " WHERE " +
+ cInfo.getColumnIDName() + " = ?";
+
+ /*if(isExcelDoc){
+ return "SELECT XMLSERIALIZE(DATA AS BLOB(1M) INCLUDING XMLDECLARATION) FROM \
WEBDAV.DATADEFAULT WHERE " + + "ID = ?";
+ }
+ return "SELECT XMLSERIALIZE(DATA AS BLOB(1M)) FROM WEBDAV.DATADEFAULT WHERE ID = \
?";*/ + }
+
+ public static String getParentUri(String resourceUri, Connection cnn)throws \
SQLException{ + PreparedStatement stmt = null;
+ String uri = null;
+ ResultSet rs = null;
+ String strSQL = "SELECT \
XMLQUERY('fn:data($m[1]/data/objectnode/parents/parent/@uuri)' " + + "passing by \
ref SLIDE.METADATA as \"m\" returning sequence) FROM " + + "WEBDAV.SLIDEMETADATA \
as SLIDE WHERE " + + "SLIDE.URI = ?";
+ stmt = cnn.prepareStatement(strSQL);
+ stmt.setString(1, resourceUri);
+ rs = stmt.executeQuery();
+ while(rs.next())
+ uri = rs.getString(1);
+ close(stmt);
+ return (uri==null) ? null : (uri + ".def.xml");
+ }
+
+ public static String getParentUri(ObjectNode obj){
+ if(obj.getUri().equals("/"))
+ return "/.def.xml";
+ if(obj.getUri().startsWith("/history"))
+ return "/history.def.xml";
+ Enumeration aEnum = obj.enumerateParentBindings();
+ ObjectNode.Binding binding = null;
+ String tmpUri = null;
+ while (aEnum.hasMoreElements()) {
+ binding = (ObjectNode.Binding) aEnum.nextElement();
+ tmpUri = binding.getUuri() + ".def.xml";
+ }
+ return tmpUri;
+ }
+
+ private static void close(PreparedStatement stmt){
+ try{
+ stmt.close();
+ }catch(Exception ex){}
+ }
+}
\ No newline at end of file
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/ResourceInfo.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/ResourceInfo.java?view=auto&rev=524298
==============================================================================
--- jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/ResourceInfo.java \
(added)
+++ jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/ResourceInfo.java \
Fri Mar 30 15:24:26 2007 @@ -0,0 +1,21 @@
+
+package com.ibm.db2.purexml;
+
+public class ResourceInfo {
+
+ private String _columnContentName;
+ private String _docID;
+
+ public ResourceInfo(String docID, String columnContentName){
+ this._columnContentName = columnContentName;
+ this._docID = docID;
+ }
+
+ public String getDocID(){
+ return this._docID;
+ }
+
+ public String getColumnContentName(){
+ return this._columnContentName;
+ }
+}
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/StoreContentZip.java
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/StoreContentZip.java?view=auto&rev=524298
==============================================================================
--- jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/StoreContentZip.java \
(added)
+++ jakarta/slide/trunk/proposals/purexmladapter/slide/com/ibm/db2/purexml/StoreContentZip.java \
Fri Mar 30 15:24:26 2007 @@ -0,0 +1,149 @@
+/*
+ * $Header: /cvs/slide/src/stores/com/ibm/db2/purexml/StoreContentZip.java,v 1.1 \
2006/11/28 19:44:20 zocourto Exp $ + * $Revision: 1.1 $
+ * $Date: 2006/11/28 19:44:20 $
+ *
+ * ====================================================================
+ *
+ * Copyright 1999-2003 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.ibm.db2.purexml;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * Title: StoreContentZip
+ *
+ * This util class can generally be used to zip/unzip an inputstream
+ * Returns the zip/unzip data as both output/input streams. This is used
+ * in the J2EEContentStore
+ * @version $Revision: 1.1 $
+ */
+
+class StoreContentZip {
+
+ protected static final int ZIP_BUFFER = 2048;
+ private long contentLength = 0;
+ private long initialContentLength = -1;
+ private OutputStream theOS = null;
+
+ /**
+ * Constructor for StoreContentZip.
+ */
+ public StoreContentZip() {
+ super();
+ contentLength = 0;
+ }
+
+ /**
+ * This method compress the input stream and returns the outputstream
+ * @param InputStream inIPS
+ * @exception IOException,ZipException
+ * @return the compressed OutputStream
+ */
+
+ public void Zip(InputStream inIPS)
+ throws IOException, ZipException{
+ int byteCount = 0;
+ contentLength = 0;
+ initialContentLength = 0;
+ byte data[] = new byte[ZIP_BUFFER];
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipOutputStream zoutp = new ZipOutputStream(baos);
+ zoutp.putNextEntry(new ZipEntry("zippedfile"));
+ while((byteCount = inIPS.read(data,0,ZIP_BUFFER)) != -1 ) {
+ zoutp.write(data,0,byteCount);
+ initialContentLength += byteCount;
+ }
+ zoutp.finish();
+ zoutp.flush();
+ zoutp.close();
+ baos.flush();
+ baos.close();
+ contentLength = (long)baos.size();
+ theOS = baos;
+ }
+
+ /**
+ * This method decompress the input stream and returns the outputstream
+ * @param InputStream inIPS
+ * @exception IOException,ZipException
+ * @return the decompressed OutputStream
+ */
+ public void UnZip(InputStream inIPS)
+ throws IOException, ZipException{
+ int byteCount = 0;
+ contentLength = 0;
+ byte indata[] = new byte[ZIP_BUFFER];
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ZipInputStream zinp = new ZipInputStream(inIPS);
+ while (zinp.getNextEntry() != null) {
+ while ((byteCount = zinp.read(indata,0,ZIP_BUFFER)) != -1 ) {
+ baos.write(indata,0,byteCount);
+ }
+ }
+ contentLength = (long)baos.size();
+ baos.flush();
+ baos.close();
+ zinp.close();
+ theOS = baos;
+ }
+
+ /**
+ * This method returns the compressed/decompressed stream as InputStream
+ * @param void
+ * @exception IOException,ZipException
+ * @return the processed InputStream
+ */
+ public InputStream getInputStream()
+ throws IOException, ZipException{
+ return new ByteArrayInputStream(
+ ((ByteArrayOutputStream)theOS).toByteArray());
+ }
+
+ /**
+ * This method returns the compressed/decompressed stream as O/PStream
+ * @param void
+ * @exception IOException,ZipException
+ * @return the processed InputStream
+ */
+ public OutputStream getOutputStream()
+ throws IOException, ZipException{
+ return theOS;
+ }
+
+ /**
+ * Gets the length.
+ * @return return the length of the un/compressed Stream
+ */
+ public long getContentLength() {
+ return contentLength;
+ }
+
+ public long getInitialContentLength() {
+ return initialContentLength;
+ }
+
+}
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/db2purexml-stores-1.0.jar
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/db2purexml-stores-1.0.jar?view=auto&rev=524298
==============================================================================
Binary file - no diff available.
Propchange: jakarta/slide/trunk/proposals/purexmladapter/slide/db2purexml-stores-1.0.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/DB2XMLFUNCTIONS.jar
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/DB2XMLFUNCTIONS.jar?view=auto&rev=524298
==============================================================================
Binary file - no diff available.
Propchange: jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/DB2XMLFUNCTIONS.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/PUREXMLSP.jar
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/PUREXMLSP.jar?view=auto&rev=524298
==============================================================================
Binary file - no diff available.
Propchange: jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/PUREXMLSP.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/setup.db2
URL: http://svn.apache.org/viewvc/jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/setup.db2?view=auto&rev=524298
==============================================================================
--- jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/setup.db2 (added)
+++ jakarta/slide/trunk/proposals/purexmladapter/slide/dbsetup/setup.db2 Fri Mar 30 \
15:24:26 2007 @@ -0,0 +1,135 @@
+-- To run this file type "db2 -tvf setup.db2" from the DB2 command line processor.
+--
+--echo ~~~~~~~~~~~~~~~~~;
+--echo ~ Create XML DB ~;
+--echo ~~~~~~~~~~~~~~~~~;
+
+create database SLIDEXML using codeset utf-8 territory us;
+
+--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+--echo ~ Configuring DB2 Server ~;
+--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+
+--update database configuration for SLIDEXML using app_ctl_heap_sz 8192;
+--update database configuration for SLIDEXML using LOGFILSIZ 4000;
+--update database configuration for SLIDEXML using applheapsz 8192;
+--update dbm cfg using JAVA_HEAP_SZ 4096;
+
+--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+--echo ~ Restart DB for configuration to take place ~;
+--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+
+--db2stop;
+--db2start;
+
+echo ~~~~~~~~~~~~~~~~~;
+echo ~ CONNECT TO DB ~;
+echo ~~~~~~~~~~~~~~~~~;
+
+connect to SLIDEXML;
+
+echo ~~~~~~~~~~~~~~~~~~~~~~~;
+echo ~ DROP STORAGE TABLES ~;
+echo ~~~~~~~~~~~~~~~~~~~~~~~;
+
+DROP TABLE WEBDAV.SLIDEMETADATA;
+DROP TABLE WEBDAV.DATADEFAULT;
+DROP TABLE WEBDAV.HISTORY;
+
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~;
+echo ~ DROP STORED PROCEDURES ~;
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~;
+
+DROP PROCEDURE WEBDAV.enable;
+DROP PROCEDURE WEBDAV.registerColumn;
+DROP PROCEDURE WEBDAV.createCollection;
+DROP PROCEDURE WEBDAV.XMLUPDATE;
+
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~;
+echo ~ CREATE TABLES ~;
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~;
+CREATE TABLE WEBDAV.SLIDEMETADATA
+(
+ URI VARCHAR(500) not null,
+ METADATA XML not null,
+ ID VARCHAR(500) DEFAULT '0',
+ TABLESCHEMA VARCHAR(256),
+ TABLENAME VARCHAR(256),
+ COLUMNCONTENTNAME VARCHAR(256),
+ COLUMNIDNAME VARCHAR(256),
+ CONSTRAINT "URI_PK" primary key(URI)
+);
+
+CREATE TABLE WEBDAV.DATADEFAULT
+(
+ ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ DATA XML,
+ ABOUT XML,
+ ATTACHMENT BLOB(1000m),
+ CONSTRAINT "ID_PK" primary key(ID)
+);
+
+CREATE TABLE WEBDAV.HISTORY
+(
+ URI VARCHAR(500) not null,
+ DATA XML,
+ ATTACHMENT BLOB(1000m),
+ CONSTRAINT "HISTID_PK" primary key(URI)
+);
+
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+echo ~ SETUP JARs FOR STORED PROCEDURES ~;
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+
+CALL SQLJ.REMOVE_JAR('WEBDAV.PUREXML_SLIDESP');
+CALL SQLJ.REMOVE_JAR('WEBDAV.DB2XMLFUNCTIONS');
+
+CALL SQLJ.INSTALL_JAR('file:c:/slide/dbsetup/PUREXMLSP.jar','WEBDAV.PUREXML_SLIDESP');
+CALL SQLJ.INSTALL_JAR('file:c:/slide/dbsetup/DB2XMLFUNCTIONS.jar','WEBDAV.db2xmlfunctions');
+
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+echo ~ CREATE STORED PROCEDURES ~;
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+
+CREATE PROCEDURE WEBDAV.enable( )
+ DYNAMIC RESULT SETS 0
+ LANGUAGE JAVA
+ EXTERNAL NAME 'WEBDAV.PUREXML_SLIDESP:com.ibm.db2.purexml.storeproc.PUREXMLSP.enable'
+ PARAMETER STYLE JAVA
+ NO DBINFO
+ NOT FENCED;
+
+CREATE PROCEDURE WEBDAV.registerColumn(IN SCHEMANAME VARCHAR(256), IN TABLENAME \
VARCHAR(256), IN COLUMNIDNAME VARCHAR(256), + IN COLUMNCONTENTNAME \
VARCHAR(256), IN CREATOR VARCHAR(100), IN AUTOVERSIONING VARCHAR(5), OUT \
outputMessage VARCHAR(32000)) + DYNAMIC RESULT SETS 0
+ LANGUAGE JAVA
+ EXTERNAL NAME 'WEBDAV.PUREXML_SLIDESP:com.ibm.db2.purexml.storeproc.PUREXMLSP.registerColumn'
+ PARAMETER STYLE JAVA
+ NO DBINFO
+ NOT FENCED;
+
+CREATE PROCEDURE WEBDAV.createCollection(IN PARENTPATH VARCHAR(200), IN \
COLLECTIONNAME VARCHAR(200), IN SCHEMANAME VARCHAR(256), + IN TABLENAME \
VARCHAR(256), IN COLUMNIDNAME VARCHAR(256), IN COLUMNCONTENTNAME VARCHAR(256), IN \
CREATOR VARCHAR(200)) + DYNAMIC RESULT SETS 0
+ LANGUAGE JAVA
+ EXTERNAL NAME 'WEBDAV.PUREXML_SLIDESP:com.ibm.db2.purexml.storeproc.PUREXMLSP.createCollection'
+ PARAMETER STYLE JAVA
+ NO DBINFO
+ NOT FENCED;
+
+CREATE PROCEDURE WEBDAV.XMLUPDATE(IN COMMANDSQL VARCHAR(32000), IN QUERYSQL \
VARCHAR(32000), IN UPDATESQL VARCHAR(32000), + OUT errorCode INTEGER, OUT \
errorMsg VARCHAR(32000)) + DYNAMIC RESULT SETS 0
+ LANGUAGE JAVA
+ PARAMETER STYLE JAVA
+ NO DBINFO
+ FENCED
+ EXTERNAL NAME 'WEBDAV.db2xmlfunctions:com.ibm.db2.xml.functions.XMLUpdate.Update';
+
+CALL SQLJ.REFRESH_CLASSES();
+
+
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+echo ~ CALL STORE PROCEDURE TO ENABLE ~;
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
+--db2 call webdav.enable
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic