You are viewing a plain text version of this content. The canonical link for it is here.
Posted to muse-commits@ws.apache.org by wi...@apache.org on 2005/10/06 21:16:03 UTC
svn commit: r306855 -
/webservices/muse/trunk/client/src/java/org/apache/ws/client/muse/client/impl/properties/ResourcePropertiesImpl.java
Author: wire
Date: Thu Oct 6 12:16:01 2005
New Revision: 306855
URL: http://svn.apache.org/viewcvs?rev=306855&view=rev
Log:
new
Added:
webservices/muse/trunk/client/src/java/org/apache/ws/client/muse/client/impl/properties/ResourcePropertiesImpl.java
Added: webservices/muse/trunk/client/src/java/org/apache/ws/client/muse/client/impl/properties/ResourcePropertiesImpl.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/client/src/java/org/apache/ws/client/muse/client/impl/properties/ResourcePropertiesImpl.java?rev=306855&view=auto
==============================================================================
--- webservices/muse/trunk/client/src/java/org/apache/ws/client/muse/client/impl/properties/ResourcePropertiesImpl.java (added)
+++ webservices/muse/trunk/client/src/java/org/apache/ws/client/muse/client/impl/properties/ResourcePropertiesImpl.java Thu Oct 6 12:16:01 2005
@@ -0,0 +1,681 @@
+package org.apache.ws.client.muse.client.impl.properties;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ws.addressing.EndpointReference;
+import org.apache.ws.addressing.XmlBeansEndpointReference;
+import org.apache.ws.client.muse.client.impl.ManageableResourceImpl;
+import org.apache.ws.client.muse.client.impl.exceptions.FaultException;
+import org.apache.ws.client.muse.client.impl.exceptions.UnexpectedServerResponseException;
+import org.apache.ws.client.muse.client.impl.stubs.ResourceStub;
+import org.apache.ws.client.muse.client.impl.stubs.ServiceStub;
+import org.apache.ws.client.muse.client.impl.wsrf.InsertOrUpdateRequest;
+import org.apache.ws.client.muse.client.impl.wsrf.SetPropertiesRequestImpl;
+import org.apache.ws.client.muse.client.model.PropertiesList;
+import org.apache.ws.muws.v1_0.capability.IdentityCapability;
+import org.apache.ws.util.XmlBeanUtils;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlDateTime;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlOptions;
+import org.apache.xmlbeans.impl.regex.ParseException;
+import org.apache.xmlbeans.impl.values.XmlAnyUriImpl;
+import org.apache.xmlbeans.impl.values.XmlBooleanImpl;
+import org.apache.xmlbeans.impl.values.XmlDateTimeImpl;
+import org.apache.xmlbeans.impl.values.XmlDoubleImpl;
+import org.apache.xmlbeans.impl.values.XmlIntImpl;
+import org.apache.xmlbeans.impl.values.XmlStringImpl;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.DeleteType;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.GetMultipleResourcePropertiesDocument;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.InsertType;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.QueryExpressionType;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.QueryResourcePropertiesDocument;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.QueryResourcePropertiesResponseDocument;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.SetResourcePropertiesDocument;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.UpdateType;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.GetMultipleResourcePropertiesDocument.GetMultipleResourceProperties;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.QueryResourcePropertiesDocument.QueryResourceProperties;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.SetResourcePropertiesDocument.SetResourceProperties;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.impl.GetMultipleResourcePropertiesResponseDocumentImpl;
+import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.impl.SetResourcePropertiesResponseDocumentImpl;
+import org.xmlsoap.schemas.soap.envelope.impl.FaultImpl;
+import org.xmlsoap.schemas.ws.x2004.x08.addressing.EndpointReferenceDocument;
+
+public class ResourcePropertiesImpl {
+ protected EndpointReference epr;
+
+ protected ResourceStub rs;
+
+ protected ServiceStub ss;
+
+ private static Log LOG = LogFactory.getLog(ManageableResourceImpl.class);
+
+ /**
+ * Creates a ManageableResource from a class that implements
+ * EndpointReference.
+ *
+ * @param epr
+ * @throws MalformedURLException
+ */
+ public ResourcePropertiesImpl(EndpointReference epr)
+ throws MalformedURLException {
+ super();
+ this.epr = epr;
+ this.rs = new ResourceStub(epr);
+ this.ss = new ServiceStub(new URL(epr.getAddress()));
+ }
+
+ /**
+ * Creates a MangeableResource from an EPR persisted to a URL.
+ *
+ * @param url
+ * @throws MalformedURLException
+ * @throws XmlException
+ * @throws IOException
+ */
+ public ResourcePropertiesImpl(URL url) throws MalformedURLException,
+ XmlException, IOException {
+ this(getEprFromUrl(url));
+ }
+
+ /**
+ * Creates a MangeableResource from an Sting based text.
+ *
+ * @param url
+ * @throws MalformedURLException
+ * @throws XmlException
+ * @throws IOException
+ */
+ public ResourcePropertiesImpl(String txt) throws MalformedURLException,
+ XmlException, IOException {
+ this(getEprFromXmlText(txt));
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getId()
+ */
+ public String getId() throws FaultException,
+ UnexpectedServerResponseException, URISyntaxException, IOException,
+ XmlException {
+ LOG.info("Calling getId on " + this.epr.getAddress());
+ XmlObject[] parts = rs
+ .getResourceProperty(IdentityCapability.PROP_NAME_RESOURCE_ID);
+ for (int i = 0; i < parts.length; i++) {
+ XmlObject xmlObject = parts[i];
+ if (xmlObject instanceof XmlAnyUriImpl) {
+ XmlAnyUriImpl childElement = (XmlAnyUriImpl) xmlObject;
+ String value = childElement.getStringValue();
+
+ // Remove any namespace contained in the id.
+ if (value.indexOf(':') > -1) {
+ return value.split(":")[1];
+ }
+ return value;
+ }
+ }
+ throw new UnexpectedServerResponseException(
+ "Server returned either an unrecognizable response or no response at all");
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getPropertyAsString(javax.xml.namespace.QName)
+ */
+ public String getPropertyAsString(QName propertyName) throws FaultException, URISyntaxException, IOException, XmlException, UnexpectedServerResponseException{
+ LOG.info("getting property value "+propertyName+" from " + this.epr.getAddress());
+ XmlObject[] parts = rs.getResourceProperty(propertyName);
+ for (int i = 0; i < parts.length; i++) {
+ XmlObject xmlObject = parts[i];
+ if (xmlObject instanceof XmlStringImpl) {
+ XmlStringImpl childElement = (XmlStringImpl) xmlObject;
+ String value = childElement.getStringValue();
+ return value;
+ }
+ }
+ throw new UnexpectedServerResponseException(
+ "Server returned either an unrecognizable response or no String type was returned as a response.");
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getEpr()
+ */
+ public EndpointReference getEpr() {
+ return epr;
+ }
+
+ public static EndpointReference getEprFromUrl(URL url) throws XmlException,
+ IOException {
+ LOG.debug("Connecting to URL for EPR: " + url.toString());
+ EndpointReferenceDocument eprd = (EndpointReferenceDocument) XmlObject.Factory
+ .parse(url);
+ return new XmlBeansEndpointReference(eprd.getEndpointReference());
+ }
+
+ public static EndpointReference getEprFromXmlText(String txt)
+ throws XmlException, IOException {
+ LOG.debug("Parsing text for EPR: " + txt);
+ ByteArrayInputStream stream = new ByteArrayInputStream(txt.getBytes());
+ EndpointReferenceDocument eprd = (EndpointReferenceDocument) XmlObject.Factory
+ .parse(stream);
+ return new XmlBeansEndpointReference(eprd.getEndpointReference());
+ }
+
+ /* Returns a specific property value as a double.
+ *
+ */
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getPropertyAsDouble(javax.xml.namespace.QName)
+ */
+ public double getPropertyAsDouble(QName propertyName) throws FaultException, URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+ LOG.info("getting property value "+propertyName+" from " + this.epr.getAddress());
+ XmlObject[] parts = rs.getResourceProperty(propertyName);
+ for (int i = 0; i < parts.length; i++) {
+ XmlObject xmlObject = parts[i];
+ if (xmlObject instanceof XmlDoubleImpl) {
+ XmlDoubleImpl childElement = (XmlDoubleImpl) xmlObject;
+ double value = childElement.getDoubleValue();
+ return value;
+ }
+ }
+ throw new UnexpectedServerResponseException(
+ "Server returned either an unrecognizable response or no String type was returned as a response.");
+ }
+
+ /*
+ * Returns a specific property value as an integer.
+ */
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getPropertyAsInt(javax.xml.namespace.QName)
+ */
+ public int getPropertyAsInt(QName propertyName) throws FaultException, URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+ LOG.info("getting property value "+propertyName+" from " + this.epr.getAddress());
+ XmlObject[] parts = rs.getResourceProperty(propertyName);
+ for (int i = 0; i < parts.length; i++) {
+ XmlObject xmlObject = parts[i];
+ if (xmlObject instanceof XmlIntImpl) {
+ XmlIntImpl childElement = (XmlIntImpl) xmlObject;
+ int value = childElement.getIntValue();
+ return value;
+ }
+ }
+ throw new UnexpectedServerResponseException(
+ "Server returned either an unrecognizable response or no String type was returned as a response.");
+ }
+
+ /*
+ * Returns a specific property value as an XmlDateTime object.
+ */
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getPropertyAsBoolean(javax.xml.namespace.QName)
+ */
+ public XmlDateTime getPropertyAsDateTime(QName propertyName) throws FaultException, URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+ LOG.info("getting property value "+propertyName+" from " + this.epr.getAddress());
+ XmlObject[] parts = rs.getResourceProperty(propertyName);
+ for (int i = 0; i < parts.length; i++) {
+ XmlObject xmlObject = parts[i];
+ if (xmlObject instanceof XmlDateTimeImpl) {
+ XmlDateTimeImpl childElement = (XmlDateTimeImpl) xmlObject;
+ return childElement;
+ }
+ }
+ throw new UnexpectedServerResponseException(
+ "Server returned either an unrecognizable response or no boolean type was returned as a response.");
+ }
+
+ /*
+ * Returns a specific property value as a bolean.
+ */
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getPropertyAsBoolean(javax.xml.namespace.QName)
+ */
+ public boolean getPropertyAsBoolean(QName propertyName) throws FaultException, URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+ LOG.info("getting property value "+propertyName+" from " + this.epr.getAddress());
+ XmlObject[] parts = rs.getResourceProperty(propertyName);
+ for (int i = 0; i < parts.length; i++) {
+ XmlObject xmlObject = parts[i];
+ if (xmlObject instanceof XmlBooleanImpl) {
+ XmlBooleanImpl childElement = (XmlBooleanImpl) xmlObject;
+ boolean value = childElement.getBooleanValue();
+ return value;
+ }
+ }
+ throw new UnexpectedServerResponseException(
+ "Server returned either an unrecognizable response or no boolean type was returned as a response.");
+ }
+
+ /* Returns a specific property value as a untyped property as XMLObject[]. For clients
+ * preferring to parse pure XML.
+ *
+ */
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getProperty(javax.xml.namespace.QName)
+ */
+ public XmlObject[] getProperty(QName propertyName) throws FaultException, URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+ LOG.info("getting property value "+propertyName+" from " + this.epr.getAddress());
+ XmlObject[] parts = rs.getResourceProperty(propertyName);
+ return parts;
+ }
+ /* (non-Javadoc)
+ * @see org.apache.ws.client.muse.client.impl.ManageableResource#getPropertyQNames()
+ */
+ public QName[] getPropertyQNames() throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException {
+ QueryResourcePropertiesDocument queryDocument = QueryResourcePropertiesDocument.Factory.newInstance();
+ QueryResourceProperties query = queryDocument.addNewQueryResourceProperties();
+ QueryExpressionType expression = query.addNewQueryExpression();
+ expression.setDialect("http://www.w3.org/TR/1999/REC-xpath-19991116");
+ XmlCursor cursor = expression.newCursor();
+ cursor.setTextValue("/");
+ cursor.dispose();
+
+ XmlObject parts = rs.sendRequest(queryDocument,"http://queryresourcepropertydocument");
+
+ if(!(parts instanceof QueryResourcePropertiesResponseDocument.QueryResourcePropertiesResponse))
+ throw new UnexpectedServerResponseException("Expected QueryResourcePropertiesResponseDocument but received "+parts.getClass().getName());
+ QueryResourcePropertiesResponseDocument.QueryResourcePropertiesResponse response=(QueryResourcePropertiesResponseDocument.QueryResourcePropertiesResponse)parts;
+ cursor=response.newCursor();
+ cursor.toChild(0);
+ cursor.toFirstChild();
+ Vector infoList = new Vector(20);
+ QName propName=cursor.getName();
+ infoList.add(propName);
+ while(cursor.toNextSibling()){
+ propName=cursor.getName();
+ infoList.add(propName);
+ }
+ cursor.dispose();
+ return (QName[]) infoList.toArray(new QName[0]);
+ }
+
+ /* Takes a list of QNames that constitute the requested list of properties to retrieve.
+ * Returns XmlObject instances as there is not guarantee that we'll receive anything more specific,
+ * therefore just returning fragments.
+ */
+ public XmlObject[] getMultipleResourceProperties(QName[] requestedValues) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException {
+
+ //Create MultipleResourceProperties document
+ GetMultipleResourcePropertiesDocument gmpDoc = GetMultipleResourcePropertiesDocument.Factory.newInstance();
+
+ //Build the query to be included in that document
+ GetMultipleResourceProperties query = gmpDoc.addNewGetMultipleResourceProperties();
+
+ //Iterate through QName[] to add each property
+ for (int i = 0; i < requestedValues.length; i++) {
+ query.addResourceProperty(requestedValues[i]);
+ }
+
+ //Now send the request
+ XmlObject parts = rs.sendRequest(gmpDoc,"http://getmultipleresourcepropertydocument");
+
+ if(!(parts instanceof GetMultipleResourcePropertiesResponseDocumentImpl.GetMultipleResourcePropertiesResponseImpl))
+ throw new UnexpectedServerResponseException("Expected GetMultipleResourcePropertiesResponseDocumentImpl but received "+parts.getClass().getName());
+
+ //type cast and walk the array to extract the responses
+ GetMultipleResourcePropertiesResponseDocumentImpl.GetMultipleResourcePropertiesResponseImpl response = (GetMultipleResourcePropertiesResponseDocumentImpl.GetMultipleResourcePropertiesResponseImpl)parts;
+
+ //Create cursor to walk through the response.
+ XmlCursor cursor = response.newCursor();
+ cursor.toChild(0);
+ cursor.toFirstChild();
+
+ XmlObject obj = cursor.getObject();
+ Vector infoList = new Vector(20);
+
+ //extract the first XmlObject
+ XmlObject prop=cursor.getObject();
+ infoList.add(prop);
+
+ //walk the sibling list to extract all objects
+ while(cursor.toNextSibling()){
+ prop=cursor.getObject();
+ infoList.add(prop);
+ }
+ cursor.dispose();
+
+ return (XmlObject[]) infoList.toArray(new XmlObject[0]);
+ }
+
+// //Spec method.
+// public XmlObject getResourcePropertyDocument() throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+//// public XmlObject[] getResourcePropertyDocument() throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+//
+// //Create GetResourcePropertyDocument document
+// GetResourcePropertyDocument resPropDoc = GetResourcePropertyDocument.Factory.newInstance();
+//// GetMultipleResourcePropertiesDocument gmpDoc = GetMultipleResourcePropertiesDocument.Factory.newInstance();
+//
+// //Build the query to be included in that document
+//// XmlDocumentProperties query = resPropDoc.documentProperties();
+//// XmlDocumentProperties query = resPropDoc.();
+//// GetMultipleResourceProperties query = gmpDoc.addNewGetMultipleResourceProperties();
+//
+// //Now send the request
+// XmlObject parts = rs.sendRequest(resPropDoc,
+// "http://docs.oasis-open.org/wsrf/rpw-1/GetResourcePropertyDocument/GetResourcePropertyDocumentRequest","M");
+//// XmlObject parts = rs.sendRequest(resPropDoc,"http://getresourcepropertydocument","M");
+//// XmlObject parts = rs.sendRequest(gmpDoc,"http://getmultipleresourcepropertydocument","M");
+//
+// if(!(parts instanceof GetResourcePropertyDocumentImpl))
+// throw new UnexpectedServerResponseException("Expected GetResourcePropertyDocumentImpl but received "+parts.getClass().getName());
+//// if(!(parts instanceof GetMultipleResourcePropertiesResponseDocumentImpl.GetMultipleResourcePropertiesResponseImpl))
+//// throw new UnexpectedServerResponseException("Expected GetMultipleResourcePropertiesResponseDocumentImpl but received "+parts.getClass().getName());
+//
+// //type cast and walk the array to extract the responses
+// GetResourcePropertyDocumentImpl response = (GetResourcePropertyDocumentImpl)parts;
+//// GetMultipleResourcePropertiesResponseDocumentImpl.GetMultipleResourcePropertiesResponseImpl response = (GetMultipleResourcePropertiesResponseDocumentImpl.GetMultipleResourcePropertiesResponseImpl)parts;
+//
+// //Create cursor to walk through the response.
+// XmlCursor cursor = response.newCursor();
+// cursor.toChild(0);
+// cursor.toFirstChild();
+//
+//// XmlObject obj = cursor.getObject();
+//// Vector infoList = new Vector(20);
+//
+// //extract the first XmlObject
+// XmlObject prop=cursor.getObject();
+//// infoList.add(prop);
+////
+//// //walk the sibling list to extract all objects
+//// while(cursor.toNextSibling()){
+//// prop=cursor.getObject();
+//// infoList.add(prop);
+//// }
+// cursor.dispose();
+//
+// return prop;
+//// return (XmlObject[]) infoList.toArray(new XmlObject[0]);
+// }
+
+ /* Takes an XPath query and a dialect, and returns the results as an XMLObject[].
+ * Operation returns a subset of the ResourceProperties or an XPath operation on
+ * the same.
+ */
+ public XmlObject[] queryResourceProperties(String xpathExp, String xpthDialect) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException {
+
+ //build the query document
+ QueryResourcePropertiesDocument queryDocument = QueryResourcePropertiesDocument.Factory.newInstance();
+ //add the query properties component
+ QueryResourceProperties query = queryDocument.addNewQueryResourceProperties();
+ //add the query expression
+ QueryExpressionType expression = query.addNewQueryExpression();
+ //set the specific dialect to use
+ expression.setDialect("http://www.w3.org/TR/1999/REC-xpath-19991116");
+ expression.setDialect(xpthDialect.trim());
+ //Manipulate the xml
+ XmlCursor cursor = expression.newCursor();
+ //insert the xpath component
+ cursor.setTextValue(xpathExp);
+ cursor.dispose();
+
+ XmlObject parts = rs.sendRequest(queryDocument,"http://queryresourcepropertydocument");
+ if(parts instanceof FaultImpl)
+ throw new FaultException(parts.toString());
+ if(!(parts instanceof QueryResourcePropertiesResponseDocument.QueryResourcePropertiesResponse))
+ throw new UnexpectedServerResponseException("Expected QueryResourcePropertiesResponseDocument but received "+parts.getClass().getName());
+
+ //cast to response
+ QueryResourcePropertiesResponseDocument.QueryResourcePropertiesResponse response=(QueryResourcePropertiesResponseDocument.QueryResourcePropertiesResponse)parts;
+
+ //navigate the document to retrieve all the properties
+ cursor=response.newCursor();
+ cursor.toChild(0);
+ cursor.toFirstChild();
+
+ //store all encountered responses
+ Vector infoList = new Vector(20);
+ XmlObject propValue=cursor.getObject();
+ infoList.add(propValue);
+
+ //for numerous response components
+ while(cursor.toNextSibling()){
+ propValue=cursor.getObject();
+ infoList.add(propValue);
+ }
+ cursor.dispose();
+
+ //build the response
+ return (XmlObject[]) infoList.toArray(new XmlObject[0]);
+ }
+
+ private boolean updateProperty(QName property, String[] updates) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException {
+ boolean success;
+ //update that property
+ SetPropertiesRequestImpl setRequest = new SetPropertiesRequestImpl();
+ boolean completed =setRequest.addUpdateRequest(property,updates);
+ setProperties(setRequest);
+ success = true;
+ return success;
+ }
+
+ public void updateProperty(QName property, XmlObject update) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException {
+ String xmlText;
+ XmlOptions opts = new XmlOptions();
+ opts.setSaveOuter();
+ opts.setSavePrettyPrint();
+ xmlText=update.xmlText(opts);
+ updateProperty(property,xmlText);
+ }
+
+ public void updateProperty(QName property, double newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] updates = {String.valueOf(newValue)};
+ updateProperty(property, updates);
+ }
+ public void updateProperty(QName property, int newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] updates = {String.valueOf(newValue)};
+ updateProperty(property, updates);
+ }
+ public void updateProperty(QName property, float newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] updates = {String.valueOf(newValue)};
+ updateProperty(property, updates);
+ }
+ public void updateProperty(QName property, String newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] updates = {newValue};
+ updateProperty(property, updates);
+ }
+ public void updateProperty(QName property, boolean newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] updates = {String.valueOf(newValue)};
+ updateProperty(property, updates);
+ }
+
+ private void insertProperty(QName property, String[] updates) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException {
+ boolean success;
+ //insert that property
+ SetPropertiesRequestImpl setRequest = new SetPropertiesRequestImpl();
+ boolean completed =setRequest.addInsertRequest(property,updates);
+ setProperties(setRequest);
+ success = true;
+ }
+
+ public void insertProperty(QName property, double newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] inserts = {String.valueOf(newValue)};
+ insertProperty(property, inserts);
+ }
+ public void insertProperty(QName property, int newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] inserts = {String.valueOf(newValue)};
+ insertProperty(property, inserts);
+ }
+ public void insertProperty(QName property, float newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] inserts = {String.valueOf(newValue)};
+ insertProperty(property, inserts);
+ }
+ public void insertProperty(QName property, String newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] inserts = {newValue};
+ insertProperty(property, inserts);
+ }
+ public void insertProperty(QName property, boolean newValue) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ String[] inserts = {String.valueOf(newValue)};
+ insertProperty(property, inserts);
+ }
+
+ public void deleteProperty(QName propertyToDelete) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException{
+ boolean success = false;
+ //delete that property
+ SetPropertiesRequestImpl setRequest = new SetPropertiesRequestImpl();
+ boolean completed =setRequest.addDeleteRequest(propertyToDelete);
+ setProperties(setRequest);
+ }
+
+ /* updateProperties takes a SetPropertiesRequest instance which defines
+ * Insert, Update and Delete requests and the order in which they were made.
+ */
+ public XmlObject setProperties(PropertiesList modificationList) throws URISyntaxException, IOException, XmlException, UnexpectedServerResponseException, FaultException {
+
+ //build the SetResourceProperties document
+ SetResourcePropertiesDocument setPropsDocument =
+ SetResourcePropertiesDocument.Factory.newInstance();
+ //add the set properties component
+ SetResourceProperties request = setPropsDocument.addNewSetResourceProperties();
+ XmlCursor cursor = null;
+
+ //iterate through the SetPropertiesRequest to populate the SetResourcePropertiesDocument
+ for (int i = 0; i < modificationList.getAllResourcesIndex(); i++) {
+
+ //Retrieve the current object
+ Object resMod = modificationList.getAllSetResourceRequests().get(i);
+
+ if (resMod instanceof QName) { //Then this is a delete request
+ QName deleteParameter = (QName) resMod;
+ //Then create the xml for the delete
+ DeleteType delete =request.addNewDelete();
+ delete.setResourceProperty(deleteParameter);
+ }
+ else{//then is an insert or update request
+ InsertOrUpdateRequest custRequest = (InsertOrUpdateRequest)resMod;
+ if(custRequest.isInsert()){//then generate xml for insert
+ //is an insert request. Building appropriate xml
+ //add the insert expression
+ InsertType modification = request.addNewInsert();
+ //Manipulate the xml
+ cursor = modification.newCursor();
+
+ //add all update parameters to the current node
+ addItemsToNode(custRequest.getProperty(),cursor,custRequest.getPropetyValues());
+ }
+ else{//is an update request. Building appropriate xml
+ //add the update expression
+ UpdateType modification = request.addNewUpdate();
+ //Manipulate the xml
+ cursor = modification.newCursor();
+
+ //add all update parameters to the current node
+ addItemsToNode(custRequest.getProperty(),cursor,custRequest.getPropetyValues());
+ }
+ }
+ }
+
+ validateXmlBean(setPropsDocument);
+
+ XmlObject parts = rs.sendRequest(setPropsDocument,"http://docs.oasis-open.org/wsrf/2004/06/WS-ResourceProperties/SetResourceProperties");
+ if(parts instanceof FaultImpl)
+ throw new FaultException(parts.toString());
+ if(!(parts instanceof SetResourcePropertiesResponseDocumentImpl.SetResourcePropertiesResponseImpl))
+ throw new UnexpectedServerResponseException("Expected SetResourcePropertiesResponseDocumentImpl but received "+parts.getClass().getName());
+
+ //cast to response
+ SetResourcePropertiesResponseDocumentImpl.SetResourcePropertiesResponseImpl response
+ =(SetResourcePropertiesResponseDocumentImpl.SetResourcePropertiesResponseImpl)parts;
+
+ //navigate the document to retrieve all the properties
+ cursor=response.newCursor();
+ cursor.toChild(0);
+ cursor.toFirstChild();
+
+ //store all encountered responses
+ Vector infoList = new Vector(20);
+ XmlObject propValue=cursor.getObject();
+ infoList.add(propValue);
+
+ //for numerous response components
+ while(cursor.toNextSibling()){
+ propValue=cursor.getObject();
+ infoList.add(propValue);
+ }
+ cursor.dispose();
+
+ return propValue;
+ }
+
+ /* AddItemsToNode: this method takes: XmlCursor, QName[] and String[].
+ * adds an element for each corresponding QName and String value for each property.
+ */
+ private void addItemsToNode(QName propQname, XmlCursor cursor, String[] propList) throws IllegalArgumentException {
+ //store away reference to original cursor location
+ XmlCursor origCursorLocation = cursor.newCursor();
+
+ //For each property value encountered, create sub nodes
+ for (int i = 0; i < propList.length; i++) {
+ XmlCursor listCursorPosition = origCursorLocation.newCursor();
+ cursor = origCursorLocation.newCursor();
+ //Create a new node
+ cursor.insertElementWithText(propQname,propList[i]);
+ cursor.toParent();
+
+ cursor.toChild(propQname);
+ //move the cursor positioning
+ listCursorPosition.toNextToken();
+ //stitch the node into new location
+ cursor.copyXml(listCursorPosition);
+ //remove the original node
+ cursor.removeXml();
+ //clean up
+ cursor.dispose();
+ listCursorPosition.dispose();
+ }
+ }
+
+// public XmlObject[] getMetric(QName testmetric) throws FaultException, URISyntaxException, IOException, XmlException, UnexpectedServerResponseException {
+// LOG.info("getting Metric value "+testmetric+" from " + this.epr.getAddress());
+// XmlObject[] parts = rs.getResourceProperty(testmetric);
+// if(parts==null||parts.length==0){
+// throw new UnexpectedServerResponseException(
+// "Server returned no metric values in response.");
+// }
+//
+// XmlObject part = parts[0];
+// part.changeType();
+//
+// return parts;
+// }
+
+ public static void validateXmlBean(XmlObject requestXBean) throws ParseException{
+ XmlOptions validateOptions = new XmlOptions( );
+ List errorList = new ArrayList( );
+ validateOptions.setErrorListener( errorList );
+ boolean isValid = requestXBean.validate( validateOptions );
+ if ( !isValid )
+ {
+ QName bodyElemName = XmlBeanUtils.getName( requestXBean );
+ StringBuffer strBuf = new StringBuffer( "Request body element " );
+ strBuf.append( bodyElemName);
+ strBuf.append( " is not valid as per its schema: \n\n" );
+ for ( int i = 0; i < errorList.size( ); i++ )
+ {
+ strBuf.append( "\t\t" );
+ strBuf.append( i + 1 );
+ strBuf.append( ") " );
+ strBuf.append( errorList.get( i ) );
+ strBuf.append( "\n" );
+ }
+
+ strBuf.append( "\n" );
+ throw new ParseException(
+ strBuf.toString( ),0 );
+ }
+
+ }
+
+ //helper method to create SetPropertiesRequest instance
+ public PropertiesList createNewSetPropertiesRequest(){
+ return new SetPropertiesRequestImpl();
+ }
+}