As usual I was a bit overly ambitious yesterday and ran out of time. So I have a few more sessions I have to watch this morning before things get going. The first of which is:
The SwiftUI cookbook for navigation
Review of new APIs for navigation across of SwiftUI. This will provide simple receipts to get started:
Quick review of existing APIs
Based on passing Links around.
You basically add a binding to a link to persist state as in – NavigationLink( “Details”, isActive: $item.showDetail) { DetailView() }
In the new API you move the binding up to the top.
Basic recipes app is used as an example with a three category app.
New container types:
Navigation Stack – this is a push / pop interface:
NavigationStack(path: $path) { Details() } – this is settings on macOS, Find my on the Watch, etc.
Navigation Split View:
NavigationSplitView { Categories() } detail: { Grid() }. // to column example
Perfect for multi column apps like Mail or Notes and will collapse to Stack in smaller views
There are two sets of initializers. Above is a two column
Three column is vain NavigationSplitView { Categories() } content: { List() } detail: { Detail() } // think of the notes app with the folders listed
There’s a great session in 2021 on this
Navigation Link shows a Title and the info to present:
NavigationLink(“Show Detail”) { Details() }
The new one presents a value, not a view: NavigationLink(“Show information”, value: informationShown)
That value will change based on the type of item it is presented in
Recipes for navigation
Basic stack of Views, with sections for each item. And within each item you can get details
You will need a NavigationStack, NavigationLink, and the modifier .navigationDestination(for: )
This will push items on the stack so when you go back you will go back up the stack
You can bind the path to the view via a state binding. This recipe works on all platforms.
Multi-column presentation without stacks:
Uses NavigationSplitView, NavigationLink, and List ( great on larger devices)
Now we have fill programmatic control over the view
This is auto translated to a single stack on WatchOS and TvOS, so this is also available on all platforms
Adding them together for a complex view navigation: Two column navigation experience (This is what I need for my Card Tracker app).
Allows for navigation between rated information, using NavigationSplitView, NavigationStack, NavigationLink, .navigationDestination(for:) and List
Start with a standard two column display but add a navigationStack into the details:
The root view is the RecipeGrid. If we go to it to show details
We now have a link for each grid entry., We will need to add a .navigationDestination Modifier – we don’t want it on each link. So we should place it put is next to the scrollView – bellow .navigationTitle
And finally:
Persistent state: To do this we need to address Codable and SceneStorage
This example requires us to move state to the class, make it Codable
Take special focus on the initializer as defined in the sample code with the session. They are using Json to save and restore the state. This uses @SceneStorage. Adding .task modifier to view, this is run asynchronously beginning when the view appears and ending when the view disappears. I am sure this code will be used to easily extend a lot of views
It is apparent from this session that Apple is suggesting you switch to these patterns as soon as possible. I believe this is to make your code across more and more platforms without a bunch of compiler directives. There are articles available on how you should migrate.
The last of the sessions I wanted to get to on Day 2, this is another meaty one. As I’ve been playing with App intents in Wasted Time, though I never did get them working the way I wanted, this session is of great interest to me. To quote Apple Fitness+ – “Let’s Go!”
Introducing AppIntents
Introduced in IOS10, now there is a new Framework called “AppIntents”.
By using Intents you app becomes available in Siri, it also makes it show in Spotlight, you can now address Focus Filters, and of course shortcuts (this makes app available across all parts of Apple’s ecosystem).
Intents and Parameters
Single unit of functionality – run by request (or automatically)
Include: Metadata, Parameter and Perform Method
Need to create an intent for each item action a user could expect. Then you create a struct which concludes a @MainActor and perform() method. Include a title as a static
And that’s it for a simple intent that takes a user to a specific screen in your app. (I should create an intent that shows a user the metrics screen in Wasted Time)
If you add a little code you a make your Intent show up in the Shortcuts app. Will want to check out Implement App Shortcuts with App Intents
Phrases is used by Siri
Additional example was shown to help you take the user to any screen.
Entities, Queries, and Results
Use entity when values are more unbounded. List a list of books vs, the screens in an reading app, you app then enabled queries and returns this entities as a Result
The entity should be Identifiable, a type Name and a DisplayRepresentation – could be a string of text
The Query Struct provides an interface to retrieve the entity from your app. Must have ID lookup, can also provide suggested entities and more. It must confirm to EntityQuery protocol.
Implement the defaultQuery type on an entity pointing to the Query.
With additional work you can allow for stringing intents together.
The Open Intent is used to open your app with an intents value passed in.
Properties, Finding, and Filtering
Entities expose properties which can be useful by other parts of the system and used in intents and short cuts – for example:
Here in our Book example from the session, we can export more information about the book. You use @Property wrapper in your entity to export them.
By combing Properties with Queries now you have the ability to find and filter to be used in Shortcut building blocks.
You will need to adopt Property Query in your application. You define how you want to allow for the query to perform.
You use these to define NSPredicates to be used in query and similar in sorting
Implementing matching then allows the system to string the predicates together to provide the resultant list
User Interactions
You can enable Dialog (for Siri) and Snippets (for visual feedback), Request Value, Disambiguation, and Confirmation to help clarity
You can think of Snippets as visual version of Dialog
Since this is done as a closure, it is more and more important to keep your views small and self contained.
Architecture and Lifecycle
There are two ways to build the intents – in the App or via a operate extension
Simpler to do it directly in your App
If you enable openAppWhenRun it will be able to run in the foreground
An extension is lighter weight, and if you use focus intents, it will run immediately
With App Intents your code is the source of truth. Xcode will create the Metadata file needed for your intentions
To upgrade from SiriKit apps you can click Convert to App Intent in the definitions file.
And now we get to the content I was planning to get to for today:
What’s New in Privacy
Privacy is a fundamental human right. I still appreciate this statement from Apple and it is one of the reasons I use their products and spend my free time developing for their platforms.
There are four patterns (or pillars) that Apple uses for their approach:
Data minimization – only use the data needed to build the feature
On-device processing – use the device to address any sensitive data
Transparency and Control – If data is sent off device, let users know and control what it is, how it Is used, and control it’s access
Security Protections – keep data safe at rest and in flight
Platform Updates
Device name entitlement – which restricts access to device name. Location shows app attributes in control center, gatekeeper has improved to verify integrity of the app in more places. Launching Mac apps at login notifies people of additions and Pasteboard now requires permission.
The “user’s name” is provided in device name. So now the name will return the “iPhone” if you do not request entitlement.
Location use will now also show the app (not just the arrow) in the bar.
GateKeeper on the Mac, checks integrity of all notarized apps. You should makes sure your signatures stay valid. It will also prevent the app to be modified in the certain ways. You need to include info.plist changes to allow other apps to update your app. This will have implications to Eclipse based apps.
I like this feature for security purposes, but I can see this being an issue in an enterprise setting
Will certainly have to ask my day job to look into this one in more detail
To enable apps to run at start in –
Single API to launch app, launch agent or daemon
SMAppService API is used for this. All items should be inside your bundle and they should be able to run fine.
Pasteboard Access – now you will get a confirmation message, you should edit options, a keyboard shortcut or UIKit paste controls to stop these.
New Feature to adopt
UIKit Paste Controls – if you add this to your app experience, this allows without any edit menu, keyboard short kit, etc. It is validated by App Intent. It must be visible to work
Media device discovery – Permission used to be required and access to bluetooth, which poses a finger printing risk. Using discovery end up showing up in the same area as AirpLay and the app only sees the sandboxed results being used. The app won’t see the whole network but will get those features it needs from the network. Create an app extension to enable discovery if you are a protocol provider.
PHPicker – The new photo picker will provide access to the photos without prompt.
Private access Tokens – this replaces captchas and uses blinded tokens. Reduces ability to track users. This is based on IETF privacy pass standard. (Check out replace Captchas with private access tokens).
PassKeys – check out the prior session from Day 2.
Safety Check
I ran this feature today and hadn’t realized that I had some people with access to my photos library.. let’s just say – I fixed that 🙂
This can allow for single button changes to help people in domestic or other abusive relationships – stops sharing data with people, apps, signpost of features on other devices, changes password and change trusted phones numbers and manage emergency contacts.
Emergency Reset is across people and apps immediately. The only issue that I can think of is, if someone is kidnapped they could be forced to run this option and “disappear” from those who may be searching for them.
Manage Sharing and Access- allows you to review and confirm – this can help you identify if someone has added an app to your device to track you. Quick Exit – takes you back to Home Screen immediately and changes so that going back to Settings to take you back to the root of Settings.
What’s new in HealthKit
I love my Apple Watch and Fitness Plus+ the additions of Medicine and sleep tracking are exciting
Sleep Analysis
Apple watch can be used to manage sleep schedule, this year we have Sleep Stages
Stages are stored in HealthKit, represented by category samples HKCategoryType.sleepAnalysis of REM Core and Deep.
Create one sample fore each continuous period of time.
Sleep Core equal to stages 1 and 2 of the AASM model
Deep is Stage 3
REM corresponds to Rapid Eye Movement
“Sleep” state will be deprecated.
You a read sleep samples for a given stage using Predicate .predicateForSamples( _, value: .asleepREM), you will receive an array of samples in that state.
Swift Async
They have updated the queries using async – making queries simpler
They are all based on HKQuery – for example HKStatisticsCollectionQuery
You can use the HKStatisticsCollectionQueryDescriptor, as an example to get all the calories burned in a week by using a predicate of caloriesPredicate
Workouts
Great for capturing workouts and all day metrics. API is being updated to identify Triathlon and other interval based activities.
Activities cannot overlap in time, and are not required to be continuous.
You assign the type of data you want to collect in a work out by starting a new activity .beginNewActivity
Reading metrics which will allow you to pick the statistic for a specific activity type. This means older methods are being deprecated in favor of this method. There are a new set of Predicates for search and statistics.
By using workout activities to track intervals you can now get a more comprehensive view of the workout. SWOLF (strokes in a given length and the time it took to swim that length) is being added as a unique metric that will be captured.
Heart rate recover is also being captured. This Cardio recover data type will be available in the health app. .heartRateRecoveryOneMinute
Vision Prescriptions including digital copy of physical prescription
You can now add in vision correction information – 75% of US adults require prescription for vision correction
Can save both classes and contact information – Start date == prescription date
You can include a digital copy of the prescription
(I wonder if Apple will use this data to improve their AR/VR experience going forward)
Prescription have a new permission authorization – it is unique for each prescription.
What’s new in the CloudKit Console
I’ve been using CloudKit for an app I’ve been working on for the last few years. Looking at what’s new in the console will help me understand how this may impact my desire to release this app. This is used to synchronize data between devices.
Hidden Containers
In the console you can now choose which are hidden or available – this is at the team level so you don’t see them in the various tools. Keeping things cleaner for views and workflows.
Act As iCloud
In the Console you can now view as iCloud account verses as your Development account.
So you can sign in as a separate iCloud Account to look at the data from that account.
I can use that to see how the data may be stored in my app
You can’t perform schema operations, but you can do queries.
Great for debugging and see how the data is used in Production.
Data is still encrypted and only viewable by the original account
Zone sharing
This is used to share data securely across users
I am not using this feature, but it seems like a key thing for games and social activities. There are both Public and Private shared zones to help separate the data
You can take an existing zone and then decide if it is shared. I don’t believe it moves over the data from that zone. But people who join later will have access to shared data.
What’s New in Swift-DocC
Since I am focusing on APIs in my day job an dhow to make our APIs more discoverable and consumable, I am really interested in what is going on with DocC. This and the next session will provide me insights on what we may need to do. The only issue is, my day job team is focused on Java based development, so the patterns are important to me, but the specific implementation details may not apply.
Allows you to use Reference, articles and tutorials adding in additional workflows for frameworks and app projects, can also do Objective-C and C APIs
Supports Hosting providers like Github Pages
Have moved to Open Source for the project.
Focus is on:
Document
You document right in the code – with no documentation created.. the Build Documentation will create stubs automatically.
API
Add three slashes for documentation – ///
Link syntax is “LINK“
Start by teaching how each API works individually and then build up to higher level content
Use mark down code syntax to provide code example.
Initializers you should describe each parameters
There’s a language toggle to help people see examples in appropriate syntax
Top level page you can add a new file of type documentation catalog, this allows you to build out summary and overview
You can add images, etc.
And links to each page for the APIs
Publish
Builds a static bundle called a DocC archive, it can be shared by Export.
It also includes a standard website out of the box and compatible with most WebServers.
You can auto Publish to GitHub Pages via a Base Path to make it compatible for certain hosting items – like your own domain
I tried this for Wasted Time and am currently getting a build error for the Build Documentation command
To create the Base Path – you need to add in the build settings.
The workflow is very simple for those using Git and you can make it automated via the Swift-DocC Plugin
Browse
The new browser and navigation function makes it much easier to explore the API and Documentation
It calls out Methods, Protocols, Events, Properties, and Structs.
Improve the discoverability of your Swift-DocC content
The second session on DocC is about the design of your documentation
Web navigation
This has both a navigator / filer bard
Disclosures all you to show relationship of objects, properties, etc.
Filter bar includes type tags to reduce the amount of things that are included
Content view
Optimize your content
There is automatic organization which means your documentation is organized by type
But you an override this default view by
Define the high-level themes (limit to a few key things here, sort them by importance or adoption)
Essentials – getting started, etc.
Great to add code examples and introductory articles, etc.
What can be done with your framework
How can you get data or visualize your framework’s data
What management tasks are available
Organize by importance and specificity
Use this to guide thru the content
Optimize titles to make it helpful for developers
Update titles so it is clear and descriptive –
Should make sense on it’s own
They should be mutually exclusive
By improving your Documentation and making it easy to understand you can help Serendipity for developers
What’s new in iPad Design
There are a lot of changes to expand the iPad to a more desktop like experience, especially with external displays. These new design patterns will improve the overall experience with your app.
Toolbars
They organize your apps functionality
If we compare pages between iPadOS15 and 16 notice the difference at the top. The iPadOS16 view provide a lot more functionality and discoverability of functions:
The most common. Workflows in your app should be tagged in the center options. If you have too many, you end up with an overflow identifier. You can add Customization if you have a lot of items.
You can group or collapse toolbar options. When there’s not enough room, they will collapse to a + button
Important item that must always show should be in the trailing edge.
Document Menus –
Documents should use this new menu, and you will get back a < to go to a browser view.
Standard item like Print, or Duplicate can show in this menu.
Editing menus
These are now optimized for touch, pointer and other modalities. So you get horizontal for touch and vertical popup for Pointer
You should leave the default values and group your custom objects
Find and replace
You now have a system Keyboard option for find and replace.
When attached to a hardware keyboard it shows up a the bottom of the screen
Navigation
Content browsing experiences are everywhere.
New style – browser style navigation (using back and forward buttons)
It’s up to your app to decide what those buttons should navigate to.
Note you don’t need this mode if your app is fairly flat in content.
If you use this, then you can enable search in the top right of the browser window. Great for filtering the details. It supports suggestions, filters and other features..
If you want to search across all of your app, you should have search in a Search Tab (like the left hand navigator list)
Selection and Menus
iPadOS15 had Drag select (aka Band Selection)
In iPadOS16 you can now use keyboard modifier to select and deselect. It also doesn’t go into editing mode.
You can now long press or click again to get a menu pop-up to execute commands against the selection
You can also use context menus in empty area.
Your app should support
Keyboard Focus
Band Selection
Multi-Select without modes
Menus for multiple selection
Empty Area Menus
Submenus – on iPhone you should only use them when you really need one. (They are vertical)
On iPadOS they go horizontally, they are quick
You also now have a new control for popup buttons in list, which show a menu to choose an option.
This will keep you in context and reduces the number of steps
Use for well defined list of things
Tables
New component in iPadOS16. – different than the old Table control
Think of this like a spreadsheet. It supports sort by taping a header. Swapping columns (to show only the most important). They support multi-selection features.
Think of them as an extended list view. Tables switch back to a single column list if size is limited. If that is done, you should take the additional columns and add them as subtitles. Sorts should then be moved to a ToolBarItem
Building a Desktop-class iPad App
Given that my Card Tracking app is really a task specific database tool, I think understanding how to make the Desktop and iPad versions as equal as possible is key. The new features of iPadOS16 will make this more possible. So this session should provide me with guidance on how to improve many of my features.
This is a deep dive session to update an existing App and will focus on three high-level changes.
UI organization:
Start by changing from standard Navigation View and move many options up to the NavigationView type.. using Browser or Editor options. I would need to switch to Editor mode for my Card Tracker
Will want to customize the built in Back action to match our needs
Update the Title Menu with document info
Enable Document Renaming
And expose features into the Bar.
Start by changing navigationItem.style = .editor
Change out the old Done button with navigationItem.backAction = UIAction(…)
If appropriate we could do title information, like document properties.
You can now enable new features based on the UIDocumentProperties and you then able things like drag and share based on the document. If you go thru the prior session on Desktop Class iPad apps – you will learn about the system menu items and adding your custom items to the document menu.
For system functions you will need to override the system functions for any app specific activities, like actually renaming the file. On Mac Catalyst you will need to manually expose the Title options to the menu builder.
Quick actions
Adding actions:
Fixed groups are not customizable or able to be moved by users, so they are present on the leading edge of the view.
Handling different sizes between iPad you want to be able o define multiple actions, and preferredElementSize property means you can address the menu size and .keepsMenuPresented attribute allows multiple selection without dismissing the menu
Theres a ton of stuff here.. highly recommend multiple views and analysis of the posted code.
Text experience
Prior to iOS16 you’d have to have develop your own bulk actions edit mode with new menu items.
You can now enable this design with a light weight selection style, by enabling multiple properties, .allowsMultipleSelection = true, we enable Keyboard focus via .allowsFocus = true and then enable keyboard to drive the selection by .selectionFollowsFocus = true
If you do these changes you want to make sure to adjust via performPrimaryActionForItemAt indexPath on the collectionView.
You then enable collectionView(_:contextMenuConfigurationForItemsAt:point:) https://developer.apple.com/documentation/uikit/uicollectionviewdelegate/4002186-collectionview If the array is empty then you are in an empty space and invoke the Add or similar function, otherwise check for single item or you should loop thru the multiple selections. On an iPad you use a two-finger click get the menu
Find and replace is enable via setting a property.
You can define your own custom items for selected text. Check out adopt desktop class editing interactions for much more.
Meet Transferable
Support drag and drop, cut and paste and also other interactions across your app. Check out the app for this one.. great to see catalog of female inventors and scientists. The sharing interface is also available via this (ShareLink).
This is a declarative way, built on Swift First:
Anatomy of Transferable
To transfer data between two applications there is always binary data that goes across. You need to understand what it corresponds to. All items need to provide ways to convert too and from binary type, and the Content type. This is an apple specific technology (content type – (uniform type identifiers – UTI).
To create your own UTI –
Add declaration your info plist file
add a file extension and add it to your info.plist
Declare it in code – check out UTI – A Reduction video
Many standard types already conform to transferable. You will use ShareLink and new PasteItem API
Conforming custom types
You need to implement add :Transferable to your object and then define the transferRepresentation as in static var transferRepresentation: some TransferRepresentation { … }
Three key items CodableRepresentation, DataRepresentation and FileRepresentation
CodableRepresentation uses an encoder and decoder and by default it uses JSON – to learn more – watch WWDC18 session on Data you can trust. Use this for simple items.
DataRepresentation allows conversion via only two modes – this is for in memory binary information.
FileRepresentation should be used for very large items, like video and audio files.
Advanced Tips and Trips
Order of TransferRepresentation is important. They system will use the first one that matches.
ProxyRepresentation – should read up more on this one.
You will get very different behavior between FileRepresentation v.s. ProxyRepresentation one is the data itself vs. the link to the data.
You should also go back to WWDC19 to get the sample app and review it.
AS mentioned earlier in my posts, I have been working on an app that tracks Greeting Cards. It uses Core Data and CloudKit to synchronize across devices. I am currently seeing long delays in that synchronization and hope I can gain some insights here. I like that he calls this the Water Cycle, – I think of this as agile at one level, and waterfall at another.
Exploration (Via a data generator)
Goal is to learn, challenge and verify all assumptions, will the store sync when I expect it, how does the system behave with very large data
Will focus on how the shape, structure and variance of the data.
Using Algorithmic data generators allow you to test, you should be able to store and analyze this data. Building these to create larger and complex datasets are great practice
You can then build tests to validate
You should also create a test to test syncing this data since we are taking about CloudKit
Binding generator to a user interface you can now see how the data is behaving from user perspective.
Analysis
Focus on Instruments on time and allocations
You can use profile and it will create tests to analyze the steps that are running. This will help you understand where time is spent on the application
Using Allocations in Instruments you can see if you are either leaking memory or keeping data around after use for too long. Use this to uncover if you have retain errors.
Logs for information from CloudKi and Applications and push notifications.
Looking at this you can see= what system services are being used
Dasd is the process you want to look at in the logs for Mac based scheduled logs
It will show any policies that affect how the process runs
Cloudd and apsd processes should also be reviewed.
In terminal you can use log stream —predicate ‘ process = “” AND (sender = “CoreData” or Sender = “CloudKit”) to get a window of with real time log streams
Feedback
Collecting diagnostic information from devices allows for actionable and specific
Need to install CloudKit Profile on the device
This is from the developer portal and it will try and install on the device.
Reboot the device to take effect
Reproduce the behavior and then create a sysdiagnose
Collect a Sysdiagnose
On current iPhone press both volume buttons and a the Power button for a few seconds.
You will see a sysdiagnose in logs and you can press share to send via airdrop or other method.
With sysdiagnose you use log show —info —debug —predicate ‘process = “dasd” AND message contains[cd] “appidentifier”’ system_logs.logarchive to get the data in terminal
See more details in the video transcript.
If you have access to the device you can collect the Store Files via Xcode
Combining built in views to more complex views. Modifiers provide conditional controls:
Grid (Static 2 dimensional views – you use lazy grids for scrollable views.)
Swift UI will figure out size (columns and rows) automatically.
You should always create sample data in your structs so you can use it in Previews
You use the .gridColumnAlignment modifier to adjust a single column in a grid
You can add the .gridCellColumn to span multiple columns
Layout (create a custom one)
To adjust button widths to equal the widest button stack you can create a custom Layout. So you can now change from HStack to a custom stack. In this case you make a type that confirms to Layout.
A sample of a customer stack is here
Note the inout Void cache to share values across instances (more info in the documentation)
All views have spacing preferences that indicate the ideal spacing between itself and items on any sides (and each side could different ) it can vary by type and by platform. If edge presences don’t match the system will use the larger by default.
To see the details the commented areas above – watch the session, as they are details that you need to understand.
I really like this feature. Since I had tried to use Geometry Reader to solve the problem. It’s intended use is one directional.
ViewThatFits (auto selects the view that fits)
You can use this to pick the item that fits, in the available space.
Lets you provide different layouts based on some condition. It will transition to that view when the value changes. So you get a viewDidChange instead of a new View.
This allows for smooth animation and reduced impact to your users
Build a productive app for Apple Watch
I have had an Apple Watch app on the store since 2019. So this session is always interesting to me. Let’s see what nuggets I can glean to improve my app. Check out the details at https://developer.apple.com/documentation/watchOSApps
Each year more capabilities are added to WatchOS. So this session will allow you to add them toters
Create A watch App
You should decide if you need to make a companion app on the phone.
Great apps focus on essential focus of the app.
The dual targets are a hold over from earlier days. New model you only need one.
You can convert your app using the validate setting to transfer the App to the new Swift UI Lifecycle. Absolutely need to do this for my app.
You can now use a single 1024×1024 app icon image.
If you have details that get lost you can create specific items
Add a simple list
Create a data model
Enable list updates
Preview should show an empty list.. so now you want to add a button to add a new item
TextFieldLink can be used to allow for text input
Placement of items you should use at the end of list for primary action on a short list
On a long list, you may want to add it as a ToolbarItem – this will show at the top of the list when the user pulls it down.
App navigation structure
On Watch you can do Hierarchical so use NavigationStack
Page-based you use TabView – this is where all items are peers – my app uses this
A full screen app, uses the full screen with a single view. You want to ignoresSafeArea modifier and toolbar modifier to hide the navigation view
A modal Sheet should be an important task that covers the enter view. Deciding between this and NavigationStack should be considered based on the details.
Use a property to control the display of the modal sheet.
In WatchOS9 9 you can use Steppers for sequential values. (They don’t have to be numbers, just logically sequential). A stepper is huge for my app. I may have to switch to it.
Share with a friend
ShareLink is also supported on WatchOS 9. This will allow you to easily share items via standard sharing methods.
Check out the Transferable session earlier today.
Add a chart
You can use the new Chart feature in Swift. – SwiftCharts and they can be reused across all platforms.
Definitely check out Hello Swift Charts
Scroll with the Digital Crown
There is a new Digital Crown rotation modifier which allows a call back.
You use @State variables to track the .digitalCrownRotation modifier so that you can react to it.
It uses detent in the context it is the resting notch of the crown.
You can apply the modifier on a chart in order to display a RuleMark()
Embrace Swift Generics
I’ve been taking a class lately – #100DaysOfSwift by Paul Hudson over at https://hackingwithswift.com … I’ve been using swift for many years, but it has all been by discovery only, so this class is really helping me fill in some gaps. One topic that comes up on the site is Generics. Having a good understanding of Generics is key. I am looking forward to this session.
Generics are a fundamental tool for writing abstract code in swift.
In swift you can abstract away complex Types. This is a Generic in swift.
Model with concrete types
You could overload methods to address things. If you do this a lot with very repetitive nature.. you should think about Generics
Identify common capabilities
Looking at the types you created you should see where things are common. And how they behave differently based on different types.. this is Polymorphism – allowing one piece of code to have different behavior based on how it is used.
You can use Overloading
Subtype Polymorphism –
This could be done via class hierarchy with type specific overrides by sub class.
You be forced into reference semantics
Also requires methods to be overridden, forgetting to do so, won’t be caught until runtime.
The more things you try to fix, the more boiler plate you will have to add.
Parametric Polymorphism – achieved via Generics
Build an interface
You can build an interface to represent capabilities
This is a protocol, allowing you to separate the idea of what it does from implementation details
You add an assoScreen Shot 2022-06-08 at 21.04.38 (2)ciatedType to a protocol
You then use a method to deal with the operation that the protocol needs. Concrete types have to implement that function.
You can annotate at the protocol type or as an extension
You have to implement the methods.
Write Generic Code
We can now write generic code via parametric polymorphism
The type parameter can be named what ever you want, and use it across the signature. We then annotate the type parameter with the protocol it conforms to
There is a simpler declaration of func functionName(_ name: some PROTOCOL)
Some means there is a specific type you are working with and is followed by a protocol for conformance.
This is used by “some View”
Stepping back to understand concept of a specific abstract type.
The abstract type is called an opaque type
The specific type is the Underlying type
For values with opaque type, the underlying type is fixed for the scope of the type.
You can use opaque types for both input and output both as Parameters or Results
Named Type parameters are always on the input side
The underlying type always comes from the same place as the value. So local values must always have an initial value.
It must be fixed for the scope of the variable
It is key to understand some and any – and how they behave differently
Recommend reading the transcript many times for deeper understanding
Wrap up for the day
Wow.. what a day, there is so much for my brain to digest tonight. The one thing I need to do next year, is come with a better plan for the specific things I am looking for. Of course, announcing new major frameworks, breaks this planning. This year I was hoping for SwiftData, which did not appear, so, I should have multiple plans. The great thing about today is I discovered multiple techniques and frameworks to rewrite major portions of my apps. Hopefully making them simpler and easier to maintain.
As always I am going to give my first impressions for all the sessions I go thru. Today is always the busiest day and I may have some spill over into tomorrow. But I am excited to get started:
Let’s start with what is new in Xcode –
Xcode is 30% smaller – I noticed this by the initial download and installation.
The first thing I did was download the Foodtruck app that will be used in many of the demos this year.
Nice to see Swift Plugins to improve development environment.
Dynamic type variants should help in improving my various Apps on different devices and resolutions.
Improvements in TestFlight Feedback allows you to quickly and easily see the feedback from your beta testers
The new Hangs view shows you issues of code in production.
Different sized images can be automatically generated via the “Single Size” option in the inspector.
Next – What’s New in Swift:
Community update
DocC and Swift Setter were open sourced last year.
C++ Interoperability and Website designed were started as two new communities
Swift Mentorship was started last year. I signed up for this to see what I can learn and contribute
Added support for Native Toolchain for CentOS7 and Amazon Linux 2 – RPMs are available but experimental at this time.
Swift is now being used in Apple’s Secure Enclave
Swift Pakcages
TOFU – Trust on first Use – fingerprint is being recorded on first download. Will validate if it changes and report error.
Command plugins – These include doc generation, source code reformatting, and other tools. By embracing developer tools this way, should expand swift uptake
Creating a plug in with DocC was shown as a demo – you can now run from Xcode. (Directly executed at any time)
Build Tool plugins – allow you to inject steps in the build process. Think of this as extending activities during a complex build environment.
You can use aliases to deal with module collisions
Performance improvements
Drivers can now be used as a framework within the build system. So you can improve parallelization in build process.
Type Checking has sped up due to how they deal with generics
Runtime – improved launch time due to how protocols are being handled. They can now be cached
Concurrency updates
Further fleshed out Async/Await – is now available to be back deployed to earlier Operating systems
Added in data race avoidance – this is at the thread level this should address many bugs related to data race conditions
The goal is to get to full thread safely by Swift 6. This current release is swift 5.7
You can enable stricter checking in the build settings.
Distributed keyword let’s the compiler know that an actor can be on a different machine – even across the network. You will need Await and Try to handle if network errors occur.
There is a new set of Open source Algorithms released in Swift 5.5
Actor prioritization will allow for improved performance
There is a new concurrency view in instruments so you can visualize and optimize your concurrency code.
Expressive Swift
New short hand for if let and guard so you can drop the right hand side of an = and just use the optional.
Swift is very type specific, unlike C which allows you to deal with automatic conversions. Now if you passing it to C from Swift, you won’t get the swift errors, from valid pointer conversions.
New String tool to improve parsing the string. There’s a new declarative approach via RegEx to do string parsing. You can now use words instead of symbols to do RegEx – import RegexBuilder library to enable this feature. And you can take it and make it reusable, and recursive. If you want you can still use regex literals in the builder.
Compatible with UTS#18 with extensions.
Generic code clarity
This will require you to add any keyword ahead of any instance of a protocol verses as a generic type. (Not fully sure I understand this one yet, but will dig into it more over the next 12 months).
Primary associated types can now be constrained
Generics are improved by the same keyword – to minimize the amount of boiler plate changes you need to use when they are created.
Next – What’s new in SwiftUI:
New SwiftUI app structure
Swift Charts (new Framework)
State driven charts in SwiftUI for data visualization
A chart is just “Some View”
It handles localization, dynamic type and dark mode automatically
Navigation and Windows
Stacks – Push / Pop
New Container view – NavigationStack – wraps a root content view
Improves handling of stack
Split Views
New NavigationSplitView allows 2 and 3 column layout
Works with ValueLinks, automatically collapses to a stack for smaller width environments
Look at The SwiftUI Cookbook for Navigation
Scenes – Multi-window views
WindowGroup is the base way for app …
Now you can create “Window” which allows a single window for an app., and you can add a keyboard short cut for that window to be displayed. You can use openWindow() to open the window.
SwiftUI will remember a user’s changes across launches
And .presentationDetents modifier can be used on iOS to provide sheets from the bottom.
MenuBar extras are now available in SwiftUI
MenuBarExtra()
You can use this to build an entire app in the menu bar, or add a menu bar extra to be available.
Added updates for each of them.
Advanced Controls
Forms
System Settings uses this
Forms allow you to create consistent and well formed designs for the detail view
You use Form{}. Section{} and use the modifier .formStyle(.grouped)
You can also use LabeledContent() view to provide simple text and item
Titles and subtitles can have updated text based on state
Controls
Can configure TextField to expand based on axis: .vertical and you can add a limit for the expansion
Date picker now support non-contiguous selection
Aggregate toggles are also available now.
Steppers can now have a format to it’s value. (And available on watch OS – I should change Wasted time to use a stepper)
Tables
Now supported on iPadOS – this is using the same code as macOS – Table(){ TableColumn() } and will render on compact devices like iPhone
You can add a contextMenu(forSelectionType:) to add a selection of items in a table. Will work on single, multiple or no selected row.
You now have a new toolbar design on iPadOS – they can be customized by users and re-ordered. Which will be saved across app launches.
ToolbarItem(placement: .secondaryAction)
Basic search is available with .searchable modifier. Now can add tokens for customized search… can also add scope. Lots of new stuff here.
Sharing (transferable)
Photos
The new picker is privacy preserving
Can be placed anywhere in your app
Need to check out PhotosPicker you add a binding for the selection (looks very easy to use)
Sharing
Standard sharing view just use ShareLink to enable it within your app
Provide content and preview
Should add to card app to share cool cards found
Transferable
New swift first way of transferring across applications
Supports drag and drop and uses .dropDestination()
You need to use Codable and custom Content Type
Graphics and layout
Shape Styles
Color has new gradient properties based on the color you use
Shape has a new Shadow modifier
Previews in Xcode 14 allows for variants to allow you to easily see things at the same time. And without writing configuration code.
Layouts
Applied Geometry
Grid is a new container view to allow for improved layouts
New Layout protocol allows you to build really complex abstractions.
On to “Get to know Developer Mode” –
I noticed this right away when some of my local apps I’ve been working on wouldn’t run. So I had to figure out how to turn it on for my iOS and iPadOS devices. Seems like Apple is working to lock down more things on the device to help increase security on devices.
What is it Developer Mode
iOS16 and WatchOS9 – disabled by default
Have to be enrolled by device
Persists across reboots and system updates
Most common distribution modes do not require developer mode, TestFlight, App Store, enterprise.
Using Developer Mode
If you want to run and install development signed applications,
Use testing automation
Beta releases will have the option visible
It is under Settings -> Private Security
Automation Flow
There are tools to automate multiple devices, but you need to have passcode turned off
You can use devmodectl on macOS Ventura to enable this by default
Now on to security with Meet Passkey:
I wonder if 1Password and LastPass are working with Apple to enable in their password mangers.
Passkeys are now available and should be adopted by everyone
With Autofill and password managers – you currently have 2-3 steps just to log in and it’s longer if you use second factor
Passkeys change to 1 step login – stores data in your KeyChain and is unique by account and strong.
Process will use a QR code if you try to login from an unknown device – or non-Apple – you can then scan from your phone and use it to log in.
Shared accounts support ability to take a trusted account in KeyChain and use Share button to allow other person to use the same key.
Designing for Passkeys
1st they are replacements for passwords – faster, easier and much more secure
Common phrase is “passkey”
In SF Symbols person.key.badge and person.key.badge.fill
You don’t need to design new UI for login.. just keep User Name field
You can present them as a first class entry via AutoFill
There are additional UI options
Passkeys and AutoFill
Use WebAuthn on backend to allow this to work
On Apple platforms the ASAuthorization Family of APIs are used
You need to setup associated domains in webcredentials (2017 session will help you understand)
Make sure you use username type in your UI
Fetch challenge from server
Create provider and request via ASAuthorizationPlatformPublicKeyCredentialProvider and createCredentialAssertionRequest
Pass the request to the ASAuthorizationController
And start the request via .performAutoFillAssistedRequests(). If you use .performRequests() you will get a modal request.
You will get a didCompleteWithAuthorization call back and it will have an assertion and should read values confirm with your server and complete
This will also support Signin With Nearby Device
This also works on the Web via WebAuthN API. – this session shows typical JavaScript example for people who are working on websites.
Note Passkeys are replacing Safari’s legacy platform authenticator
Streamlining Sign-in
Supports using passkey allow Lists – this will show a list of potential passkeys by default for a specific site, you can also use the username to restrict the list to appropriate values.
Silent fallback requests – by default if there are no matching passkeys – it will show you a QR to sign in from a near by device. But you can fallback to show traditional login features, like username and password, but you must handle the error.code == .canceled to show that form (or other logic)
Combined credential requests – this will allow the picker to show that you have a passkey and another account with password
How Passkeys Work
Current technology requires a server to store the hashed and salted value, which if someone else gets it – allows them to get into your account
Passkeys are using public/private keys. Public is stored on the server and available to anyone. This is used in a single use challenge back to your device where the private key is stored in the secure Hardware enclave. This is used to send back a solution, which is sent back to the server. If the server can validate the solution with your public key, you are logged in. The server can only say yes the solution is valid, but it CANNOT create new solutions. The public/private Key solution makes it significantly harder for attackers. AS you should NEVER provide your private key, it makers it near impossible for a hacker to phish. However, like all other security, if you hand over you private key, you are giving someone else what they need to hack you.
Passkey also uses bluetooth via proximity exchange, so a hacked email or fake site can’t also provide the proximity challenge, again, they can’t hack. (The proximity check is in the browser not from the server).
Multi-Factor Authentication
Today, multi-factor allows you combine factors to improve security.
Passkeys eliminate the human factor from phishing, and can’t be leaked from the server, since it is secure on your hardware.
Meet Desktop Class iPad
Focus on Navigation Bar Updates:
Styling and controls
UINavigationBar allows for new optimized UI for iPad, styles like Navigator, Browser, and Editor
Default style is Navigator – this is a traditional UINavigation Bar,
Browser – changes to address history and location. Title is leading
Editor – Leading aligned title – great for destination activities
These last two have lots os space in the center – which all you to present new buttons for the user. Overflow is supposed in all modes (…)
UIBarButtonItems are now grouped – Fixed Groups always appear first and cannot be removed or moved by customization
Movable groups cannot be removed but can be moved.
Shape Group is both movable and removable – will be collapsed when UI needs to save space
Customization will apply these rules… and then allow the user to make the changes.
Overflow contains any item that won’t fit along with the item to customize the bar.
On MacOS this all becomes NSToolBar
Document interactions
UINavigationBar supports adding a menu to the title group – to add actions on the content as a whole
By default they are duplicate, move, rename, export, and print
You can add your own items on the menu, filter away some default, etc.
On Mac Catalyst these items exist in the File Menu, and you add, you have to use UIMenuBuilder to add them to an appropriate menu
Search udpates
In iOS16 Search now takes up less space – it is inline in iOS
Suggestions appear and can be updated along with the query
Confirm to .searchResultsUpdate, UISearchSuggestionItems
Getting the most out of Xcode Cloud
Xcode Cloud Review:
Introduced last year for CI/CD
Can build, run automated tests in parallel and distribute to users
Review and existing Workflow
First check that current workflows are working and look for optimization view
The build details Overview provides info
Build duration is time based, usage is effort based and is used to calculate usage
Xcode Cloud usage dashboard
This shows you usage, trends, and available remaining compute.
Best Practices
Avoid unintended builds (based on start conditions)
Don’t build duplicate commits
Can also use files and folders options to not start a build if only docs or other folders
Predefined actions, Analyze, Archive, Build, Test, etc.
Tests should be based on a concise set of devices (don’t need to do all devices), there is an alias for recommended devices.
To skip based on type of change – just ad [ci-skip] to the end of the commit message and this will skip running a build.
Revisit Optimized Build
Usage dashboard show you the impacts of your changes
Given that Apple is starting to charge for this, I will monitor my usage on my current app I am testing to see if it is still worth it
Bring your world into augmented reality
Using object capture API and reality kit to create 3d Models of real world objects
Object Capture recap
Model and textures are combined to the model
Last year’s session goes thru details
There are some great models available and tools that are avail. Check out the Go App to try on shoes via AR.
ARKit camera enhancements
Take good photos from all sides, if you use camera iPhone or iPad app, it will capture scale and orientation
Leverage ARKit for 3D Guidance UI – this is built into ARKit
The higher the image resolution the better the model quality.
New High Resolution API at native camera resolution – while still using other items. On iPhone 13 (so far) – it does not interrupt the ARSession.
EXIF meta data is available in the photos – just use ARWorldTrackingConfiguration.recommendedVideoFormatForHighResolutionFrameCapturing
Then set config..videoFormat = hiResCaptureVideoFormat
session.run(config)
You then call session.captureHighResolutionFrame()
AVCaptureDevice allows you to capture the underling device properties directly
All of this is in Discover ARKit 6
Best practice guidelines
Characteristics – sufficient texture details (transparent is really hard)
Minimal reflective surfaces
Ensure object is ridged if you flipped
Limited fine Structure – you will need to get close to address that
Ideal environment has diffuse even lighting
Lots of space around the object
Get various nights, and make sure that the object is large in the field of view.
Lots of overlap is important
(Around 80 photos is good)
Get the bottom (another 20 pictures)
Landscape mode for capturing a long object
Copy to a Mac and process them. There are four detail levels of the models – Reduced, Medium, Full and RAW – iOS is limited to the first two. The others are for Pro Workflows
End to end Workflow
Demo of the workflow
Use Photogrammetry session API (from 2021 WWDC)
Reality convert allows you to change colors and textures on objects
Recommend checking out RealityKit session from 2021
Will certainly go over this section multiple times.. great example of showing how use 3D objects in a game
Create parametric 3D room scans with RoomPlan
Cool to see members of the prototyping and video team. RoomPlan is a framework to scan a room to build a parametric model of the room.
This should allow for significant changes in interior design and other home remodeling tools.
Scanning experience API
UIView Subview with World Space Feedback, Realtime Model Generations, and coaching & user guidance
To use in your own app, it’s just four steps:
You can also add delegate classes to opt out of processing and / or export the USDZ model
Data API
Scan -> Process -> Export is the basic workflow
There’s a simple RealityKit app – I downloaded the code.. can’t run it tonight.. but hope to get to it later this week
Best Practices
Need at least 50 lux
Problematic things
Mirrors and Glass present problems
High Ceilings
Dark Surfaces
For high resolution
Close doors
Open curtains
Provide feedback during the scan
Battery and Thermals are things to consider – don’t really want to scan over long 5 minutes
Bringing Continuity Camera to your macOS App
What is continuity camera?
Just bring your iPhone close to your Mac and it works wirelessly
It will also show up as an external camera and microphone on your macOS
For Wired it needs USB for Wireless you need both Bluetooth and Wireless
You get an onboarding dialog onetime for an app.
You now get the devices available
You get additional video effects – In control center you then have the ability to add additional effects
With continuity camera you get blue on non Apple Silicon Macs
You can also combine video effects together
Desk View mode – Portrait camera placement is best. Also turn on Center stage.
I gave this a try with my iPhone by holding It up behind my Mac. It really was magical to see my external keyboard and fingers on the track pad, as if from an overhead camera
All notifications will be paused when you use continuity camera
Building a magical experience
New Camera Management APIs are available.
You should enable the APIs to automatically switch the Camera instead of requiring the user to select from a drop down. You can set the user preferred camera property. It is key value observable (KVO) to intelligently switch to the most preferred camera.
systemPreferredCamera is read only – to present best choice on the system.
Recommend adding a new UI element to enable and disable auto selection mode.
Recipe:
Automatic Camera Selection is Off
Stop KVO systemPreferredCamera
Update session’s input device with user selection
Set userPreferredCamera when user picks a camera
Will need to check out the sample app – Continuity Camera Sample
New APIs on macOS
Your Mac app can now use iPhone camera features
Support up to 12MP in AVCapturePhotoOutput
Can also prioritization of photo quality vs. speed
Flash Capture – is also enabled
Along with metadata to capture if there is a Face of HumanBody in the image from iPhone
Also supports video, movie and other formats are now supported in Continuity camera
The Desk View is exposed as a separate device in device discovery
Adopt Desktop class editing interactions
Edit Menus
Representation is based on input mode used, you can get context menus with right click or secondary menu option.
Data detector integration does things like – if you select an address you will get Get Direction and open in Maps. No code adoption required.
Adding your own actions is UITextViewDelegate to customize – or return nil to get standard system menu
UIMenu controller is deprecated
Instead now we have UIEditMenuInteraction which allows for context menu presentation on secondary click
This is contextual based on the location of the touch in the system.
The behavior on Mac will be familiar to that modality
You now have Preferred element size – similar to how widgets are handled on iPadOS and iOS
Find and Replace
New UI component for in app find and replace editing feature. Works across macOS, iOS, and iPadOS all you need to do to enable is set .isFindInteractionEnabled = true for UITextView, WKWebView, PDFView or Quick Look (already setup).
With HW keyboard all short cuts work as expected just make sure the view can become first responder
You can make it available via a navigation bar
On a scroll view it will adapt to trait selection changes.
It also supports Regular Expression – Wow!
If you want to add to another view, like a list view. You can add UIFindInteraction on any view.
After you add it to your custom view… just setup a UIFindInteractionDelegate
You can also handle all things your self, like a manual find and replace feature you’ve written
Highly recommend watching this session – both for their dry humor and the amount of detail the provide by something that seems so easy to just use. They had me at this closing image.
Complications and Widgets: Reloaded
Adding both watch complications and iPhone Lock Screen widgets
Complications timeline
Immediately accessible, high value information, tap takes your to the area in the app
They are being remade in WidgetKit – I will have to recreate my complication from Wasted Time for the Watch
Accessory Corner family is specific for WatchOS
Go further with WidgetKet
Colors
System controls the look in one of three modes: Full color, accented or vibrant
There is a WidgetRenderingMode
Accented keep original opacity
Vibrant rendering mode, you content is desaturated and then adapter to the environment it is in
Avoid using transparent colors in Vibrant mode
Using AccessoryWidgetBackgroundMode will fix a lot of issues
Project Setup
To update your existing widget app.
You can add a new Widget target if you want to add watch app to existing iOS widget
For watch OS you need to create a preconfigured list of intent providers
Making glanceable views
New AutoUpdatingProgress so you don’t have to so many timeline updates
Make sure to use font styles use things like Headline body, title, and caption
Also look at ViewThatFits to provide better options for o tough fit elements
Privacy
You should have settings for your widgets and complications for when they are redacting content or are in a low luminance state. This is the first hint about an always on iPhone screen.
To test these states you can use the @Environment(\.isLuminanceReduced) variable.
Use .privacySensitive() to redact some values in your widgets
This is a raw notes post.. if I get things wrong.. please let me know! As I am consuming the firehose today.
After many network issues here at home, I was able to get to the State of the Platforms keynote. While I had seen little of the hype at the beginning before losing network access.
Package plugins, allows for extending Xcode via Swift. This really seems like a team based development tool. Definitely see ability to help enterprise development teams focus on standardization of code and documentation.
Significant Swift improvements under the hood should make it faster for startup and linking.
SwiftUI abstractions have been improved to create more standard controls and patterns for users. Love the term “Strong Opinions” for SwiftUI. This allows intelligent defaults based on platform.
Enhancements:
Navigation Style API. New Grid API and Customer Layout API. Customer Layout API allows you to reuse your layout logic. Added Tasksheet and ShareSheet (this uses a new transferable approach).
New Frame work: Data visualization via Swift Charts framework. Declarative framework of swiftUI to present information – line, bar, heat maps, and many other types. So out of the box voice over and other accessibility features. Previews are live by default.
Implicit view stack, now you can add “ViewThatFits”.
New NavigationSplitView.
Mac has new MenuBarExtra(API).
Deeper dive on the Lock Screen and API that support it:
WidgetKit have been added to the “All day Lock Screen”. As thought, this is based on the designs from AppleWatch Complications. So we now have:
Circular, Rectangular, Inline, and all widgets work on both iOS and WatchOS – I will look at moving my Apple Watch Complications from Wasted TIme to the iPhone Home Screen.
Additional updates:
Messages Collaborative API – allows for Sharing and works with privacy and security..
You can drag and drop content with sharing so users will be familiar with the UI interactions.
App Intents Framework – makes your apps features available to the system
Today you have to do it manually, but new framework will make it automated.
Expose your shortcuts when people search for your app in Spotlight
This should greatly increase app short cut coverage and discoverability.
There’s a new SiriTip modifier in SwiftUI
Passkeys designed to be easy to use and provide a good transition away from passwords.
websites need to be setup to support Passkey and Password based logins
Uses Public Key Cryptography – only the public key is stored on the server reducing risk to website owners
WebAuthn standard is used by PassKey.
iPadOS:
Find and replace is automatically enabled for your textviews.
DriverKit is now available for iPad, (Same API as on macOS) so this should enable significant updates for hardware connections
CallKit has voice over IP mode. to improve Watch
TvOS 16:
adding connection between iPhone and
added device discovery and connection for you
Phone and iPad
SKAddNetwork – API to improve campaign performance with out tracking users
ScanKit and RoomPlan create USD and USDZ format to improve 3D experiences.
Focus Filters are now enabled on top of App Intents – so app can just show appropriate information based on specific focus modes
Metal updates:
by improving resource loading, app can focus on other activities to improve the gamers experience
Offline Shader compilation allows for improved performance based on combo if Apple Silicon and Metal (the benefit of a closes system)
New Mesh Shader API allows you to optimize the mesh creation and shading to reduce need to access device memory.
MetalFX upscaling – allows you to render the frame at a lower resolution and then allow metal to create temporal upscaling to reduce dropped frames.
MapKit updates:
3D city experience is available to all Apps now.
Allowing for better context and precision so users can show where POIs are in more detail.
You can position cameras in 3D Space, pitch, tilt and more can all be controlled. By default elevation is flattened but you can enable 3D terrain.
Look around uses high res 3D animation.
New – Apple Map Server APIs – restful APIs allows backend services.
Weather App:
now on iPad and Mac
Also available as a Rest API
Native Swift API WeatherKit
APIs are available for you to add to your own app.
Forecasts are 10 days for hour by hour data.
Data is never shared or sold, and adheres to apple’s privacy policies
500k API calls per month free with Developer account
Live Text:
visionKit – two new APIS
Live Text API – allows for text and QR codes in videos and pictures
Data Scanner API – allows for live feed analysis
You need to add your own overlays to tailor to your app
Xcode Cloud:
Announced their pricing. Nice to see that existing developer will get bottom tier for free thru 2023. I’ve been using Xcode Cloud for an app I’ve been playing with and the CI/CD pipeline really works well.
Every year I take an “Education-Vacation” to coincide with WWDC. I was lucky enough back in 2018 and 2019 to actually go to WWDC in person. Over the last few years it has all been virtual.
At times WWDC has blown my mind like the dragon in my favorite WWDC shirt.
As I get ready to blog about today’s Keynotes, I the excitement is high. I am hoping to see serious updates on SwiftData (?), AR/VR, and macOS. Let the blogging begin!
2022 – Keynote!
Wow the videos of Apple Park are stunning! And here’s Tim!
The new developer center across from Apple Park and Tech Talk for developers. Developer academies to help the next generation – 17 around the world. Nice to see reading out to under represented communities across the globe.
Over to Craig — here we go!
Really nice production value on the graphics! Time for iOS – yup version 16. New personalization features include:
Lock Screen – all new – time based changes,I am betting this are driven by Siri intents, etc.depth effects look cool. Seems like they are taking what they learned from watchOS to iOS. Really nice animation between Lock Screen and Lock Screen.
Notifications now roll in from the bottom, and can be hidden. Later this year, Live Activities API for developers. Tying focus to lock screens allows you to decide what is appropriate – guess more time to setup Focus settings.
Messages will include (Edit messages, Undo Send, and unread marking) nice updates for productivity. Shared with you API will be added.
SharePlay (people are loving? Really? – I never got this working myself). Easier to discover in Facetime – including new app discovery. It will now be available in Messages.
Dictation improvements – fluid movement between typing and voice. (Keyboard stays open). Auto punctuation – also works with sending messages with Siri. There are 15,000 apps that work with Siri.. new APP Intents API – zero setup for short cuts.
Live Text – integrated across the system. This year will add live text to Video – great for copying code samples. Quick actions for Translation. Live Text API available for developers…
Visual Lookup – (introduced last year) touch and hold will allow you take images out of other imagers for copy and paste.
Apple Wallet – select TSA check points will support wallet. Apps will allow for select information to be presented like age verification (old enough not actual age). Keys can be shared from Apps. Working with IETF to address sharing keys across non-apple apps.
Apple Pay – Tap to Pay on iPhone enabled this month, will enable small merchants to support touches pay. Adding Apple Pay Later – into 4 equal payments over 6 weeks with no interest. For developers no changes needed to address Apple Pay Later. Order tracking added into Apple Pay! That’s cool.
Maps – Adding additional eleven countries to new maps experience. Adding improved models to the map look. Multi-stop routing (with up to 15 stops), about time! While driving you can ask Siri to add additional stops to your route. You can also see transit fairs. MapKit updates include –
Look around being added.
Brand new server side APIs
Sports – in Apple News -Live activities on Lock Screen (from Apple TV app). Adding follow your favorite team and leagues: My Sports. It is free in US, UK, Canada and Australia to start with.
Family Sharing updates – Adding new account management tools for kids. Quick setup of other parental controls. Quick start will allow easy setup of new devices. Requests for extension will be done within messages. Family checklist makes it easier to setup
Improved Photo sharing updates for Families. iCloud Shared Photo Library – separate library that everyone can contribute to it. Can set auto sharing when near others in the family.
Privacy updates –
Personal Safety to turn off others access. Safety Check – Working with NNEDV, NCVC, and WESNET to review and reset access granted to others. Also resets privacy permissions to all apps. Restricts messages and FaceTime to the device in hand. This is amazing control given back to survivors of abusive relationships.
HomeKit updates –
Smart home is still in it’s early days (I remember this being said in 1999). Matter standard enables cross platform integration, HomeKit was contributed as a foundation for Matter. Data about how you use your accessories cannot be seen by Apple.
All new Home App – More efficient and relaiable
Redesigned so you can see the whole home in a single view. Multi camera view upfront. Different accessories are more recognizable. New widgets on the Home Screen (iPhone, iPad, and Mac)
Car Play updates –
over 98% of cars in the US. 79% of US buyers only consider a car that have CarPlay. (I can tell you I am one of them).
Larger screens in cars, allows for improved experience. Sneak Peak of next gen CarPlay. This should really give Tesla a run for the new in car Screen!
I wonder how many vehicle manufactures will let Apple take control of their screens like this. Widgets are included too! Very cool. Privacy friendly, on device integration with vehicle canBus. Core of driving experience unique to each driver. Late Next Year 🙁
TrueDepth camera on iPhone can be used to improve your spatial audio profile.
OK now to watchOS:
Most loved watch in the world:
Adding 4 new watch faces.
New notifications and pinning most used apps.
Developers new share sheet and photo pickers API
Now to keep you active on the watchOS
Running updates to show metrics to better understand your performance.
Three new running form metrics:
Vertical oscillation
Stride length
Ground contact time
Workout views to show more information
including heart rate zones.
adding alerts to keep your heart rate in the right zone
New multi-sport workout type for Triathletes – auto switched between swimming, running, and biking
Fitness app will also be available for all iPhones without a watch.
Now to keep you healthy in watchOS
Sleep App – will now try to discover which stage of sleep you are in.
Heart heart help – adding support once you are diagnosed with Afib. History in health app will also help you share a PDF with your Dr. to help address long term information. FDA clearance expected “Soon”.
Medication tracking being added to watchOS app. Meds, Vitamin, and supplements with reminders. You can use iPhone camera to track your medications.
Drug drug interactions will show alerts with you add a new medication. Will allow you to share your health data with family members.
Privacy with watchOS
encrypted on device
not shared with out explicit permission
reminders periodically of what you are sharing and with who.
macOS updates
M2 introduction still 5nanometer. But 50% better bandwidth. 24GB unified memory, 8 core CPU, 18% increase in overall performance as M1. M2 10Core machine will drive 25% higher graphics at the same power level as M1. Next generation Secure Enclave and Neural engine, and media engines.
Announcing new MacBook Air with M2 chip. The Worlds Best Selling Laptop. Completely redesigned around M2. Colors and MagSafe. From the side it looks like an iPad to me. 11.3mm thick and 2.7 lbs. Silver, space gray, starlight and midnight. with two additional thunderbolt ports and high impedance headphone jack. (13.6 inch display). with 1 Billion color liquid retina display. 1080p camera with 2x resolution as previous. Audio speaker and three microphone array at the top of the device. Full height function keys. 18 hours of video playback and new charging adapter. Also support fast change for the first time. (50% in 30 minutes of charging)
Adding M2 to 13inch MacBook Pro – adds cooling vs. silent Air. 20 hours of video playback.
Basically $100 more for Pro, and M1 version stays in line up for $999. M2 Air $1199 and $1299 for Pro.
macOS Ventura –
New – Stage Manager – improved task switch and window manager.
app grouping allows your pair windows for a specific task.
accessing desktop files seems like an easy approach.
SpotLight –
Tap on spacebar allows for quick look.
you can search text in images with live text.
Richer full window results (also coming to iOS and iPadOS)
Mail updates –
Undo Send (for a few minutes)
Schedule Sent
Follow-up Seggestions
Remind Me to come back to a message
Search – biggest overhaul – you can see recently share docs and links, instant suggestions (with typo improvements)
Safari –
More support for standards
Adding Shared Tab Groups, allows you to share in one place. Can see realtime who is reviewing
Adding improved safety by supporting the new Passkeys approach using biometrics and digital keys. Can’t be phished or leaked. It is all on device. Synced across apple devices on Mac, Apple TV, iPhone and iPad . This is part of the Fido Alliance work.
Gaming –
Metal Updates:
New features include: Affects Upscaling (based on smaller less compute intensive fames, and then upscaling), and game loading via Fast Resource loading API.
Village Resident Evil from Capcom – technical demo – available later this year.
Continuity –
extending to FaceTime allowing you to hand off between Mac and iPhone.
Continuity Camera – you can use your iPhone as your webcam. Guess we have a new Apple stand to attach phone to your laptop. this will also support center stage and portrait mode. Studio light allows you to improve tough lighting conditions. Desk view allows your share desk so you can see peoples hands, etc.
Will also work with Zoom, Teams, WebEx and more.
iPadOS!
Big release – everything you heard about earlier in macOS and iOS
Weather comes to iPad (about time).
And new features for pro users:
Collaboration –
instance collaboration across the system via share screen
get notifications of missed changes back in the messages application.
New API to integration collaboration in their apps, also coming to iOS and macOS
New brainstorming app – Free Form – coming later this year. this provides a space for group sessions, project planning, etc. Looks like a giant whiteboard. With live cursors. Will definitely take on Mural and other apps. Kinda like a GIANT One Note share app
Gaming –
Call out to Divinity Original Sin Two
Metal 3
background download API
Game Center will bring activities to dashboard
SharePlay in gaming will allow you to join people into your game. (some time later this year)
Desktop class Apps
across the board updates to add Mac features on to iPadOS
Files major updates
System wife features – redesigned find and replace
Document menu to reveal common actions
Customizable toolbars in iPadOS
New APIs to build these in to your own apps.
Reference Color – allows you to use the iPad Pro 12.9 inch to address reference colors (for media experts) to provide consistent workflow across devices.
Display Scaling setting!! To view more of your apps.
stage Manager is coming to iPadOS to dramatically improve multi-tasking with full external display support on iPad!!!
I guess we now know why the Monitor has what it does. Can’t wait to test things out today (and this summer).
I’m really excited to announce I will presenting at the upcoming IBM Engineering Lifecycle Management User Group Virtual Conference. During the session will be taking customers and partners thru the OSLC based API discovery process, including creating the ETM Test Plan.
I will be taking questions and showing demos, so sign up! See you then!
Wow! I’ve been using swift for a bunch of years, and have never come across enum associations. Imaging getting to that on day two of a course.
import UIKit
enum Activity {
case bored
case running(destination: String)
case talking(topic: String)
case singing(volume: Int)
}
let talking = Activity.talking(topic: "football")
What you see above is the association added to the running, talking and singing values of the enum Activity. This way you can “associate” additional information to a specific enum, making it much more meaningful. Very cool.
Today I am going to try and start the 100 days of swift program that Paul Hudson provides. I’ve been using Swift for years, and taken a ton of individual classes, read books, and even published a few apps on the App Store. However, I find I still find some things just don’t work like I expect.
I believe this is due to my haphazard approach to learning the language. The biggest challenge is making time every day to do this.
In my prior posts I took you through the discovery flow to identify the resource shape of creating a new Project Area. The only problem was, there is no public API for creating a Project Area, either via OSLC or published ELM APIs. To that end, you may have been a bit frustrated that all that knowledge ended with a bit of thud.
Let’s rectify that, by building a testing process via IBM ETM and it’s exposed OSLC based APIs. As you can see in the diagram above, a lot of what you have already learned will be applicable. There will be a few minor differences:
We will be accessing the QM application. We will be looking for qm#TestPlan in our Project Area’s services catalog
We can take this same pattern for many other OSLC based creation APIs, so I will go thru it in more detail this time. As before we will be using our locally setup server, on my machine it is https://elmwb.com on port 9443, so to get to our RootServices we will start at https://elmwb.com:9443/qm/rootservices
RootServices
As we did previously, our first call is to query the root services API for the appropriate application server. We are going to look at the Engineering Test Management (qm) based services in the root services document. There are many namespaces, but let’s look at the following – oslc_(multiple), qm_rqm, and rqm:
<https://elmwb.com:9443/qm/rootservices>
qm_rqm:trackedResourceSetProvider
[ a trs2:TrackedResourceSet ;
oslc:domain oslc_config: ;
trs2:trackedResourceSet
<https://elmwb.com:9443/qm/trs2> ;
dc:description "IBM Engineering Test Management (QM) resources, including test plans, cases, scripts, and results."@en ;
dc:title "ETM Resources (TRS 2.0)"@en ;
dc:type <http://open-services.net/ns/qm#>
] ;
qm_rqm:trackedResourceSetProvider
[ a trs2:TrackedResourceSet ;
trs2:trackedResourceSet
<https://elmwb.com:9443/qm/process-trs2> ;
dc:description "IBM Engineering Test Management (QM) process resources, including project areas, team areas, timelines, and iterations."@en ;
dc:title "ETM Process Resources (TRS 2.0)"@en ;
dc:type <http://jazz.net/ns/process#>
] ;
rqm:majorVersion "7" ;
rqm:version "7.0.2" ;
oslc_auto:autoServiceProviders
<https://elmwb.com:9443/qm/oslc_auto_test/catalog> ;
oslc_config:cmServiceProviders
<https://elmwb.com:9443/qm/oslc_config/catalog> ;
oslc:publisher <https://elmwb.com:9443/qm/application-about> ;
oslc_qm:qmServiceProviders
<https://elmwb.com:9443/qm/oslc_qm/catalog> ;
dc:title "Quality Management"@en .
As you can see above there are 6 root services:
Tracked Resources Set Provider for test plans, cases, scripts and results
Tracked Resources Set Provider for test process resources: project areas, teams, areas, timelines, and iterations
OSLC Auto Service Providers
OSLC Configuration Management Service Providers
OSLC Publisher
OSLC QM Service Providers
I’ll be focusing on our OSLC QM Service Providers since we want to be able to setup automated testing.
OSLC QM Service Providers
The QM (Quality Management) Service Providers API exposes those services for IBM Engineering Test Management, they support the process of testing with Test Plans, Test Case, etc. On my server, and based on the above RootServices document we see that the API is defined as:
Please note, I have removed the authentication information from the GET Url, as it will be different based on the authentication method you choose (OAuth1.0a or OIDC). As in my prior discovery blog post, we want to identify the services.xml that contains the APIs for our chosen Project Area. In our above rdf+xml it can be found at the path: <rdf:RDF><oslc:ServiceProviderCatalog><oslc:serviceProvider rdf:about=> . I’ve highlighted the services end point in bold above – https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/services.xml.
This end point will now allow us to look at the automation Services supported by “JKE Banking (Quality Management)”.
QM Service Provider
Now that we have found the QM Service Provider for the “JKE Banking (Quality Management)” project area, we can identify the various Creation Factories and Query Capabilities. Both of these services will provide both a Resource Shape and an endpoint to use for creating the object. For Creation Factories we are looking for “oslc:creation”; while for Query Capabilities we look for “oslc:queryBase”.
The API for Automation Service Provider is defined as:
GET Access Service Provider
IBM Engineering Test Management A Project Area’s Service Providers.
Authorization OAuth 1.0
Consumer Key consumerkey
Consumer Secret consumerSecret
Token
Token Secret
Request Headers
Accept application/rdf+xml
OSLC-Core-Version 2.0
Content-Type application/xml
Accept text/turtle
Example
Request cURL
curl --location --request GET ‘https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/services.xml' \
--header 'Accept: application/rdf+xml' \
--header 'OSLC-Core-Version: 2.0' \
--header 'Content-Type: application/xml’
Please note, I have removed the authentication information from the GET Url, as it will be different based on the authentication method you choose (OAuth1.0a or OIDC).
If we look at , we will find the following Creation Factory for our Test Plan:
This is exactly what we are looking for. As I mentioned above, there are two items we are looking for:
oslc:resourceShape
oslc:creation
These two elements provide us with the two endpoints we need to create a new Test Plan. The Resource Shape will let us know what data we need to provide for creating a new Test Plan; while the Creation Factory provides us with the end point to actually create it.
We begin with our GET to the oslc:resourceShape using the same headers and authentication from the Service Provider API, to help reduce the length of this article I am not going to repeat that here. The point is, we are using these same values for all our APIs unless I specifically call it out.
The first thing you may notice in the returned Resource Shape is that it contains many xml:lang tags. This allows for many of the elements to provide titles in various languages. To shorten this post, I will remove all but xml:lang=“en”.
There are two types entries in this resource shape, the base object and node entries. The nodes actually are the details for each of the properties required when creating the base object. In our case the base object is our Test Plan. We see that defined here:
As we see there are 27 properties required to create a Test Plan and I plan to go thru them one by one. After this is complete we should have what we need to define the body of the Creation Factory.
Please note that the Node numbers may vary and are only used to identify information in the resource shape.
There is a bunch of information in this definition, we will see similar properties for each node. Those properties in the dcterms name space are descriptive, so I will not focus on them. I have removed all of the various language values for jrs:inversePropertyLabel, dcterms:description and dcterms:title.
If we look at the <rdf:type> we see that our node A0 is defined as a core#Property. We know this will be a property of our Test Plan. The title and description is defined in dcterms: title = “Formal Review” and description = “The formal review records of the resource.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:valueShape
This will point to a resource shape for the value, as defined in the oslc:valueType
Indicates the resource of property should not be displayed to users.
FALSE
This table tells us a lot about A0. Ultimately we see that it occurs Zero-or-many, meaning this an optional value, that may have more than one value. The values are defined as AnyResource, whose name (or identifier) is formalReview. The values are stored “inline” in the format of a QualityApproval resource shape. We also see that the client can update the value, and its value can be displayed to users of the system.
Therefore, we will include <oslc:formalReview/> in the body of our test plan creation factory post.
Node a1 – has child plan
Here’s the details of the node:
<rdf:Description rdf:nodeID="A1">
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">hasChildPlan</oslc:name>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<jrs:inversePropertyLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Parent Plan</jrs:inversePropertyLabel>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:range rdf:resource="http://open-services.net/ns/qm#TestPlan"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The child test plan of the Test Plan.</dcterms:description>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Has Child Plan</dcterms:title>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan"/>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#hasChildPlan"/>
</rdf:Description>
The title and description is defined in dcterms:title = “Has Child Plan” and description = “The child test plan of the Test Plan.” We also see our first occurrence of a <jrs:inversePropertyLabel> with a value of “Parent”. This implies that a Child Plan which points to this Test Plan, will identify this plan as its “Parent” plan.
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Indicates the resource of property should not be displayed to users.
FALSE
We see that it occurs Zero-or-many, meaning this an optional value, that may have more than one value. The values are defined as Resource, whose name (or identifier) is hasChildPlan. We also see that the client can update the value, and its value can be displayed to users of the system.
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:hasChildPlan/> in the body of our test plan creation factory post.
The title and description is defined in dcterms: title = “Category” and description = “The category title and subject for the resource.”
We see our first appearance of “oslc”allowedValue”, this is providing a link to the categories defined for this project area on your server. On my server there are 12 unique values for Category as defined in this resource shape. If I were to perform the following GET:
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:category/> in the body of our test plan creation factory post.
The title and description is defined in dcterms:title = “Has Priority” and description = “The priority of the resource.” The “oslc” allowedValue” appears again, providing links to valid priorities on this server, you can use a GET on the resource if you want to know the values.
The rest of the values are values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:name
The local name of the defined property.
hasPriority
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:hasPriority/> in the body of our test plan creation factory post.
Node A21 – Title
Here’s the details of the node:
<rdf:Description rdf:nodeID="A21">
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Exactly-one"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:valueType rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">title</oslc:name>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML <span> element.</dcterms:description>
<oslc:propertyDefinition rdf:resource="http://purl.org/dc/terms/title"/>
</rdf:Description>
The description is defined in dcterms:description = “Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML <span> element.” The comment about (reference: Dublin Core) is key here, as our Response body will contain a <dcterms:title> instead of <oslc:title> .
The rest of the values are <oslc> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality. Exactly-one tells us this is Mandatory.
We have found our first mandatory property for creating a test plan. In our case we will use the following entry in our Response Body: <dcterms:title>Test plan created from API</dcterms:title>. Remember, the dcterms:description let us know we should use dcterms instead of oslc in our name space.
Node a24 – contributor
Here’s the details of the node:
<rdf:Description rdf:nodeID="A24">
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">contributor</oslc:name>
<oslc:range rdf:resource="http://xmlns.com/foaf/0.1/Person"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Contributor</dcterms:title>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:propertyDefinition rdf:resource="http://purl.org/dc/terms/contributor"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Either"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Contributor or contributors to resource (reference: Dublin Core). It is likely that the target resource will be an foaf:Person but that is not necessarily the case.</dcterms:description>
<oslc:valueShape rdf:resource="http://xmlns.com/foaf/0.1/Person"/>
The title and description is defined in dcterms: title = “Contributor” and description = “Contributor or contributors to resource (reference: Dublin Core). It is likely that the target resource will be an foaf:Person but that is not necessarily the case.” If you are not familiar with the acronym “foaf” – it stands for Friend of A Friend – you can read more about it here – https://en.wikipedia.org/wiki/FOAF_(ontology).
The rest of the values are values <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Given that this is optional, we will not provide any value in our simple POST body. We will include <foaf:contributor/> in the body of our test plan creation factory post.
Node a31 – template
Here’s the details of the node:
<rdf:Description rdf:nodeID="A31">
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">template</oslc:name>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-one"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Template</dcterms:title>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#template"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The artifact template used to specify the sections in the Test Plan.</dcterms:description>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
</rdf:Description>
The title and description is defined in dcterms: title = “Template” and description = “The artifact template used to specify the sections in the Test Plan.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
Indicates the resource of property should not be displayed to users.
FALSE
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:template/> in the body of our test plan creation factory post.
Node a32 – related change request
Here’s the details of the node:
<rdf:Description rdf:nodeID="A32">
<jrs:inversePropertyLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Related Test Plan</jrs:inversePropertyLabel>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:range rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:propertyDefinition rdf:resource="http://open-services.net/ns/qm#relatedChangeRequest"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:valueShape rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">A related change request. It is likely that the target resource will be an oslc_cm:ChangeRequest but that is not necessarily the case.</dcterms:description>
Label>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Related Change Request</dcterms:title>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">relatedChangeRequest</oslc:name>
</rdf:Description>
The title and description is defined in dcterms: title = “Related Change Request” and description = “A related change request. It is likely that the target resource will be an oslc_cm:ChangeRequest but that is not necessarily the case.” The describes that a related Change Request which points to this Test Plan, will identify this plan as its “Related Test Plan”.
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:range
The value of the applicable property is constrained to be of type Change Request.
http://open-services.net/ns/cm#ChangeRequest
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
Indicates the resource of property should not be displayed to users.
FALSE
oslc:name
The local name of the defined property.
relatedChangeRequest
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:relatedChangeRequest/> in the body of our test plan creation factory post.
Node a35 – iteration
Here’s the details of the node:
<rdf:Description rdf:nodeID="A35">
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Iteration</dcterms:title>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/process#iteration"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The development iteration associated with the Test Plan.</dcterms:description>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-one"/>
<oslc:valueShape rdf:resource="http://jazz.net/ns/process/shapes/Iteration"/>
<oslc:range rdf:resource="http://jazz.net/ns/process#Iteration"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">iteration</oslc:name>
</rdf:Description>
The title and description is defined in dcterms: title = “iteration” and description = “Iteration.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:propertyDefinition
The formal review records of the resource.
http://jazz.net/ns/process#iteration
oslc:hidden
Indicates the resource of property should not be displayed to users.
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:iteration/> in the body of our test plan creation factory post.
node a39 – test schedule
Here’s the details of the node:
<rdf:Description rdf:nodeID="A39">
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan#TestPhase"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Inline"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#testSchedule"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">testSchedule</oslc:name>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The test schedule of the Test Plan.</dcterms:description>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Test Schedule</dcterms:title>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#TestPhase"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Test Schedule” and description = “The test schedule of the Test Plan.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:valueShape
This will point to a resource shape for the value, as defined in the oslc:valueType
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:testSchedule/> in the body of our test plan creation factory post.
node a41 – team area
Here’s the details of the node:
<rdf:Description rdf:nodeID="A41">
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/process#teamArea"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<oslc:range rdf:resource="http://jazz.net/ns/process#TeamArea"/>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:valueShape rdf:resource="http://jazz.net/ns/process/shapes/TeamArea"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-one"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Team Area</dcterms:title>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">teamArea</oslc:name>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The team area that is responsible for the resource.</dcterms:description>
</rdf:Description>
The title and description is defined in dcterms: title = “Team Area” and description = “The team area that is responsible for the resource.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:propertyDefinition
The Team Area responsible for the resource.
http://jazz.net/ns/process#teamArea
oslc:representation
The representation of the object resource must be present in the representation of the described resource.
http://open-services.net/ns/core#Reference
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:hidden
Indicates the resource of property should not be displayed to users.
The value of the applicable property is constrained to be of type Team Area.
http://jazz.net/ns/process#TeamArea
oslc:valueShape
This will point to a resource shape for the value, as defined in the oslc:valueType
http://jazz.net/ns/process/shapes/TeamArea
oslc:occurs
Optional, single value
http://open-services.net/ns/core#Zero-or-one
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:name
The local name of the defined property.
teamArea
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:teamArea/>in the body of our test plan creation factory post.
The title and description is defined in dcterms: title = “Has Workflow State” and description = “The current workflow state of the resource.” We see this resource shape has both a oslc:defaultValue, and a set of oslc:allowedValues. The oslc:defaultValue matches one of the many oslc:allowedValues.
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:range
The value of the applicable property is constrained to be of type Workflow State.
Indicates the resource of property should not be displayed to users.
FALSE
oslc:occurs
Optional, single value
http://open-services.net/ns/core#Zero-or-one
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:hasWorkflowState/> in the body of our test plan creation factory post.
node a53 – Runs on test environment
Here’s the details of the node:
<rdf:Description rdf:nodeID="A53">
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">runsOnTestEnvironment</oslc:name>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Runs on Test Environment</dcterms:title>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:propertyDefinition rdf:resource="http://open-services.net/ns/qm#runsOnTestEnvironment"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#TestEnvironment"/>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rational.test.lm.AssetConfiguration"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The test environment that the Test Plan will be run on.</dcterms:description>
</rdf:Description>
The title and description is defined in dcterms: title = “Runs on Test Environment” and description = “The test environment that the Test Plan will be run on.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:runsOnTestEnvironment/> in the body of our test plan creation factory post.
Node a54 – uses test case
Here’s the details of the node:
<rdf:Description rdf:nodeID="A54">
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">usesTestCase</oslc:name>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Either"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:propertyDefinition rdf:resource="http://open-services.net/ns/qm#usesTestCase"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Test Case used by the Test Plan. It is likely that the target resource will be an oslc_qm:TestCase but that is not necessarily the case.</dcterms:description>
<jrs:inversePropertyLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Used By</jrs:inversePropertyLabel>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:range rdf:resource="http://open-services.net/ns/qm#TestCase"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Uses Test Case</dcterms:title>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestCase"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Uses Test Case” and description = “Test Case used by the Test Plan. It is likely that the target resource will be an oslc_qm:TestCase but that is not necessarily the case.” We also see with a value of “Used By”. This implies that a test case which points to this Test Plan, will identify it is “Used By” this plan.
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:name
The local name of the defined property.
usesTestCase
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:representation
The representation of the object resource must be present in the representation of the described resource.
http://open-services.net/ns/core#Either
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:usesTestCase/> in the body of our test plan creation factory post.
node a68 – key date
Here’s the details of the node:
<rdf:Description rdf:nodeID="A68">
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Key Date</dcterms:title>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The key date of the Test Plan.</dcterms:description>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#KeyDate"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#keyDate"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">keyDate</oslc:name>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan#KeyDate"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Inline"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Key Date” and description = “The key date of the Test Plan.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:range
The value of the applicable property is constrained to be of type QM Key Date.
http://jazz.net/ns/qm/rqm#KeyDate
oslc:hidden
Indicates the resource of property should not be displayed to users.
The representation of the object resource must be present in the representation of the described resource.
http://open-services.net/ns/core#Inline
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:keyDate/> in the body of our test plan creation factory post.
node a70 – tests development plan
Here’s the details of the node:
<rdf:Description rdf:nodeID="A70">
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Tests Development Plan</dcterms:title>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:propertyDefinition rdf:resource="http://jazz.net/xmlns/prod/jazz/calm/1.0/testsDevelopmentPlan"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:range rdf:resource="http://open-services.net/ns/cm-x#Plan"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">testsDevelopmentPlan</oslc:name>
<oslc:valueShape rdf:resource="http://open-services.net/ns/cm-x#Plan"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Development Plan tested by the Test Plan.</dcterms:description>
</rdf:Description>
The title and description is defined in dcterms: title = “Tests Development Plans” and description = “Development Plan tested by the Test Plan.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:testsDevelopmentPlan/> in the body of our test plan creation factory post.
node a71 – attachment
Here’s the details of the node:
<rdf:Description rdf:nodeID="A71">
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The file that has been attached to the Test Plan.</dcterms:description>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Attachment</dcterms:title>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#attachment"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">attachment</oslc:name>
</rdf:Description>
The title and description is defined in dcterms: title = “Attachment” and description = “The file that has been attached to the Test Plan.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:attachment/> in the body of our test plan creation factory post.
node a73 – objective status group
Here’s the details of the node:
<rdf:Description rdf:nodeID="A73">
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#objectiveStatusGroup"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Objective Status Group</dcterms:title>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan#ObjectiveStatusGroup"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">objectiveStatusGroup</oslc:name>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Inline"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The objective status group of the Test Plan.</dcterms:description>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#ObjectiveStatusGroup"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Objective Status Group” and description = “The objective status group of the Test Plan.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:propertyDefinition
A Jazz QM object Status Group
http://jazz.net/ns/qm/rqm#objectiveStatusGroup
oslc:valueShape
This will point to a resource shape for the value, as defined in the oslc:valueType
Given that this is optional, we will not provide any value in our simple POST body. We will include <rqm_qm:objectiveStatusGroup/> in the body of our test plan creation factory post.
node A80 – risk
Here’s the details of the node:
<rdf:Description rdf:nodeID="A80">
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Risk</dcterms:title>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#Risk"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">risk</oslc:name>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan#Risk"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Inline"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#risk"/>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">A measurement of the risk associated with a planning effort for the resource.</dcterms:description>
</rdf:Description>
The title and description is defined in dcterms: title = “Risk” and description = “A measurement of the risk associated with a planning effort for the resource.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:valueType
A URI Reference representation to a resource.
http://open-services.net/ns/core#AnyResource
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:range
The value of the applicable property is constrained to be of type Risk.
http://jazz.net/ns/qm/rqm#Risk
oslc:name
The local name of the defined property.
risk
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
The representation of the object resource must be present in the representation of the described resource.
http://open-services.net/ns/core#Inline
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:propertyDefinition
A Jazz QM risk.
http://jazz.net/ns/qm/rqm#risk
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:risk/> in the body of our test plan creation factory post.
node a82 – contains test suite
Here’s the details of the node:
<rdf:Description rdf:nodeID="A82">
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Either"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#TestSuite"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#containsTestSuite"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The test suite associated with the Test Plan.</dcterms:description>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Contains Test Suite</dcterms:title>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestSuite"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">containsTestSuite</oslc:name>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Contains Test Suite” and description = “The test suite associated with the Test Plan.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:representation
The representation of the object resource must be present in the representation of the described resource.
http://open-services.net/ns/core#Either
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:range
The value of the applicable property is constrained to be of type Test Suite.
Given that this is optional, we will not provide any value in our simple POST body. We will include <rqm_qm:containsTestSuite/> in the body of our test plan creation factory post.
node a84 – execution effort
Here’s the details of the node:
<rdf:Description rdf:nodeID="A84">
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">executionEffort</oslc:name>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-one"/>
<oslc:valueType rdf:resource="http://www.w3.org/2001/XMLSchema#float"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#executionEffort"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Execution Effort</dcterms:title>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The execution effort that the Test Plan defined in person hour.</dcterms:description>
</rdf:Description>
The title and description is defined in dcterms: title = “Execution Effort” and description = “The execution effort that the Test Plan defined in person hour.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:name
The local name of the defined property.
executionEffort
oslc:occurs
An optional, single value
http://open-services.net/ns/core#Zero-or-one
oslc:valueType
A URI Reference representation to a resource.
http://www.w3.org/2001/XMLSchema#float
oslc:propertyDefinition
The formal review records of the resource.
http://jazz.net/ns/qm/rqm#executionEffort
Given that this is optional, and we see it is defined as a float, we provide a value of 42.0 in our simple POST body. We will include <rqm_qm:executionEffort>42.0</rqm_qm:executionEffort>in the body of our test plan creation factory post.
node a90 – category:release
Here’s the details of the node:
<rdf:Description rdf:nodeID="A90">
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#CategoryResource"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan#CategoryResource"/>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMObVokaEeynq4H4YH03kw#"/>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMQ3l4kaEeynq4H4YH03kw#"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Category: Release</dcterms:title>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">category_PML_F4kaEeynq4H4YH03kw</oslc:name>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Defines an enumeration value associated with a test artifact.</dcterms:description>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMQQgIkaEeynq4H4YH03kw#"/>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMMmJ4kaEeynq4H4YH03kw#"/>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMPCZokaEeynq4H4YH03kw#"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Inline"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMQQiIkaEeynq4H4YH03kw#"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#category_PML_F4kaEeynq4H4YH03kw"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Category: Release” and description = “Defines an enumeration value associated with a test artifact.” This shape also includes an enumeration of the allowed values in the <oslc:allowedValue> tags.
The rest of the values are values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:range
The value of the applicable property is constrained to be of type Category Resource.
http://jazz.net/ns/qm/rqm#CategoryResource
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:valueShape
This will point to a resource shape for the value, as defined in the oslc:valueType
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:category_PML_F4kaEeynq4H4YH03kw/> in the body of our test plan creation factory post.
node a117 – category: test phase
Here’s the details of the node:
<rdf:Description rdf:nodeID="A117">
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqmy:category:_PMUh8IkaEeynq4H4YH03kw#"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Inline"/>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">category_PMRep4kaEeynq4H4YH03kw</oslc:name>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMSFtokaEeynq4H4YH03kw#"/>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMVwEIkaEeynq4H4YH03kw#"/>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#CategoryResource"/>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMSsxokaEeynq4H4YH03kw#"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Category: Test Phase</dcterms:title>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan#CategoryResource"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#category_PMRep4kaEeynq4H4YH03kw"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Defines an enumeration value associated with a test artifact.</dcterms:description>
</rdf:Description>
The title and description is defined in dcterms: title = “Category: Test Phase” and description = “Defines an enumeration value associated with a test artifact.” This shape also includes an enumeration of the allowed values in the <oslc:allowedValue> tags.
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:representation
The representation of the object resource must be present in the representation of the described resource.
http://open-services.net/ns/core#Inline
oslc:name
The local name of the defined property.
category_PMRep4kaEeynq4H4YH03kw
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:range
The value of the applicable property is constrained to be of type Jazz QM Category Resource.
http://jazz.net/ns/qm/rqm#CategoryResource
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:valueShape
This will point to a resource shape for the value, as defined in the oslc:valueType
Given that this is optional, we will not provide any value in our simple POST body. We will include <rqm_qm:category_PMRep4kaEeynq4H4YH03kw/> in the body of our test plan creation factory post.
noe a136 – category:product
Here’s the details of the node:
<rdf:Description rdf:nodeID="A136">
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Category: Product</dcterms:title>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Inline"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">category_PL_KwIkaEeynq4H4YH03kw</oslc:name>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:valueShape rdf:resource="https://elmwb.com:9443/qm/oslc_qm/contexts/_OIbcAIkaEeynq4H4YH03kw/shape/resource/com.ibm.rqm.planning.VersionedTestPlan#CategoryResource"/>
<oslc:range rdf:resource="http://jazz.net/ns/qm/rqm#CategoryResource"/>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMLYBokaEeynq4H4YH03kw#"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:allowedValue rdf:resource="https://elmwb.com:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/category/urn:com.ibm.rqm:category:_PMFRYIkaEeynq4H4YH03kw#"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#AnyResource"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#category_PL_KwIkaEeynq4H4YH03kw"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Defines an enumeration value associated with a test artifact.</dcterms:description>
</rdf:Description>
The title and description is defined in dcterms: title = “Category: Product” and description = “Defines an enumeration value associated with a test artifact.” This shape also includes an enumeration of the allowed values in the tags.
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:representation
The representation of the object resource must be present in the representation of the described resource.
http://open-services.net/ns/core#Inline
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:name
The local name of the defined property.
category_PL_KwIkaEeynq4H4YH03kw
oslc:valueShape
This will point to a resource shape for the value, as defined in the oslc:valueType
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc:category_PL_KwIkaEeynq4H4YH03kw/> in the body of our test plan creation factory post.
node a139 – validates requirements collection
Here’s the details of the node:
<rdf:Description rdf:nodeID="A139">
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-many"/>
<oslc:representation rdf:resource="http://open-services.net/ns/core#Reference"/>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Requirement Collection that is validated by the Test Plan. It is likely that the target resource will be an oslc_rm:RequirementCollection but that is not necessarily the case.</dcterms:description>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">validatesRequirementCollection</oslc:name>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:valueShape rdf:resource="http://open-services.net/ns/rm#RequirementCollection"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Validates Requirement Collection</dcterms:title>
<oslc:propertyDefinition rdf:resource="http://open-services.net/ns/qm#validatesRequirementCollection"/>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:range rdf:resource="http://open-services.net/ns/rm#RequirementCollection"/>
<oslc:valueType rdf:resource="http://open-services.net/ns/core#Resource"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Validates Requirements Collection” and description = “Requirement Collection that is validated by the Test Plan. It is likely that the target resource will be an oslc_rm:RequirementCollection but that is not necessarily the case.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
Given that this is optional, we will not provide any value in our simple POST body. We will include <oslc_rm:RequirementsCollection/> in the body of our test plan creation factory post.
node a140 – description
Here’s the details of the node:
<rdf:Description rdf:nodeID="A140">
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML <div> element.</dcterms:description>
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">description</oslc:name>
<oslc:propertyDefinition rdf:resource="http://purl.org/dc/terms/description"/>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Description</dcterms:title>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-one"/>
<oslc:valueType rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral"/>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
</rdf:Description>
The title and description is defined in dcterms: title = “Description” and description = “Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML <div> element.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:readOnly
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:name
The local name of the defined property.
description
oslc:propertyDefinition
The formal review records of the resource.
http://purl.org/dc/terms/description
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
We will include <dcterms:derscription>Test Plan created from API</dcterms:description> in the body of our test plan creation factory post.
node a141 – planning effort
Here’s the details of the node:
<rdf:Description rdf:nodeID="A141">
<oslc:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:hidden>
<dcterms:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The planning effort that the Test Plan defined in person hour.</dcterms:description>
<dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Planning Effort</dcterms:title>
<oslc:isMemberProperty rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:isMemberProperty>
<oslc:propertyDefinition rdf:resource="http://jazz.net/ns/qm/rqm#planningEffort"/>
<oslc:occurs rdf:resource="http://open-services.net/ns/core#Zero-or-one"/>
<rdf:type rdf:resource="http://open-services.net/ns/core#Property"/>
<oslc:valueType rdf:resource="http://www.w3.org/2001/XMLSchema#float"/>
<oslc:readOnly rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</oslc:readOnly>
<oslc:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">planningEffort</oslc:name>
</rdf:Description>
The title and description is defined in dcterms: title = “Planning Effort” and description = “The planning effort that the Test Plan defined in person hour.”
The rest of the values are <oslc:> values. The definition of each of these values is defined in the “rdf:data=“ tag. There are seven values in this nodes:
Tag
Definition
Value
oslc:hidden
Indicates the resource of property should not be displayed to users.
FALSE
oslc:isMemberProperty
If true then the described resource is a container and the defined property is used for container membership.
FALSE
oslc:propertyDefinition
The formal review records of the resource.
http://jazz.net/ns/qm/rqm#planningEffort
oslc:occurs
The number of times the defined property may occur. Values are defined in oslc:Cardinality.
If true then the defined property cannot be directly written by clients, but may be updated indirectly by servers.
FALSE
oslc:name
The local name of the defined property.
planningEffort
We will include <rqm_qm:planningEffort>42.0</rqm_qm:planningEffort> in the body of our test plan creation factory post.
Putting it all together
Now that we’ve gone thru the resource shape and defined the body context, we should be able to create a new Automation Test Adapter. While we only have one mandatory property, Title, we can now populate a full POST body with all the values we’ve identified above.
curl --location -g --request POST '{{qm#TestPlan-factory-URL}}?oauth_consumer_key={{consumerKey}}&oauth_token={{oauthToken}}&oauth_signature_method=HMAC-SHA1&oauth_timestamp={{oauthTimeStamp}}&oauth_nonce={{oauthNonce}}&oauth_signature={{oauthSignature}}' \
--header 'Accept: application/rdf+xml' \
--header 'Referer: https://elmwb.com:9443/rm' \
--header 'Configuration-Context: https://elmwb.com:9443/rm/oslc_qm/contexts/{{ConfigurationContext}}' \
--header 'Content-Type: application/xml' \
--data-raw '<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:oslc_qm="http://open-services.net/ns/qm#"
xmlns:oslc_rm="http://open-services.net/ns/rm#"
xmlns:rqm_qm="http://jazz.net/ns/qm/rqm#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:oslc="http://open-services.net/ns/core#"
xmlns:process="http://jazz.net/ns/process#"
xmlns:rqm_process="http://jazz.net/xmlns/prod/jazz/rqm/process/1.0/"
xmlns:calm="http://jazz.net/xmlns/prod/jazz/calm/1.0/"
>
<oslc_qm:TestPlan>
<dcterms:title>Test plan created from API</dcterms:title>
<dcterms:description>Here'\''s a really long description that was created by typing a bunch of words.</dcterms:description>
<oslc:formalReview/>
<oslc:hasChildPlan/>
<rqm_qm:catagory/>
<oslc:hasPriority/>
<foaf:contributor/>
<oslc:template/>
<oslc:relatedChangeRequest/>
<process:iteration/>
<oslc:testSchedule/>
<process:teamArea/>
<oslc:hasWorkflowState/>
<oslc:runsOnTestEnvironment/>
<oslc:usesTestCase/>
<oslc:keyDate/>
<oslc:testsDevelopmentPlan/>
<oslc:attachment/>
<rqm_qm:objectiveStatusGroup/>
<oslc:risk/>
<oslc:containsTestSuite/>
<rqm_qm:executionEffort>42.0</rqm_qm:executionEffort>
<oslc:category_PML_F4kaEeynq4H4YH03kw/>
<oslc:category_PMRep4kaEeynq4H4YH03kw/>
<oslc:category_PL_KwIkaEeynq4H4YH03kw/>
<oslc_rm:validatesRequirementCollection/>
<rqm_qm:planningEffort>42.0</rqm_qm:planningEffort>
</oslc_qm:TestPlan>
</rdf:RDF>'
We’ve been able to identify the name space based on the , i.e. if we look at a property definition of “http://jazz.net/ns/qm/rqm#planningEffort” we see that the beginning of it, “http://jazz.net/ns/qm/rqm” matches the xmlns our resource shape of xmlns:rqm_qm. We can now use that as our name space for the property in the above POST.
In future posts, we will start digging thru some of the optional properties, and what other information is provided within the resource shape.
Well, I thought I had the last major bug figured out, but it was still there. So back to the drawing board. This is a bit of an insidious problem since it causes unexpected changes to the data. In order to keep from corrupting my testers data, I have not released any of my interim tests, even when I think I have it right.
I then walked away from the problem for a while, and even posted a plaintiff cry on a few different iOS sites. The answers that came back where to simplify my SwiftUI View. Break it apart. I didn’t understand how this could fix the problem, so I refused to entertain that as a valid solution for a few hours
Imagine my surprise when I finally relented and created a new SwiftUI view just for the Delete, Edit and View button overlay. This had the effect of isolating the data to another view, and solved the problem. The app now will correctly allow for a user to edit an existing card, view the card in a nice full screen mode, or remove the card from the event list. Exactly the behavior I wanted.
At this point I believe I have a feature complete app. I do have plenty of ideas for additional features in the future, but after playing with this app in my spare time for four years, I think it’s time to finish the polishing and make it available on the app store.
One thing I really need to look at is how to best test the behavior of the app, both at the DB layer as well as the UX layer. Even though I am a single person shop, who only get’s to work on this out side of the day job and all other activities (i.e, maybe an hour or two here an there), I believe that investing into some kind of a test bed would help improve my productivity.