예제 #1
0
        /// <summary>
        /// Login to the RQM server and perform some OSLC actions
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();

            CommandLineDictionary cmd = CommandLineDictionary.FromArguments(args);

            if (!ValidateOptions(cmd))
            {
                logger.Error("Syntax:  /url=https://<server>:port/<context>/ /user=<user> /password=<password> /project=\"<project_area>\"");
                logger.Error("Example: /url=https://exmple.com:9443/qm /user=ADMIN /password=ADMIN /project=\"JKE Banking (Quality Management)\"");
                return;
            }

            String webContextUrl = cmd["url"];
            String user          = cmd["user"];
            String passwd        = cmd["password"];
            String projectArea   = cmd["project"];

            try {
                //STEP 1: Initialize a Jazz rootservices helper and indicate we're looking for the QualityManagement catalog
                //RQM contains both Quality and Change Management providers, so need to look for QM specifically
                JazzRootServicesHelper helper = new JazzRootServicesHelper(webContextUrl, OSLCConstants.OSLC_QM_V2);

                //STEP 2: Create a new Form Auth client with the supplied user/password
                JazzFormAuthClient client = helper.InitFormClient(user, passwd);

                //STEP 3: Login in to Jazz Server
                if (client.FormLogin() == HttpStatusCode.OK)
                {
                    //STEP 4: Get the URL of the OSLC QualityManagement catalog
                    String catalogUrl = helper.GetCatalogUrl();

                    //STEP 5: Find the OSLC Service Provider for the project area we want to work with
                    String serviceProviderUrl = client.LookupServiceProviderUrl(catalogUrl, projectArea);

                    //STEP 6: Get the Query Capabilities URL so that we can run some OSLC queries
                    String queryCapability = client.LookupQueryCapability(serviceProviderUrl,
                                                                          OSLCConstants.OSLC_QM_V2,
                                                                          OSLCConstants.QM_TEST_RESULT_QUERY);

                    //SCENARIO A: Run a query for all TestResults with a status of passed with OSLC paging of 10 items per
                    //page turned on and list the members of the result
                    OslcQueryParameters queryParams = new OslcQueryParameters();
                    queryParams.SetWhere("oslc_qm:status=\"com.ibm.rqm.execution.common.state.passed\"");
                    OslcQuery query = new OslcQuery(client, queryCapability, 10, queryParams);

                    OslcQueryResult result = query.Submit();

                    bool processAsDotNetObjects = true;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);

                    Console.WriteLine("\n------------------------------\n");

                    //SCENARIO B:  Run a query for a specific TestResult selecting only certain
                    //attributes and then print it as raw XML.  Change the dcterms:title below to match a
                    //real TestResult in your RQM project area
                    OslcQueryParameters queryParams2 = new OslcQueryParameters();
                    queryParams2.SetWhere("dcterms:title=\"Consistent_display_of_currency_Firefox_DB2_WAS_Windows_S1\"");
                    queryParams2.SetSelect("dcterms:identifier,dcterms:title,dcterms:creator,dcterms:created,oslc_qm:status");
                    OslcQuery query2 = new OslcQuery(client, queryCapability, queryParams2);

                    OslcQueryResult     result2     = query2.Submit();
                    HttpResponseMessage rawResponse = result2.GetRawResponse();
                    ProcessRawResponse(rawResponse);
                    rawResponse.ConsumeContent();

                    //SCENARIO C:  RQM TestCase creation and update
                    TestCase testcase = new TestCase();
                    testcase.SetTitle("Accessibility verification using a screen reader");
                    testcase.SetDescription("This test case uses a screen reader application to ensure that the web browser content fully complies with accessibility standards");
                    testcase.AddTestsChangeRequest(new Link(new Uri("http://cmprovider/changerequest/1"), "Implement accessibility in Pet Store application"));

                    //Get the Creation Factory URL for test cases so that we can create a test case
                    String testcaseCreation = client.LookupCreationFactory(
                        serviceProviderUrl, OSLCConstants.OSLC_QM_V2,
                        testcase.GetRdfTypes()[0].ToString());

                    //Create the test case
                    HttpResponseMessage creationResponse = client.CreateResource(
                        testcaseCreation, testcase,
                        OslcMediaType.APPLICATION_RDF_XML);
                    creationResponse.ConsumeContent();
                    String testcaseLocation = creationResponse.Headers.Location.ToString();
                    Console.WriteLine("Test Case created a location " + testcaseLocation);

                    //Get the test case from the service provider and update its title property
                    testcase = client.GetResource(testcaseLocation,
                                                  OslcMediaType.APPLICATION_RDF_XML).Content.ReadAsAsync <TestCase>(client.GetFormatters()).Result;
                    testcase.SetTitle(testcase.GetTitle() + " (updated)");

                    //Create a partial update URL so that only the title will be updated.
                    //Assuming (for readability) that the test case URL does not already contain a '?'
                    String updateUrl = testcase.GetAbout() + "?oslc.properties=dcterms:title";

                    //Update the test case at the service provider
                    client.UpdateResource(updateUrl, testcase,
                                          OslcMediaType.APPLICATION_RDF_XML).ConsumeContent();
                }
            } catch (RootServicesException re) {
                logger.Error("Unable to access the Jazz rootservices document at: " + webContextUrl + "/rootservices", re);
            } catch (Exception e) {
                logger.Error(e.Message, e);
            }
        }
