|
|
Webclient Requirements Specification Version 1.5
Review Status: version 1.3 formally reviewed
NOTE: This document specifies the ideal webclient, not the
current webclient or even a future webclient. That is, not
everything in here will be implemented, but nothing will be
implemented that isn't in here. In other words, the actual
implementation will be a proper subset of what is specified
here.
post feedback to netscape.public.mozilla.java with the subject webclient spec
Sections changed since the
previous version of the document are bracketed like this.
Table of Contents
- Introduction
- How the software fits into the larger system
- Overall description
- Software Project Constraints
- Detailed Problem Description
- Information Flow
- System Interface Description
- Functional Description
- Functional Partitioning
- webclient API
- Event System
- Behavioral Description
- System States
- Events and Actions
- Validation Criteria
- Performance Bounds
- Special Considerations
- Appendices
- Other Projects Similar to This One
- Differences from the Current Implementation
- People who have worked on this document
The webclient project aims to provide a browser neutral Java API
that enables Java applications (not applets) to access generic
web browsing capability. This capability includes, but is not
limited to: web content rendering, navigation, a history
mechanism, and progress notification. The actual capabilities
implemented depend on the underlying browser implementation.
Webclient does not deal with web authoring.
This document is the canonical source of requirements for the
software. If new feature requests or changes are granted, they
should first be included in the spec and then in the
implementation. This document should be put under change
control once the initial revision is approved.
Any Java program may use the Webclient API to access browser
functionality. Webclient will be accessible to an embedding
program (the custom app), in the following forms, and only the
following forms:
-
Programmatically, as a Jar file from which you can
directly access webclient classes.
-
As a Java Bean, that can be embedded in a program
using a bean enabled development tool.
There is a related project to webclient, tentatively called
"Webclient for the Star Office API", that deals with providing for
the StarOffice API what webclient provides for the Java
environment.
Webclient will be available in the following environments:
Operating Systems
Java environments
-
JDK 1.1.7 and JDK1.2.1 and greater from Sun Microsystems
-
Linux JDK PENDING(edburns): what dist and version?
-
Macintosh MRJ 2.1.4 from Apple
-
Mozilla Milestone 9
-
Internet Explorer 5
-
Hot Java Browser Bean
While not going into too much implementation specific detail, the
current plan calls for wrapping mozilla first, then wrapping
IE.
Why do we need webclient?
As mentioned in the introduction, the webclient project aims to
provide a browser neutral Java API that enables generic web
browsing capability. Currently, there are several projects that
provide generic web browsing capability in Java [1]. However, none of these projects
leverage the major browsers. The ability to wrap the major
browsers provides several benefits:
Webclient puts the burden of "keeping up with the
Joneses" where it belongs, on those who have the business need
and the resources to keep up with current standards and
rendering demands.
The flexible API allows one to provide an
implementation for application specific circumstances, for
example, small footprint devices; PENDING(edburns): add more
value adds for wrapping the major browsers.
Webclient gives developers who are building application GUIs
with Java world-class HTML rendering capabilities. By
world-class we mean: super-fast, fully-functional, and
fully-standard-supporting, well supported, widely used, well
tested, etc.
Another reason for webclient's existence is to showcase the power
of embedding Mozilla (and other browsers). The success of the
mozilla project is important to Sun (and to many other companies
and individuals). Making Mozilla available to as wide an audience
as possible is important.
Goals
Multi-browser implementation
Webclient will wrap the above mentioned
browsers.
-
Scalability
The full webclient API will expose the union of the
capabilities of all the underlying browsers, however, the api
will behave gracefully if the underlying browser
implementation doesn't support all of the webclient API
features. For example, suppose there is a webclient
implementation for a small footprint browser, let's say the
beduin browser for pJava. This browser may not include the
capability for "find in document", but the "find in document"
API exists in webclient. This will not pose a problem: either
the method(s) for "find in document" will do nothing, or there
will be a subset of the full webclient API that can be
implemented in the case of a reduced capability browser.
Another facet of scalability is partitioning. For example.
Parts of the webclient API may use Java2 API's such as the
Swing UI toolkit, but webclient will still be deployable in
non-Java2 environments.
-
Low overhead
Webclient is a thin layer of software on top of a browser and,
as such, will not cause major memory consumption outside of
that already caused by the browser and the VM in which
webclient is running.
-
Accessibility
Webclient will have APIs to make the entire user experience
accessibly to persons with disabilities. PENDING(edburns):
need to investigate.
Sun aims to complete principal development for the webclient
project by the end of calendar 1999. After that point, Sun may
continue to be the steward of webclient development at
mozilla.org, but may also pass the mantle on to some other entity.
Webclient is designed for Java. Providing a non-Java
implementation is a deviation from this specification.
Information passes between the custom app and webclient via events and method invocations. Generally,
events carry information from webclient to the custom app, and
method invocations carry information from the custom app to
webclient. Stated another way, events are generated by webclient,
but the implementation of what to do with an event is provided by
the custom app. Method invocations come from the custom app, but
are implemented by webclient. The method invocations are listed
in the Interface Description section.
See the section on events for detailed
information about the events generated by webclient.
To the custom app developer, webclient's graphical user interface
is a java.awt.Canvas subclass,
BrowserControlCanvas, that can be inserted in to the
custom app's display hierarchy as the developer sees fit.
Webclient pops up no dialogs. Instead, the API will notify the
application of events (see listener interfaces below). The custom
app developer must provide all GUI elements. A
BrowserControlCanvas instance is a browser window.
It may display frames within itself when a page containing frames
is visited. It is perfectly permissible to have multiple
BrowserControlCanvas instances in a custom app, but
it is the custom app's business to manage the collection of
BrowserControlCanvas instances. For Each
BrowserControlCanvas instance there will be a way to
access the below methods. Invoking any of the below methods will
affect only the BrowserControlCanvas instance from
which the methods were accessed. See the section on functional partitioning for more
information.
The programmatic interface to webclient is a collection of Java
interfaces and one Java class, with the interfaces organized by
functionality. All of the following classes and interfaces are
implemented by webclient and are callable from the custom app.
See also the EventListener interfaces, which
are implemented by the custom app and are called by
webclient.
|
class webclient.BrowserControlFactory |
webclient.BrowserControl |
newBrowserControl()
| Create a new BrowserControl
instance
|
|
interface webclient.Bookmarks PENDING(edburns): define the type for a bookmark entry |
void |
addBookmark(java.lang.Object mayBeNullParent, webclient.BookmarkEntry bookmark)
|
javax.swing.tree.TreeModel |
getBookmarks()
|
void |
removeBookmark(webclient.BookmarkEntry bookmark)
|
|
interface webclient.BrowserControlCanvas |
void |
setBounds(int x, int y, int w, int h)
|
void |
setBounds(Rectangle rect)
|
java.awt.Rectangle |
getBoundsRelativeToWindow()
|
java.awt.Point |
getEventCoordsLocalToWindow(MouseEvent evt)
|
int |
getWindow(java.awt.DrawingSurfaceInfo dsi)
|
get the native window handle
as an int.
|
java.awt.Rectangle |
getWindowBounds()
|
|
interface webclient.CurrentPage |
void |
copyCurrentSelectionToSystemClipboard()
|
void |
findInPage(java.lang.String stringToFind, boolean forward, boolean matchCase)
|
void |
findNextInPage(boolean forward)
|
java.lang.String |
getCurrentURL()
|
org.w3c.dom.Document |
getDOM()
|
Gain access the DOM for the currently loaded document for this BrowserControl instance.
|
webclient.PageInfo |
getPageInfo()
|
java.lang.String |
getSource()
|
byte [] |
getSourceBytes()
|
void |
resetFind()
|
void |
selectAll()
|
| webclient.EventRegistration
|
| void |
addContainerListener(webclient.ContainerListener
containerListener) |
| void |
removeContainerListener(webclient.ContainerListener
containerListener) |
| void |
addDocumentListener(webclient.DocumentListener
documentListener) |
| void |
removeDocumentListener(webclient.DocumentListener
documentListener) |
| void |
addDocumentLoadListener(webclient.DocumentLoadListener
listener) |
| void |
removeDocumentLoadListener(webclient.DocumentLoadListener
listener) |
| void |
addDOMListener(webclient.DOMListener
containerListener) |
| void |
removeDOMListener(webclient.DOMListener
containerListener) |
| void |
addJavaScriptListener(webclient.JavaScriptListener
containerListener) |
| void |
removeJavaScriptListener(webclient.JavaScriptListener
containerListener) |
| void |
addWindowListener(java.awt.event.WindowListener
windowListener) |
| void |
removeWindowListener(java.awt.event.WindowListener
windowListener) |
| webclient.ExtendedEventRegistration
|
| void |
addHyperLinkEventListener(javax.swing.event.HyperLinkEvent
HyperLinkEventListener) |
| void |
removeHyperLinkEventListener(javax.swing.event.HyperLinkEventListener) |
|
interface webclient.History |
boolean |
back()
|
boolean |
canBack()
|
webclient.HistoryEntry [] |
getBackList()
|
Get the copied list of previously visited pages from the history.
|
void |
clearHistory()
|
boolean |
forward()
|
boolean |
canForward()
|
webclient.HistoryEntry [] |
getForwardList()
|
Get the copied list of previously visited pages from the history.
|
webclient.HistoryEntry [] |
getHistory()
|
Return a copy of the entire history
|
webclient.HistoryEntry |
getHistoryEntry(int historyIndex)
|
int |
getHistoryIndex()
|
returns the index of the currently viewed page in the history.
|
boolean |
setHistoryIndex(int historyIndex)
|
cause the browser to navigate
to the HistoryEntry at index historyIndex.
|
int |
getHistoryLength()
|
java.lang.String |
getURL(int historyIndex)
|
A convenience method to return
the url of a HistoryEntry at a given index.
|
|
interface webclient.Navigation |
void |
loadURL(java.lang.String urlString)
|
void |
refresh()
|
void |
stop()
|
|
interface webclient.cache.NetDataCacheManager See nsINetDataCacheManager.idl |
| static int |
BYPASS_MEMORE_CACHE_MASK |
| static int |
BYPASS_PERSISTENT_CACHE_MASK |
boolean |
containsDataForURI(java.lang.String uri, java.lang.String secondaryKey, int flags)
|
webclient.cache.CachedNetData |
getCachedNetData(java.lang.String uri, java.lang.String secondaryKey, int flags)
|
webclient.cache.NetDataDiskCache |
getDiskCache()
|
int |
getHitRatio()
|
webclient.cache.NetDataCache |
getMemoryCache()
|
int |
getNumEntries()
|
java.util.Enumeration
|
newCacheEntryEnumerator()
|
void |
removeAll()
|
|
interface webclient.cache.CachedNetData extends webclient.cache.NetDataCacheRecord See nsICachedNetData.idl |
void
|
commit()
|
java.util.Date |
getExpirationTime()
|
java.util.Date |
getLastRetrievalTime()
|
int |
getNumRetrievals()
|
java.lang.String |
getSecondaryKey()
|
boolean |
isUpdateInProgress()
|
|
interface webclient.cache.NetDataCacheRecord See nsINetDataCacheRecord.idl |
void |
delete()
|
int |
getContentLength()
|
java.lang.String |
getKey()
|
java.lang.String |
getMetaData()
|
java.io.Reader
|
getReader()
|
int |
getRecordID()
|
java.io.Writer
|
getWriter()
|
|
interface webclient.cache.NetDataCache See nsINetDataCache.idl |
boolean |
containsDataForKey(java.lang.String key)
|
void
|
setCacheCapacity(int kiloByteSize)
|
int
|
getCacheCapacity()
|
webclient.cache.NetDataCacheRecord |
getCachedNetData(java.lang.String key)
|
webclient.cache.NetDataCacheRecord |
getCachedNetDataByID(int RecordID)
|
java.lang.String |
getDescription()
|
int |
getMaxEntries()
|
webclient.cache.NetDataCache
|
getNextCache()
|
int |
getNumEntries()
|
int
|
getStorageInUse()
|
boolean |
isEnabled()
|
boolean |
isReadOnly()
|
java.util.Enumeration |
newCacheEntryEnumerator()
|
void
|
removeAll()
|
|
interface webclient.cache.NetDiskDataCache extends webclient.cache.NetDataCache See nsINetDataDiskCache.idl |
java.lang.String |
getCacheLocation()
|
void |
setCacheLocation(java.lang.String absoluteFileName)
|
|
interface webclient.Preferences |
java.lang.String |
exportBookmarks()
|
java.lang.String |
exportCookies()
|
void |
setCharacterSet(java.lang.Character.Subset charSet)
|
java.lang.Character.Subset |
getCharacterSet()
|
void |
setDefaultOutgoingHttpHeader(java.lang.String headerName, java.lang.String headerValue )
|
java.lang.String [] |
getDefaultOutgoingHttpHeaders()
|
void |
clearDefaultOutgoingHttpHeader(java.lang.String headerName)
|
void |
setFtpProxyHost(java.lang.String hostname)
|
java.lang.String |
getFtpProxyHost()
|
void |
setFtpProxyPort(int newPort)
|
int |
getFtpProxyPort()
|
void |
clearFtpProxy()
|
void |
setGlobalProxyHost(java.lang.String hostname)
|
java.lang.String |
getGlobalProxyHost()
|
void |
setGlobalProxyPort(int newPort)
|
int |
getGlobalProxyPort()
|
void |
clearGlobalProxy()
|
void |
setGopherProxyHost(java.lang.String hostname)
|
java.lang.String |
getGopherProxyHost()
|
void |
setGopherProxyPort(int newPort)
|
int |
getGopherProxyPort()
|
void |
clearGopherProxy()
|
void |
setHistoryExpiration(int days)
|
int |
getHistoryExpiration()
|
void |
setHomePage(java.lang.String)
|
java.lang.String |
getHomePage()
|
void |
setHttpProxyHost(java.lang.String hostname)
|
java.lang.String |
getHttpProxyHost()
|
void |
setHttpProxyPort(int newPort)
|
int |
getHttpProxyPort()
|
void |
clearHttpProxy()
|
void |
setIgnoreColorsOnWebPages(boolean newValue)
|
Show everything on the page in
black and white.
|
void |
setIgnoreFontSizesOnWebPages(boolean newValue)
|
Use default accessible font
sizes on all pages, regardless of what the author intended.
|
void |
setIgnoreFontStylesOnWebPages(boolean newValue)
|
Use default accessible font
styles on all pages, regardless of what the author intended.
|
void |
setUserStyleSheet(java.lang.String cssFileName)
|
Format all pages with the
given css StyleSheet.
|
void |
importBookmarks(java.lang.String hotlistFileString)
|
void |
importCookies(java.lang.String hotlistFileString)
|
void |
setNoProxyList(java.lang.String commaSepList)
|
java.lang.String |
getNoProxyList()
|
void |
setPlainTextFont(java.awt.Font font)
|
java.awt.Font |
getPlainTextFont()
|
void |
setSecureProxyHost(java.lang.String hostname)
|
java.lang.String |
getSecureProxyHost()
|
void |
setSecureProxyPort(int newPort)
|
int |
getSecureProxyPort()
|
void |
clearSecureProxy()
|
webclient.Security |
getSecurity() PENDING(edburns)
|
void |
setSocksServerHost(java.lang.String hostname)
|
java.lang.String |
getSocksServerHost()
|
void |
setSocksServerPort(int newPort)
|
int |
getSocksServerPort()
|
void |
clearSocksServer()
|
void |
setWebPageFont(java.awt.Font font)
|
| interface webclient.PrintPENDING: Can
someone who knows the Java2 Printing API rework this interface to
conform to JDK? |
void |
print()
|
void |
setPaperSize(java.lang.String tbd)
|
void |
setPaperSource(java.lang.String tbd)
|
void |
setPageHeader(java.lang.String headerString)
|
void |
setPageFooter(java.lang.String footerString)
|
void |
setOrientation(java.lang.String orientation)
|
void |
setInchMargins(int left, int right, int top, int bottom)
|
|
interface webclient.WindowControl |
int |
getNativeWebShell()
|
returns the native pointer to
the native browser as an int.
|
void |
moveWindowTo(int x,
int y)
|
void |
removeFocus()
|
void |
repaint(boolean forceRepaint)
|
void |
setVisible(boolean newState)
|
void |
setFocus()
|
From the custom app developer's perspective, there are two parts
to the system: the webclient APIs and the event system.
There is one entry point to the webclient APIs,
webclient.BrowserControlFactory. This class is used
to create webclient.BrowserControl instances, each of
which can vend out a webclient.BrowserControlCanvas
instance, as well as vending implementations of the interfaces
listed in the System Interfaces section.
The custom app developer obtains a reference to a
webclient.EventRegistration instance and uses it to
register/deregister for various events generated by webclient.
This section examines the operation of the software as a
consequence of external and internal events. It also covers
webclient Thread issues.
Startup State
Webclient's startup state involves two stages: 1. one-time
initalization, and
2. per-webclient.BrowserControlCanvas instance event
registration. All one-time initialization automatically takes
place when the first webclient.BrowserControl
instance is placed in the display hierarchy. Subsequent
webclient.BrowserControlCanvas instances will not
incur the cost of this one-time initialization. Event
registration is simply the act of allowing the custom app to
receive events from a webclient.BrowserControl
instance. Webclient is guaranteed not to generate any events
until the custom app starts calling
webclient.BrowserControl methods. Thus it is
permissible to do the startup state in a separate Java thread.
Idle State
Webclient's idle state is when it is not fetching content. Events
can still be generated when webclient is in the idle state. For
example, mouse-over, right-mouse button, and javascript events can
be generated during the idle state.
Fetching State
Webclient's fetching state is when the underlying browser is
fetching web content. Progress, document load, authentication,
and cookie events can be generated during this state. Fetching
state is entered when any of the webclient.Navigation
methods are invoked (other than stop()), when the
currently loaded page programmatically causes another page to be
loaded, or when a javascript event causes something to be loaded.
Fetching state is exited when the loading is complete, or when the
stop() method is invoked.
For the more than minimal browser, it is necessary to get event
notifications from the native browser. Hence, webclient will surface
event listener APIs. The custom app developer would implement these
APIs in the app, and register their implementations with webclient so
that the appropriate callback methods in the custom app would be
invoked. Webclient uses the java 1.1 event model, where event objects
are generated and all registered listeners receive the event, which
they can interrogate to determine the nature of the event.
All webclient event listeners inherit from
webclient.WebclientEventListener.
| webclient.WebclientEventListener | | void |
eventDispatched(WebclientEvent event) | invoked when an event is generated by webclient. |
This table lists the event listener types, all of which inherit from webclient.WebclientEventListener:
| interface webclient.DocumentLoadListener |
Events relating to the loading of documents in this window |
| interface webclient.ContainerListener |
Events relating to the the container of this BrowserControlCanvas |
| interface webclient.DocumentListener |
Events happening in the currently loaded document |
| interface webclient.JavaScriptListener |
Events relating to the loading of documents in this window. |
| interface webclient.DOMListener |
Events relating to the loading of documents in this window. |
Listeners must be attached to each BrowserControlCanvas
instance. Multiple listeners can be attached to each
BrowserControlCanvas.
The following is a listing of event classes for each of the above
event listener types, each of which inherit from
java.util.EventObject:
| webclient.DocumentLoadEvent |
| static int |
START_DOCUMENT_LOAD_EVENT_MASK |
notification before any connection established | | static int |
END_DOCUMENT_LOAD_EVENT_MASK |
notification after document loaded | | static int |
START_URL_LOAD_EVENT_MASK |
notification after DNS resolution and connection to server
established | | static int |
END_URL_LOAD_EVENT_MASK |
notification that nsIURI finished loading | | static int |
PROGRESS_URL_LOAD_EVENT_MASK |
notification on progress of URL load | | static int |
STATUS_URL_LOAD_EVENT_MASK |
notification that status text available for URL being
loaded | | static int |
UNKNOWN_CONTENT_EVENT_MASK |
notification when content of unknown type occurs | | static int |
FETCH_INTERRUPT_EVENT_MASK | Called
when a fetch is interrupted, as when the fetch requires
authentication or cookies |
| webclient.ContainerEvent
|
| static int |
FOCUS_AVAILABLE_EVENT_MASK |
notification that the container will give up
focus |
| webclient.DocumentEvent
|
| static int |
TITLE_CHANGE_EVENT_MASK |
notification that the container will give up focus |
| static int |
STATUS_CHANGE_EVENT_MASK |
notification that the mouse has passed over the link, gives the
URL information of that link |
webclient.JavaScriptEvent
See http://developer.netscape.com/docs/manuals/js/client/jsref/handlers.htm
|
| static int |
ABORT_EVENT_MASK |
| static int |
BLUR_EVENT_MASK |
| static int |
CHANGE_EVENT_MASK |
| static int |
CLICK_EVENT_MASK |
| static int |
DOUBLE_CLICK_EVENT_MASK |
| static int |
DRAG_DROP_EVENT_MASK |
| static int |
ERROR_EVENT_MASK |
| Focus events are
hanled with the java.awt.FocusListener interface and the associated
FocusEvent class. |
|
| Key events are
hanled with the java.awt.KeyListener interface and the associated
KeyEvent class. |
|
| Mouse events are
hanled with the java.awt.Mouse*Listener interface and associated
events. |
|
| static int |
MOVE_EVENT_MASK |
| static int |
RESET_EVENT_MASK |
| static int |
RESIZE_EVENT_MASK |
| static int |
SELECT_EVENT_MASK |
| static int |
SUBMIT_EVENT_MASK |
| static int |
UNLOAD_EVENT_MASK |
webclient.DOMEvent
See http://lxr.mozilla.org/mozilla/source/layout/events/src/nsDOMEvent.cpp
|
| Mouse events are
hanled with the java.awt.Mouse*Listener interface and associated
events. |
|
| Key events are
hanled with the java.awt.KeyListener interface and the associated
KeyEvent class. |
|
| static int |
FOCUS_CONTENT_EVENT_MASK |
| static int |
BLUR_CONTENT_EVENT_MASK |
| static int |
PAGE_LOAD_EVENT_MASK |
| static int |
IMAGE_LOAD_EVENT_MASK |
| static int |
PAGE_UNLOAD_EVENT_MASK |
| static int |
IMAGE_ABORT_EVENT_MASK |
| static int |
IMAGE_ERROR_EVENT_MASK |
| static int |
FORM_SUBMIT_EVENT_MASK |
| static int |
FORM_RESET_EVENT_MASK |
| static int |
FORM_CHANGE_EVENT_MASK |
| static int |
FORM_SELECTED_EVENT_MASK |
| static int |
PAINT_EVENT_MASK |
| static int |
TEXT_EVENT_EVENT_MASK |
| static int |
MENU_CREATE_EVENT_MASK |
| static int |
MENU_DESTROY_EVENT_MASK |
| static int |
MENU_ACTION_EVENT_MASK |
| static int |
DRAGDROP_ENTER_EVENT_MASK |
| static int |
DRAGDROP_OVER_EVENT_MASK |
| static int |
DRAGDROP_EXIT_EVENT_MASK |
| static int |
DRAGDROP_DROP_EVENT_MASK |
| static int |
DRAGDROP_GESTURE_EVENT_MASK |
| static int |
BUBBLING_PHASE |
| static int |
CAPTURING_PHASE |
| static int |
AT_TARGET |
| DOMNode |
GetTarget() |
| DOMNode |
GetCurrentNode() |
| long |
GetEventPhase() |
| void |
PreventBubble() |
| void |
PreventCapture() |
| void |
PreventDefault() |
Other areas that need to be addressed are the java console, and
security.
This section has not yet been written. The template text is
here as a placeholder.
This section describes the attributes of a successful
implementation. This section should be useful for qualifying an
implementation to ensure that it conforms to the spec.
This section rigorously defines the desired performance attributes
of the software. For example: maximum runtime memory use, maximum
installed disk space use, startup time bounds, responsiveness
requirements, etc.
This section describes the kinds of test cases that can be used to
verify the correctness of an implementation, particularly with
respect to the above performance bounds.
This section is used to describe any concerns specific to this
software. Delete this section if there are no special
considerations.
The following projects contain some similarities to webclient:
This spec differs substantially from the current webclient
implementation, as of 17 September 1999. This section lists some
of the differences.
System Entry Point
The current system requires the custom app developer to
use a webclient.BrowserControlCanvasFactory
static method to create
webclient.BrowserControlCanvas instances, each
of which can be queried for their associated
BrowserControl instance, which is then used to
navigate, etc.
The spec requires the custom app developer to use a
webclient.BrowserControlFactory static method
to create webclient.BrowserControl instances,
each of which can be queried for their associated
BrowserControlCanvas instance, in addition to
being queriable for other
webclient.BrowserControl interfaces.
Feature Paucity
The current implementation doesn't provide any events,
Bookmarks, Preferences, CurrentPage, Accessibility
features. It provides limited History and WindowControl
features.
Here is a checklist for verifying that your requirements specification
is complete:
The requirements specification should:
describe the flow and content of information
elaborate all software functions
describe all events that affect the system
uncover design constraints
show evidence and conclusions from research on prior projects that
addressed the same problem as is being addressed in the specification.
Specifically, the problems with each prior project should be listed.
specify performance constraints
serve as the basis for a Preliminary User's Manual.
describe the design principles that will be adhered to, for example,
design for maintainability
describe the benefits of a successful implementation
describe the environment in which the software is to run.
be a cognitive model, that is, it must be described in the user domain,
with user terms.
separate functionality from implementation
be useful for validating the correctness of an implementation
be tolerent of incompleteness and be augmentable
be modular and loosely coupled
[ latest version ]
Ed Burns
Last modified: Fri Oct 29 14:24:16 Pacific Daylight Time 1999
|