예제 #2
0
        /// <summary>
        /// Login to the RRC server and perform some OSLC actions
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();

            CommandLineDictionary cmd = CommandLineDictionary.FromArguments(args);

            if (!ValidateOptions(cmd))
            {
                logger.Error("Syntax:  /url=https://<server>:port/<context>/ /user=<user> /password=<password> /project=\"<project_area>\"");
                logger.Error("Example: /url=https://exmple.com:9443/rm /user=ADMIN /password=ADMIN /project=\"JKE Banking (Requirements Management)\"");
                return;
            }

            String webContextUrl = cmd["url"];
            String user          = cmd["user"];
            String passwd        = cmd["password"];
            String projectArea   = cmd["project"];

            try {
                //STEP 1: Initialize a Jazz rootservices helper and indicate we're looking for the RequirementManagement catalog
                JazzRootServicesHelper helper = new JazzRootServicesHelper(webContextUrl, OSLCConstants.OSLC_RM_V2);

                //STEP 2: Create a new Form Auth client with the supplied user/password
                //RRC is a fronting server, so need to use the initForm() signature which allows passing of an authentication URL.
                //For RRC, use the JTS for the authorization URL

                //This is a bit of a hack for readability.  It is assuming RRC is at context /rm.  Could use a regex or UriBuilder instead.
                String             authUrl = webContextUrl.Replace("/rm", "/jts"); // XXX - should be ReplaceFirst(), if it existed
                JazzFormAuthClient client  = helper.InitFormClient(user, passwd, authUrl);

                //STEP 3: Login in to Jazz Server
                if (client.FormLogin() == HttpStatusCode.OK)
                {
                    //STEP 4: Get the URL of the OSLC ChangeManagement catalog
                    String catalogUrl = helper.GetCatalogUrl();

                    //STEP 5: Find the OSLC Service Provider for the project area we want to work with
                    String serviceProviderUrl = client.LookupServiceProviderUrl(catalogUrl, projectArea);

                    //STEP 6: Get the Query Capabilities URL so that we can run some OSLC queries
                    String queryCapability = client.LookupQueryCapability(serviceProviderUrl,
                                                                          OSLCConstants.OSLC_RM_V2,
                                                                          OSLCConstants.RM_REQUIREMENT_TYPE);
                    //STEP 7: Create base requirements
                    //Get the Creation Factory URL for change requests so that we can create one
                    Requirement requirement        = new Requirement();
                    String      requirementFactory = client.LookupCreationFactory(
                        serviceProviderUrl, OSLCConstants.OSLC_RM_V2,
                        requirement.GetRdfTypes()[0].ToString());

                    //Get Feature Requirement Type URL
                    ResourceShape featureInstanceShape = RmUtil.LookupRequirementsInstanceShapes(
                        serviceProviderUrl, OSLCConstants.OSLC_RM_V2,
                        requirement.GetRdfTypes()[0].ToString(), client, "Feature");

                    Uri rootFolder = null;
                    //Get Collection Type URL
                    RequirementCollection collection = new RequirementCollection();
                    ResourceShape         collectionInstanceShape = RmUtil.LookupRequirementsInstanceShapes(
                        serviceProviderUrl, OSLCConstants.OSLC_RM_V2,
                        collection.GetRdfTypes()[0].ToString(), client, "Personal Collection");

                    String req01URL     = null;
                    String req02URL     = null;
                    String req03URL     = null;
                    String req04URL     = null;
                    String reqcoll01URL = null;

                    String primaryText = null;
                    if ((featureInstanceShape != null) && (requirementFactory != null))
                    {
                        // Create REQ01
                        requirement.SetInstanceShape(featureInstanceShape.GetAbout());
                        requirement.SetTitle("Req01");

                        // Decorate the PrimaryText
                        primaryText = "My Primary Text";
                        XElement obj = RmUtil.ConvertStringToHTML(primaryText);
                        requirement.GetExtendedProperties().Add(RmConstants.PROPERTY_PRIMARY_TEXT, obj);

                        requirement.SetDescription("Created By OSLC4Net");
                        requirement.AddImplementedBy(new Link(new Uri("http://google.com"), "Link in REQ01"));
                        //Create the change request
                        HttpResponseMessage creationResponse = client.CreateResource(
                            requirementFactory, requirement,
                            OslcMediaType.APPLICATION_RDF_XML,
                            OslcMediaType.APPLICATION_RDF_XML);
                        req01URL = creationResponse.Headers.Location.ToString();
                        creationResponse.ConsumeContent();

                        // Create REQ02
                        requirement = new Requirement();
                        requirement.SetInstanceShape(featureInstanceShape.GetAbout());
                        requirement.SetTitle("Req02");
                        requirement.SetDescription("Created By OSLC4Net");
                        requirement.AddValidatedBy(new Link(new Uri("http://bancomer.com"), "Link in REQ02"));
                        //Create the change request
                        creationResponse = client.CreateResource(
                            requirementFactory, requirement,
                            OslcMediaType.APPLICATION_RDF_XML,
                            OslcMediaType.APPLICATION_RDF_XML);

                        req02URL = creationResponse.Headers.Location.ToString();
                        creationResponse.ConsumeContent();

                        // Create REQ03
                        requirement = new Requirement();
                        requirement.SetInstanceShape(featureInstanceShape.GetAbout());
                        requirement.SetTitle("Req03");
                        requirement.SetDescription("Created By OSLC4Net");
                        requirement.AddValidatedBy(new Link(new Uri("http://outlook.com"), "Link in REQ03"));
                        //Create the change request
                        creationResponse = client.CreateResource(
                            requirementFactory, requirement,
                            OslcMediaType.APPLICATION_RDF_XML,
                            OslcMediaType.APPLICATION_RDF_XML);
                        req03URL = creationResponse.Headers.Location.ToString();
                        creationResponse.ConsumeContent();

                        // Create REQ04
                        requirement = new Requirement();
                        requirement.SetInstanceShape(featureInstanceShape.GetAbout());
                        requirement.SetTitle("Req04");
                        requirement.SetDescription("Created By OSLC4Net");

                        //Create the Requirement
                        creationResponse = client.CreateResource(
                            requirementFactory, requirement,
                            OslcMediaType.APPLICATION_RDF_XML,
                            OslcMediaType.APPLICATION_RDF_XML);
                        req04URL = creationResponse.Headers.Location.ToString();
                        creationResponse.ConsumeContent();

                        // Now create a collection
                        // Create REQ04
                        collection = new RequirementCollection();

                        collection.AddUses(new Uri(req03URL));
                        collection.AddUses(new Uri(req04URL));

                        collection.SetInstanceShape(collectionInstanceShape.GetAbout());
                        collection.SetTitle("Collection01");
                        collection.SetDescription("Created By OSLC4Net");
                        //Create the change request
                        creationResponse = client.CreateResource(
                            requirementFactory, collection,
                            OslcMediaType.APPLICATION_RDF_XML,
                            OslcMediaType.APPLICATION_RDF_XML);
                        reqcoll01URL = creationResponse.Headers.Location.ToString();
                        creationResponse.ConsumeContent();
                    }

                    // Check that everything was properly created
                    if (req01URL == null ||
                        req02URL == null ||
                        req03URL == null ||
                        req04URL == null ||
                        reqcoll01URL == null)
                    {
                        throw new Exception("Failed to create an artifact");
                    }

                    // GET the root folder based on First requirement created
                    HttpResponseMessage getResponse = client.GetResource(req01URL, OslcMediaType.APPLICATION_RDF_XML);
                    requirement = getResponse.Content.ReadAsAsync <Requirement>(client.GetFormatters()).Result;
                    String etag1 = getResponse.Headers.ETag.ToString();
                    // May not be needed getResponse.ConsumeContent();
                    //Save the Uri of the root folder in order to used it easily
                    rootFolder = (Uri)requirement.GetExtendedProperties()[RmConstants.PROPERTY_PARENT_FOLDER];

                    String changedPrimaryText = (String )requirement.GetExtendedProperties()[RmConstants.PROPERTY_PRIMARY_TEXT];
                    if (changedPrimaryText == null)
                    {
                        // Check with the workaround
                        changedPrimaryText = (String )requirement.GetExtendedProperties()[PROPERTY_PRIMARY_TEXT_WORKAROUND];
                    }

                    if ((changedPrimaryText != null) && (!changedPrimaryText.Contains(primaryText)))
                    {
                        logger.Error("Error getting primary Text");
                    }

                    //QUERIES
                    // SCENARIO 01  Do a query for type= Requirements
                    OslcQueryParameters queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("rdf=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>");
                    queryParams.SetWhere("rdf:type=<http://open-services.net/ns/rm#Requirement>");
                    OslcQuery       query  = new OslcQuery(client, queryCapability, 10, queryParams);
                    OslcQueryResult result = query.Submit();
                    bool            processAsDotNetObjects = false;
                    int             resultsSize            = result.GetMembersUrls().Length;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 01 = " + resultsSize + "\n");


                    // SCENARIO 02  Do a query for type= Requirements and for it folder container = rootFolder
                    queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("nav=<http://com.ibm.rdm/navigation#>,rdf=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>");
                    queryParams.SetWhere("rdf:type=<http://open-services.net/ns/rm#Requirement> and nav:parent=<" + rootFolder + ">");
                    query  = new OslcQuery(client, queryCapability, 10, queryParams);
                    result = query.Submit();
                    processAsDotNetObjects = false;
                    resultsSize            = result.GetMembersUrls().Length;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 02 = " + resultsSize + "\n");

                    // SCENARIO 03	Do a query for title
                    queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("dcterms=<http://purl.org/dc/terms/>");
                    queryParams.SetWhere("dcterms:title=\"Req04\"");
                    query                  = new OslcQuery(client, queryCapability, 10, queryParams);
                    result                 = query.Submit();
                    resultsSize            = result.GetMembersUrls().Length;
                    processAsDotNetObjects = false;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 03 = " + resultsSize + "\n");

                    // SCENARIO 04	Do a query for the link that is implemented
                    queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("oslc_rm=<http://open-services.net/ns/rm#>");
                    queryParams.SetWhere("oslc_rm:implementedBy=<http://google.com>");
                    query                  = new OslcQuery(client, queryCapability, 10, queryParams);
                    result                 = query.Submit();
                    resultsSize            = result.GetMembersUrls().Length;
                    processAsDotNetObjects = false;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 04 = " + resultsSize + "\n");

                    // SCENARIO 05	Do a query for the links that is validated
                    queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("oslc_rm=<http://open-services.net/ns/rm#>");
                    queryParams.SetWhere("oslc_rm:validatedBy in [<http://bancomer.com>,<http://outlook.com>]");
                    query                  = new OslcQuery(client, queryCapability, 10, queryParams);
                    result                 = query.Submit();
                    resultsSize            = result.GetMembersUrls().Length;
                    processAsDotNetObjects = false;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 05 = " + resultsSize + "\n");

                    // SCENARIO 06 Do a query for it container folder and for the link that is implemented
                    queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("nav=<http://com.ibm.rdm/navigation#>,oslc_rm=<http://open-services.net/ns/rm#>");
                    queryParams.SetWhere("nav:parent=<" + rootFolder + "> and oslc_rm:validatedBy=<http://bancomer.com>");
                    query                  = new OslcQuery(client, queryCapability, 10, queryParams);
                    result                 = query.Submit();
                    resultsSize            = result.GetMembersUrls().Length;
                    processAsDotNetObjects = false;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 06 = " + resultsSize + "\n");


                    // GET resources from req03 in order edit its values
                    getResponse = client.GetResource(req03URL, OslcMediaType.APPLICATION_RDF_XML);
                    requirement = getResponse.Content.ReadAsAsync <Requirement>(client.GetFormatters()).Result;
                    // Get the eTAG, we need it to update
                    String etag = getResponse.Headers.ETag.ToString();
                    getResponse.ConsumeContent();
                    requirement.SetTitle("My new Title");
                    requirement.AddImplementedBy(new Link(new Uri("http://google.com"), "Link created by an Eclipse Lyo user"));

                    // Update the requirement with the proper etag
                    HttpResponseMessage updateResponse = client.UpdateResource(req03URL,
                                                                               requirement, OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_RDF_XML, etag);

                    updateResponse.ConsumeContent();

                    /*Do a query in order to see if the requirement have changed*/
                    // SCENARIO 07 Do a query for the new title just changed
                    queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("dcterms=<http://purl.org/dc/terms/>");
                    queryParams.SetWhere("dcterms:title=\"My new Title\"");
                    query                  = new OslcQuery(client, queryCapability, 10, queryParams);
                    result                 = query.Submit();
                    resultsSize            = result.GetMembersUrls().Length;
                    processAsDotNetObjects = false;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 07 = " + resultsSize + "\n");

                    // SCENARIO 08	Do a query for implementedBy links
                    queryParams = new OslcQueryParameters();
                    queryParams.SetPrefix("oslc_rm=<http://open-services.net/ns/rm#>");
                    queryParams.SetWhere("oslc_rm:implementedBy=<http://google.com>");
                    query                  = new OslcQuery(client, queryCapability, 10, queryParams);
                    result                 = query.Submit();
                    resultsSize            = result.GetMembersUrls().Length;
                    processAsDotNetObjects = false;
                    ProcessPagedQueryResults(result, client, processAsDotNetObjects);
                    Console.WriteLine("\n------------------------------\n");
                    Console.WriteLine("Number of Results for SCENARIO 08 = " + resultsSize + "\n");
                }
            } catch (RootServicesException re) {
                logger.Error("Unable to access the Jazz rootservices document at: " + webContextUrl + "/rootservices", re);
            } catch (Exception e) {
                logger.Error(e.Message, e);
            }
        }
예제 #3
0
        /// <summary>
        /// Login to the RTC server and perform some OSLC actions
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();

            CommandLineDictionary cmd = CommandLineDictionary.FromArguments(args);

            if (!ValidateOptions(cmd))
            {
                logger.Error("Syntax:  /url=https://<server>:port/<context>/ /user=<user> /password=<password> /project=\"<project_area>\"");
                logger.Error("Example: /url=https://exmple.com:9443/ccm /user=ADMIN /password=ADMIN /project=\"JKE Banking (Change Management)\"");
                return;
            }

            String webContextUrl = cmd["url"];
            String user          = cmd["user"];
            String passwd        = cmd["password"];
            String projectArea   = cmd["project"];

            try {
                //STEP 1: Initialize a Jazz rootservices helper and indicate we're looking for the ChangeManagement catalog
                //RTC contains a service provider for CM and SCM, so we need to indicate our interest in CM
                JazzRootServicesHelper helper = new JazzRootServicesHelper(webContextUrl, OSLCConstants.OSLC_CM_V2);

                //STEP 2: Create a new Form Auth client with the supplied user/password
                JazzFormAuthClient client = helper.InitFormClient(user, passwd);

                //STEP 3: Login in to Jazz Server
                if (client.FormLogin() == HttpStatusCode.OK)
                {
                    //STEP 4: Get the URL of the OSLC ChangeManagement catalog
                    String catalogUrl = helper.GetCatalogUrl();

                    //STEP 5: Find the OSLC Service Provider for the project area we want to work with
                    String serviceProviderUrl = client.LookupServiceProviderUrl(catalogUrl, projectArea);

                    //STEP 6: Get the Query Capabilities URL so that we can run some OSLC queries
                    String queryCapability = client.LookupQueryCapability(serviceProviderUrl,
                                                                          OSLCConstants.OSLC_CM_V2,
                                                                          OSLCConstants.CM_CHANGE_REQUEST_TYPE);

                    //SCENARIO A: Run a query for all open ChangeRequests with OSLC paging of 10 items per
                    //page turned on and list the members of the result
                    OslcQueryParameters queryParams = new OslcQueryParameters();
                    queryParams.SetWhere("oslc_cm:closed=false");
                    queryParams.SetSelect("dcterms:identifier,dcterms:title,oslc_cm:status");
                    OslcQuery query = new OslcQuery(client, queryCapability, 10, queryParams);

                    OslcQueryResult result = query.Submit();

                    bool processAsJavaObjects = true;
                    ProcessPagedQueryResults(result, client, processAsJavaObjects);

                    Console.WriteLine("\n------------------------------\n");

                    //SCENARIO B:  Run a query for a specific ChangeRequest selecting only certain
                    //attributes and then print it as raw XML.  Change the dcterms:identifier below to match a
                    //real workitem in your RTC project area
                    OslcQueryParameters queryParams2 = new OslcQueryParameters();
                    queryParams2.SetWhere("dcterms:identifier=\"10\"");
                    queryParams2.SetSelect("dcterms:identifier,dcterms:title,dcterms:creator,dcterms:created,oslc_cm:status");
                    OslcQuery query2 = new OslcQuery(client, queryCapability, queryParams2);

                    OslcQueryResult     result2     = query2.Submit();
                    HttpResponseMessage rawResponse = result2.GetRawResponse();
                    ProcessRawResponse(rawResponse);
                    rawResponse.ConsumeContent();

                    //SCENARIO C:  RTC Workitem creation and update
                    ChangeRequest changeRequest = new ChangeRequest();
                    changeRequest.SetTitle("Implement accessibility in Pet Store application");
                    changeRequest.SetDescription("Image elements must provide a description in the 'alt' attribute for consumption by screen readers.");
                    changeRequest.AddTestedByTestCase(new Link(new Uri("http://qmprovider/testcase/1"), "Accessibility verification using a screen reader"));
                    changeRequest.AddDctermsType("task");

                    //Get the Creation Factory URL for change requests so that we can create one
                    String changeRequestCreation = client.LookupCreationFactory(
                        serviceProviderUrl, OSLCConstants.OSLC_CM_V2,
                        changeRequest.GetRdfTypes()[0].ToString());

                    //Create the change request
                    HttpResponseMessage creationResponse = client.CreateResource(
                        changeRequestCreation, changeRequest,
                        OslcMediaType.APPLICATION_RDF_XML,
                        OslcMediaType.APPLICATION_RDF_XML);

                    if (creationResponse.StatusCode != HttpStatusCode.Created)
                    {
                        String errorString = creationResponse.Content.ReadAsStringAsync().Result;
                        Console.Error.WriteLine("Failed to create change request: " + errorString);
                        return;
                    }

                    String changeRequestLocation = creationResponse.Headers.Location.ToString();
                    creationResponse.ConsumeContent();
                    Console.WriteLine("Change Request created a location " + changeRequestLocation);


                    //Get the change request from the service provider and update its title property
                    changeRequest = client.GetResource(changeRequestLocation,
                                                       OslcMediaType.APPLICATION_RDF_XML).Content.ReadAsAsync <ChangeRequest>(client.GetFormatters()).Result;
                    changeRequest.SetTitle(changeRequest.GetTitle() + " (updated)");

                    //Create a partial update URL so that only the title will be updated.
                    //Assuming (for readability) that the change request URL does not already contain a '?'
                    String updateUrl = changeRequest.GetAbout() + "?oslc.properties=dcterms:title";

                    //Update the change request at the service provider
                    HttpResponseMessage updateResponse = client.UpdateResource(
                        updateUrl, changeRequest,
                        OslcMediaType.APPLICATION_RDF_XML,
                        OslcMediaType.APPLICATION_RDF_XML);

                    updateResponse.ConsumeContent();
                }
            } catch (RootServicesException re) {
                logger.Error("Unable to access the Jazz rootservices document at: " + webContextUrl + "/rootservices", re);
            } catch (Exception e) {
                logger.Error(e.Message, e);
            }
        }