Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
* Concrete Syntax for a UML Action Language - Action Language for Foundational UML (Alf)
** http://www.omg.org/spec/ALF/1.0/Beta1/PDF/
* Alf Reference Implementation
** http://lib.modeldriven.org/MDLibrary/trunk/Applications/Alf-Reference-Implementation/
/***
|''Name:''|BibTeXPlugin|
|''Description:''|Very incomplete BibTeX implementation to work with bibliographic references|
|''Author:''|Paulo Soares|
|''Version:''|1.4|
|''Date:''|2009-11-20|
|''Source:''|http://www.math.ist.utl.pt/~psoares/addons.html|
|''Overrides''|Story.prototype.refreshTiddler|
|''Documentation:''|[[BibTeXPlugin Documentation|BibTeXPluginDoc]]|
|''License:''|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.5.0|
***/
//{{{
if(!version.extensions.BibTeXPlugin) { //# ensure that the plugin is only installed once
version.extensions.BibTeXPlugin = {installed: true};
(function($) {
config.macros.cite = {
noReference: "(??)",
refreshTiddler: Story.prototype.refreshTiddler
};
config.macros.cite.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var pos, cmb = config.macros.bibliography;
if(params.length==0) return;
var entry = params[0];
var args = paramString.parseParams(null,null,false);
var title = getParam(args,"bibliography",null);
if(title) {
this.biblioTiddler = title;
} else {title = this.biblioTiddler;}
title = getParam(args,"thisBibliography",title);
var format = getParam(args,"format",null);
if(format) {
this.format = format;
} else {format = this.format;}
format = getParam(args,"thisFormat",format);
var argsArray = paramString.readMacroParams();
var showAll = ($.inArray('showAll',argsArray) > -1);
if(title && store.tiddlerExists(title)) var bib = cmb.extractEntry(title, entry);
if(bib.content) {
var entries = this.entries;
if($.inArray(entry, entries)==-1) this.entries.push(entry);
entries = this.entries;
pos = $.inArray(entry, entries)+1;
var author = cmb.processNames(bib.content.extract("author"), showAll);
var year = bib.content.extract("year");
var citation = format.replace("author", author);
citation = citation.replace("year", year);
citation = citation.replace("number", pos);
wikify(citation, place);
} else {
wikify(this.noReference, place);
}
}
Story.prototype.refreshTiddler = function(title,template,force){
config.macros.cite.biblioTiddler = null;
config.macros.cite.format = "author (year)";
config.macros.cite.entries = [];
var tiddler = config.macros.cite.refreshTiddler.apply(this,arguments);
return tiddler;
}
config.macros.bibliography = {
article: {fields: ["author", "year", "title", "journal", "volume", "pages"], format: "author (year). title. //journal// ''volume'', pages."},
book: {fields: ["author", "year", "title", "publisher"], format: "author (year). //title//. publisher."},
inproceedings: {fields: ["author", "year", "title", "editor", "booktitle", "pages", "publisher"], format: "author (year). title. In editor //booktitle//, pages. publisher."},
incollection: {fields: ["author", "year", "title", "editor", "booktitle", "pages", "publisher"], format: "author (year). title. In editor //booktitle//, pages. publisher."},
techreport: {fields: ["author", "year", "title", "institution"], format: "author (year). title. Technical report, institution."},
manual: {fields: ["author", "year", "title", "organization"], format: "author (year). //title//. organization."},
unpublished: {fields: ["author", "year", "title"], format: "author (year). //title//. Unpublished."}
};
config.macros.bibliography.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var cmc = config.macros.cite;
var title = (cmc.biblioTiddler) ? cmc.biblioTiddler : params[0];
if(!title || !store.tiddlerExists(title)) return;
var argsArray = paramString.readMacroParams();
var i, entryText;
var entries = [];
if($.inArray('showAll',argsArray) > -1) {
entryText = this.extractAllEntries(title);
for(i=0; i<entryText.length; i++) {
entries[entries.length] = this.processEntry(entryText[i], i);
}
} else {
for(i=0; i<cmc.entries.length; i++){
entryText = this.extractEntry(title, cmc.entries[i]);
if(entryText) {
entries[entries.length] = this.processEntry(entryText, i);
}
}
}
entries.sort();
wikify(entries[0] , place);
for (i=1; i < entries.length; i++) {
wikify("\n\n" + entries[i] , place);
}
return true;
}
config.macros.bibliography.processNames = function(names, showAll) {
var i, authors = names.split(" and ");
var entry = authors[0];
var numAuthors = authors.length;
var fullEntry = entry;
if (numAuthors==2) {
entry += " and " + authors[1];
fullEntry = entry;
}
if (numAuthors>2) {
fullEntry = entry;
for (i=1; i < numAuthors; i++) {
if (i==numAuthors-1) {fullEntry += " and "} else {fullEntry += ", "};
fullEntry += authors[i];
}
if(showAll) {entry = fullEntry;} else {entry += " et al.";}
}
return entry;
}
config.macros.bibliography.processEntry = function(entry, pos) {
var field, text=entry.content;
var fields={};
fields.number = pos+1;
var type = this[entry.type];
var output = type.format;
for(var i=0; i<type.fields.length; i++){
field = type.fields[i];
switch(field){
case "author":
fields.author = this.processNames(text.extract("author"), true);
break;
case "title":
var url = text.extract("url");
fields.title = text.extract("title");
fields.title = (url=='') ? fields.title : "[[" + fields.title + "|" + url + "]]";
break;
case "editor":
var editor = text.extract("editor");
fields.editor = (editor=='') ? editor : this.processNames(editor,true) + " (Eds.), ";
break;
default:
fields[field] = text.extract(field);
}
output = output.replace(field, fields[field]);
}
return output;
}
config.macros.bibliography.extractEntry = function(title,entry) {
var bib = {type: null, content: null};
var text = store.getTiddlerText(title);
var re = new RegExp('\\s*@(\\w+?)\\{\\s*' + entry + '\\s*,\\s*(.[^@]+)\\}','mi');
var field = text.match(re);
if(field) {
bib.type = field[1].toLowerCase();
bib.content = field[2];
}
return bib;
}
config.macros.bibliography.extractAllEntries = function(title) {
var bib, field, entries = [];
var text = store.getTiddlerText(title);
var bibs = text.match(/\s*@(\w+?)\{\s*(.[^@]+)\}/mgi);
for(var i=0; i<bibs.length; i++){
field=bibs[i].match(/\s*@(\w+?)\{\s*(.[^@]+)\}/mi);
bib = {type: null, content: null};
if(field) {
bib.type = field[1].toLowerCase();
bib.content = field[2];
if(bib.type!='string' && bib.type!='preamble' && bib.type!='comment') entries.push(bib);
}
}
return entries;
}
config.macros.bibliography.extractField = function(field) {
var text = "";
var re = new RegExp('\\s*'+field+'\\s*=\\s*[\\{|"]\\s*(.+?)\\s*[\\}|"],','mi');
var fieldText = this.match(re);
if(fieldText){
text = fieldText[1].replace(/\{|\}/g,'');
text = text.replace(/-+/g,"—");
}
return text;
}
String.prototype.extract = config.macros.bibliography.extractField;
config.shadowTiddlers.BibTeXPluginDoc="The documentation is available [[here.|http://www.math.ist.utl.pt/~psoares/addons.html#BibTeXPluginDoc]]";
})(jQuery)
}
//}}}
!Description
Very incomplete (and personal) ~BibTeX implementation to work with bibliographic references.
!Usage
First of all, you need to dump your ~BibTeX entries in a tiddler, lets say [[Bibliography]]. The first macro that this plugin provides is {{{cite}}}. As the name suggests it is used to cite a reference such as {{{<<cite Nea:03>>}}} where {{{Nea:03}}} is a ~BibTeX key for a reference. By default it produces this: <<cite Nea:03 bibliography:Bibliography>>.
However, as this was the first citation in this tiddler you must include the name of the tiddler that contains the ~BibTeX entries like this {{{<<cite Nea:03 bibliography:Bibliography>>}}}.
The {{{cite}}} macro produces a full reference if there are at most two authors, otherwise it is abbreviated like this: <<cite Coda:97>>. If you want to force a full reference then you can use the {{{showAll}}} parameter as in {{{<<cite Coda:97 showAll>>}}} which produces this: <<cite Coda:97 showAll>>.
You can also change the way references are displayed with the {{{format}}} parameter. A string can be passed to this parameter where {{{number}}} represents the order of the citation {{{author}}} stands for the authors and {{{year}}} represents the year of publication. So, for example, including {{{format:"([number] author, year)"}}} in a citation would produce citations formatted as <<cite Nea:03 format:"([number] author, year)">>. The format string can even include Tiddlywiki notation such as {{{format:"@@author@@, ''year''"}}} leading to <<cite Nea:03 format:"@@author@@, ''year''">>.
The {{{bibliography}}} and {{{format}}} parameters affect the reference in which they are used and all the following ones. If you need to restrict the scope to a single reference you can use the {{{thisBibliography}}} and {{{thisFormat}}} variants.
The production of a list of cited references is done with the {{{bibliography}}} macro. If you want to make a list of all your ~BibTeX entries then use {{{<<bibliography Bibliography showAll>>}}}.
<<bibliography>>
[Ambler04] Ambler, S.W. The Object Primer: Agile Model-Driven Development with UML 2.0. Cambridge University Press, 2004.
[Fowler99] Fowler, M. Analysis Patterns – Reusable Object Models. Addison-Wesley, 1997.
[Evans03] Evans, E. Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison-Wesley, 2003.
[Konig07] Konig, D. Groovy in Action. Manning, 2007.
[Rocher06] Rocher, G.K. The Definitive Guide to Grails. Apress, 2006.
[OMG03] OMG. MDA Guide Version 1.0.1. Object Management Group, 2003. http://www.omg.org/docs/omg/03-06-01.pdf
[OMG06] OMG. Business Process Modeling Notation Specification, V1.0. Object Management Group, 2006. http://www.bpmn.org/
[WPI06] Workflow Patterns Initiative. Control-Flow, Data, Resource, and Exception Handling Patterns. Workflow Patterns Home Page, 2006. http://www.workflowpatterns.com/
# Node - http://nodejs.org/
#* Install nodejs
#* Install nodeclips http://www.nodeclipse.org/
#* Hello world: console, web-server
#* ~JavaScript developer guide - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
# Angular - http://angularjs.org/
#* Install bower via npm - http://bower.io/
#* Install angular via bower
#* Hello world
#* Todo
# Angular seed - https://github.com/angular/angular-seed
#* Module pattern - http://addyosmani.com/resources/essentialjsdesignpatterns/book/
!! BPMN
* [[BPMN2 Specification|http://www.omg.org/cgi-bin/doc?dtc/10-06-04.pdf]]
* [[BPMN2 By Example|http://www.omg.org/cgi-bin/doc?dtc/10-06-02.pdf]]
!! jBPM
* [[jBPM5 Implementation|http://www.jboss.org/jbpm]]
!! Tutorials
* Stephen A. White. [[Introduction to BPMN|http://www.bpmn.org/Documents/Introduction_to_BPMN.pdf]]
* Stephen A. White. [[Process Modeling Notations and Workflow Patterns|http://www.bpmn.org/Documents/Notations_and_Workflow_Patterns.pdf]]
* Business Motivation Model (BMM), OMG, 2008. http://www.omg.org/spec/BMM/1.0/PDF
** Section 8.1, The End Concepts
** Section 8.2, The Means Concepts
* Birol Berkem. From BMM to SOA, in //Journal of Object Technology//, vol. 7, no. 8, 2008, pp. 57-70. http://www.jot.fm/issues/issue_2008_11/column6/
* Jim Amsden. Capturing requirements with Business Motivation Model, IBM Rational ~RequisitePro, and IBM Rational Software Modeler. //IBM developerWorks//, 2008. http://www.ibm.com/developerworks/rational/library/08/0401_amsden/
Como se pode ver em <<cite AgaGel:03 bibliography:Bibliography>> o exemplo não é muito feliz <<cite CasLAvRob:01>> é uma referência obrigatória <<cite CheShaIbr:00>>, <<cite Coda:97 showAll>>, <<cite Coda:97>>, <<cite Gew:92>>, <<cite GelMen:96>>, <<cite Ste:03>>
!References
<<bibliography>>
/*{{{*/
#slideHeader {
color: #cff;
padding: 0.25em;
background-image: url('figuras/logo.png');
background-repeat: no-repeat;
background-position: right;
}
#slideFooter {
color: #aaa
}
body {
background-image: url('figuras/1.jpg');
color: #000;
}
.tiddler {
background: transparent;
padding: 1em 1em 0.5em 1em;
}
#controlBar .button {
background: transparent;
color: #aaa;
border: none
}
#controlBar .button:hover {
background: #cff;
color: #000
}
#slideClock {
background: transparent;
color: #aaa;
margin: 0 0.5em 0 0.5em;
padding: 0 0.25em 0 0.25em;
}
/* navigator always visible*/
.slideFooterOff #navigator{
visibility: visible;
}
.slideFooterOff #buttonBar{
visibility: hidden;
}
/*}}}*/
1. Model-driven software process
1.1. Model-driven architecture (MDA)
1.2. Agile model-driven development (AMDD)
1.3. Model transformation (Groovy MDA, AndroMDA, Eclipse GMT)
2. Using SysML in system analysis
2.1. Requirement diagrams
2.2. Block diagrams
3. Using SysML to model system behavior
3.1. Requirement diagrams
3.2. Activity diagrams
3.3. State diagrams
4. Using SysML to model system structure
4.1. Block diagrams
4.2. Internal block diagrams
4.3. Package diagrams
5. Using SysML to model business rules
5.1. Types of requirements; FURPS model
5.2. Additional requirements; business rules
5.3. SysML: Parameter diagrams
6. Business process modeling
6.1. Standard process notations (Business Process Modeling Notations, BPMN)
6.2. XPDL workflow language
6.3. Mapping between BPMN, XPDL, and UML activities
7. Workflow patterns
7.1. Patterns for controlling execution
7.2. Patterns for data flows
7.3. Patterns for resource flows
8. Basic analysis patterns
8.1. Organizational structure
8.2. Observation and measurement
8.3. Planning
8.4. Financial data
9. Domain-driven development
9.1. Entities, value objects, aggregates, services
9.2. Thin models
10. Graphical user interfaces
10.1. GUI modeling with workflows
10.2. GUI modeling with state diagrams
At the completion of this course, the students must:
* have systematic knowledge on model-driven software processes
* know basic elements of ~SysML, BPMN, XPDL modeling languages
* know basic patterns used in the system analysis phase
* know basic patterns used in modeling the behavior of a system
* know some tools for modeling and model transformation
Detalii despre examen
* UML Deployments:
* UML State machines
* UML Activities
Enunt problema
* Construiti diagrame de tipul celor de mai sus
* Scrieti cod (conform diagramelor) intr-un limbaj de programare
Exemplu:
Proiectati si implementati un sistem client-server (joc de cuvinte) Scramble dupa cum urmeaza.
* Serverul memoreaza o lista de cuvinte, pentru fiecare cuvant memorandu-se un id - intreg, value - valoarea cuvantului, si points - intreg ce reprezinta puncte asociate cuvantului.
* La lansarea in executie a unui client, sunt oferite doua optiuni - Play sau Administer. Dupa selectarea unei optiuni, clientul permite utilizatorului sa se joace, respectiv sa gestioneze cuvintele jocului.
* Atunci cand gestioneaza cuvintele procedeaza in mod repetat astfel:
** a. Clientul afiseaza lista cuvintelor, pentru un cuvant afisand value si points.
** b. La adaugarea unui cuvant nou, utilizatorul introduce cuvantul - value si punctele asociate lui points.
** c. Utilizatorul poate abandona procesul de adaugare de cuvinte, revenind astfel la optiunile aplicatiei.*
* Atunci cand se joaca, utilizatorii procedeaza in mod repetat astfel:
** a. Clientul afiseaza scorul - score (initial zero).
** b. Clientul selecteaza aleator un cuvant din lista celor inregistrate. Apoi clientul amesteca literele cuvantului selectat si afiseaza rezultatul, invitand utilizatorul sa ghiceasca despre ce cuvant e vorba (ex. daca cuvantul ales aleator este “house”, cuvantul afisat poate fi “eshou”).
** c. Utilizatorul incearca sa ghiceasca cuvantul introducand un text. Daca a ghicit, utilizatorul castiga numarul de puncte (points) asociate cuvantului, in caz contrar scorul descreste cu 1 si utilizatorul ramane sa ghiceasca acelasi cuvant.
** d. Utilizatorul poate abandona jocul, revenind astfel la optiunile prezentate de client.
Construiti urmatoarele tipuri de diagrame pentru acest sistem:
1. Class diagrams
2. Deployment diagrams
3. Activity diagrams
4. Statemachine diagrams
Scrieti codul sursa al acestui sistem intr-un limbaj de programare la alegere (recomandari: client - aplicatie consola, server - aplicatie consola).
Type the text for 'Eclipse Extension Points and Extensions'
Type the text for 'Eclipse Modeling Framework'
* Eclipse plug-ins are mapped to ~OSGi bundles
* Eclipse plug-in demo (see the [[Hello plug-in|src/ro.ilazar.example.osgi.hello.zip]])
** Create an Eclipse plug-in project
** Run an ~OSGi framework within Eclipse
** Export the bundle as a deployable plug-in
** Run within a standalone ~OSGi server
{{{
java -jar org.eclipse.osgi.jar -console
install file:plugins/ro.ilazar.example.osgi.hello_1.0.0.201009301208.jar
}}}
* Service Component Models
* Service oriented architecture Modelling Language (SoaML)
* Business Processes OR Foundational UML
[[Example|exam.mdzip]]
!! Selected topics
* Business processes (lecture 5)
* Service oriented architecture (lecture 4)
* Service component models (lecture 3)
* Foundational UML (lecture 8)
!! Example
[img[img/ex1.jpg]]
[img[img/ex2.jpg]]
[img[img/ex3.jpg]]
[img[img/ex4.jpg]]
[img[img/ex5.jpg]]
[img[img/ex6.jpg]]
[img[img/ex7.jpg]]
* Foundational UML (fUML) Specification:
** Abstract Syntax - http://www.omg.org/spec/FUML/1.0/
* fUML Reference Implementation
** http://portal.modeldriven.org/project/foundationalUML
* MagicDraw Cameo Simulation Toolkit
** http://www.nomagic.com/products/magicdraw-addons/cameo-simulation-toolkit.html
* Introduction to Microsoft Visual Programming Language
* Yeoman Angular, https://github.com/yeoman/generator-angular
* Yeoman Generator, http://yeoman.io/generators.html#writing-your-first-generator
* Yeoman Angular Express Generators, https://github.com/gonzaloruizdevilla/generator-angularexpress
Type the text for 'Grading Details'
* The activity ends with a ''written final exam'' (grade E).
* During the semester, the students will have to prepare a theoretical report (grade R) and
* a software project that will have to illustrate the use of models for business logic and user interfaces (grade P).
The final grade is the weighted mean of the grades mentioned above. The final grade = 40%E + 20%R + 40%P.
! Software project
* use graphical notations of existing languages like UML and BPMN
* develop a domain specific language
* generate source code for platform specific software frameworks
(see [[Lab Problems]])
! Technical report
* must present the current level of knowledge and development achieved in those fields ("state of the art")
Type the text for 'Graphical Modeling Framework'
* Creating Eclipse graphical editors using ~EuGENia
** Install http://www.eclipse.org/epsilon/download/
** Read ~EuGENia GMF tutorial, http://www.eclipse.org/epsilon/doc/articles/eugenia-gmf-tutorial/
** See also the web flow [[graphical editor|webflow.emf]] metamodel
* Creating DSL using ~XText
** Install http://www.eclipse.org/Xtext/download.html
** Read 5 and 15 minutes tutorials, http://www.eclipse.org/Xtext/documentation.html
** See also the web flow [[textual editor|Flow.xtext]] grammar
* Generating code using ~XTend
** See the web flow [[code generator|FlowGenerator.xtend]]
[[OSGi Bundles and Eclipse Plugins]]
[[Eclipse Extension Points and Extensions]]
! Project list
# Modeling service-oriented components
#* Build a graphical editor similar to SCA (Service Component Architecture, Assembly Model): <br> http://docs.oasis-open.org/opencsa/sca-assembly/sca-assembly-1.1-spec.pdf
#** Select a small subset of elements (component, composite, service, reference, wire)
#* Build a DSL for creating such models
#* Generate code for existing frameworks
# Modeling UI layer using state machines
#* Build a graphical editor
#* Software frameworks:
#** Grails: http://grails.org/doc/1.0.x/, Chapter 6. The web layer
#** Spring MVC: http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html
# Modeling UI layer using business processes
#* UML activities
#* Software frameworks:
#** Grails: http://grails.org/doc/1.0.x/, Chapter 6. The web layer
#** Spring MVC: http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html
# Modeling web applications based on MVC pattern
#* UML activities
#* Software frameworks:
#** Grails: http://grails.org/doc/1.0.x/, Chapter 6. The web layer
#** Spring MVC: http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html
# Action languages for UML structured activities
#* UML structured activities
#* Software frameworks:
#** Groovy: http://groovy.codehaus.org/
# Modeling the domain layer using domain driven design patterns
#* UML structured activities
#* Software frameworks:
#** Grails: http://grails.org/doc/1.0.x/, Chapter 5 Object Relational Mappings (GORM)
#** Java Persistence API: http://java.sun.com/developer/technicalArticles/J2EE/jpa/
# Modeling web services orchestration
# Modeling workflow based applications
! Software project
* use graphical notations of existing languages like UML and BPMN
* develop a domain specific language
* generate source code for platform specific software frameworks
! Technical report
* must present the current level of knowledge and development achieved in those fields ("state of the art")
! Introduction to BDD
* See [[Behaviour-Driven Organization|http://behaviour-driven.org/Introduction ]]
! Platform specific frameworks
Software
> [[BDD in Java: easyb|http://www.easyb.org/]]
Articles:
<<<
[[Drive development with easyb|https://www6.software.ibm.com/developerworks/education/j-easyb/index.html]]
by Andrew Glover
IBM developerWorks, 2008
[[Behavior-driven development with easyb|http://www.javaworld.com/javaworld/jw-09-2008/jw-09-easyb.html]]
by Rod Coffin
~JavaWorld, 2008
<<<
! Designing a platform independent framework
Specification:
> [[Foundational UML specification (fUML)|http://www.omg.org/spec/FUML/1.0/Beta1/]]
> [[UML Testing profile|http://www.omg.org/technology/documents/formal/test_profile.htm]]
Software:
> [[fUML reference implementation|http://portal.modeldriven.org/project/foundationalUML]]
Research paper:
> [[Behaviour-Driven Development of Foundational UML Components|http://www.cs.ubbcluj.ro/~ilazar/bm/bdd_fuml.pdf]]
See http://www.cs.ubbcluj.ro/~ilazar/bm/euc.pdf
# [[Model Development Tools - Getting Started]]
# [[Model Transformations in the Context of MDA and UML]]
# [[Service Oriented Architecture]]
# [[Service Oriented Architecture Modelling Language]]
<<slideShow>> Default slide show
<<slideShow label:'Go for it!' tooltip:"Rock'n roll!" header:''>> Default slide show with a custom button and no header
<<slideShow theme:ConferenceTheme clock:0 header:'New Advances on ...' footer:'I Conference on Everything'>> Custom style with clock
<<slideShow theme:StudentTheme header:'' cycle noClicks noKeyboard>> No full screen
<<slideShow clock:-10 clockFormat:'mm:0ss' noOverlays header:''>> Countdown clock without overlays
<<slideShow showAll theme:PrintingTheme header:"First Course on Slide Show Printing">> Printing version
MissingSlide
[[First slide|SlideShowExample-1]] {{exclude{(read the SlideShowPluginDoc for more information)}}}
SlideShowExample-2
SlideShowExample-3
SlideShowExample-4
[[News]]
----
[[Objectives|Course Objectives]]
[[Contents|Course Contents]]
[[Bibliography]]
[[Grading Scheme]]
----
[[Lectures]]
[[Lab Problems]]
[[Software]]
----
!! Content
* ~OSGi with Eclipse Equinox [1, 4]
** Bundles - [[Example: Hello OSGi|src/ro.ilazar.example.osgi.hello.zip]]
** Service providers and service consumers - [[Example: Hello OSGi services|src/ro.ilazar.example.osgi.service.zip]]
** Declarative services - [[Example: Hello declarative services|src/ro.ilazar.example.osgi.declarativeservice.zip]]
* Eclipse extension points and extensions [2]
** Extension points, Extensions - [[Example: Hello declarative services|src/ro.ilazar.example.extensionpoint.zip]]
* Eclipse Modelling Framework [5]
** Emfatic - [[Example: filesystem.emf|src/filesystem.emf]]
** EMF editors - [[Example: Filesystem editor|src/ro.ilazar.example.emf.zip]]
* Graphical Modelling Framework [6, 8]
** ~EuGENia - [[Example: Filesystem graphical editor|src/ro.ilazar.example.gmf.zip]]
* xText [7]
** Domain Specific Languages - [[Example: Domain model textual editor|src/ro.ilazar.example.xtext.zip]]
** Code generation
* Eclipse Rich Client Platform (RCP) [3]
** Eclipse RCP architecture
** Commands
** Views
** Editors
!!References:
# Lars Vogel. //~OSGi with Eclipse Equinox - Tutorial//. http://www.vogella.de/articles/OSGi/article.html
# Lars Vogel. //Eclipse Extension Points and Extensions - Tutorial//. http://www.vogella.de/articles/EclipseExtensionPoint/article.html
# Lars Vogel. //Eclipse ~RCP - Tutorial//. http://www.vogella.de/articles/RichClientPlatform/article.html
# //~OSGi - The Dynamic Module System for Java//. http://www.osgi.org/
# Eclipse Modelling Framework, http://www.eclipse.org/emf
# Graphical Modelling Framework, http://www.eclipse.org/gmf
# Xtext, http://www.eclipse.org/xtext
# Eugenia, http://www.eclipse.org/gmt/epsilon
! ~Model-Driven Architecture (MDA) / UML
* MDA Guide, http://www.omg.org/cgi-bin/doc?omg/03-06-01.pdf
** Overview: pp 2-2 -- 2-3
** CIM, PIM, PSM, Code: pp. 3-1 -- 3-14
* UML Superstructure, http://www.omg.org/spec/UML/2.3/Superstructure/PDF/
* OCL Specification, http://www.omg.org/spec/OCL/2.2/PDF
* Eclipse UML2 plugin, http://www.eclipse.org/uml2/
! Model to text transformation
* OMG Specification, http://www.omg.org/spec/MOFM2T/1.0/PDF
* Eclipse Acceleo, http://www.eclipse.org/acceleo/
! Model to model transformation
* OMG Specification, http://www.omg.org/spec/QVT/1.1/Beta2
* Eclipse ATL, http://www.eclipse.org/atl/
; [[Detalii examen]]
; 12.12.2013, 19.12.2013
: Business Process Modeling Notation (BPMN)
; 28.11.2013, 05.12.2013
: UML Activities, http://www.omg.org/spec/UML/. Chapter 11, 12 Actions and Activities
: Workflow Patterns. Control Flow Patterns, http://www.workflowpatterns.com/
; 21.11.2013
: UML State machines, http://www.omg.org/spec/UML/. Chapter 15 State machines: state machine, state, initial state, final state, transition, signal event, time event
; 31.10.2013
: UML Superstructure, http://www.omg.org/spec/UML/. Chapter 10 Deplyments: node (device, execution environment), artifact, deployment, manifestation, communication path
: ~RESTful services - example [[web-server - TodoController|todos-client-server-web-rest.zip]]
: [[Project requirements]]
: See [[Lab Problems]]
; 24.10.2013
: Client-server applications
: Web applications
: Examples: [[todo: client, server, and web applications|todos-client-server-web.zip]]
; 17.10.2013
: [[Graphical editors, textual editors, and code generators]]
: Examples: simple web flow [[graphical editor|webflow.emf]], [[textual editor|Flow.xtext]], and [[code generator|FlowGenerator.xtend]]
; 10.10.2013
: [[Generating web applications using JavaScript frameworks]]
: Examples: [[angular-yeoman|angular-yeoman.zip]], [[generator-blog|generator-blog.zip]], [[js-inheritance|js-inheritance.zip]], [[blog|blog_v1.zip]]
; 03.10.2013
: [[Building web applications using JavaScript frameworks]]
: Examples: [[angular-hello-world|angular-hello-world.zip]], [[angular-seed|angular-seed.zip]]
<<toggleSideBar "Toggle Side Bar">>
<<tiddler ToggleFullScreen>>
;Models required for the written exam
: BPMN
: UML: Collaborations, Composite Structures, Deployments
: ~SoaML
: fUML
: Alf
;19.12.2012
: [[Business Process Model and Notation]]
;12.12.2012
: [[Action Language for Foundational UML (Alf)]]
;28.11.2012-05.12.2012
: [[Executable Models]]
;21.11.2012
: [[Service Oriented Architecture Modeling Language]]
;14.11.2012
: [[UML components, composite structures, and deployments]]
;07.11.2012
: [[Service Oriented Architecture]]
;31.10.2012
: ~Client-Server Applications; REST Services
: Services: [[HelloService|hw.zip]], [[HelloService Client|hw-client.zip]], [[HelloService Shared|hw-shared.zip]], [[HelloService Server|hw-server.zip]]
: [[Scramble MVC-AJAX-REST|scramble-mvc.zip]]
;17.10.2012
: Web Applications and Java Persistence Api - Spring MVC
: [[Scramble MVC|scramble-mvc.zip]]
;10.10.2012
: [[Lecture 2 - Model Transformations in the Context of MDA/UML|Model Transformations in the Context of MDA and UML]]
; 03.10.2012
: [[Lecture 1 - Model Development Tools - Getting Started|Model Development Tools - Getting Started]]
<<toggleSideBar "Toggle Side Bar">>
<<tiddler ToggleFullScreen>>
A bundle is a cohesive, self-contained unit (jar):
* contains classes and/or resources
* defines its dependencies to other modules/services
* defines its external API
Bundle MANIFEST.MF
{{{
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Hello
Bundle-SymbolicName: ro.ilazar.example.osgi.hello
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: ro.ilazar.example.osgi.hello.Activator
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
}}}
Bundle lifecycle: RESOLVED, INSTALLED, STRATING, ACTIVE,
~OSGi (Open System Gateway Initiative - http://www.osgi.org)
* ~OSGi is a specification of a service and module platform for Java at runtime.
* ~OSGi implementations:
** Apache Felix - http://felix.apache.org/, Equinox - http://eclipse.org/equinox/
** Equinox is the reference implementation of ~OSGi
** Eclipse IDE is built on top of Equinox
* [[Overview|OSGi Overview]]
* [[Bundles|OSGi Bundles]]
* [[Eclipse Plugins]]
* Modularization
** bundle as the unit of modularization
* Dynamic runtime environment
** bundle lifecycle is managed by the ~OSGi
** bundles can be installed, uninstalled, started, and stopped at runtime
* Service orientation
** a service is a POJI (Plain Old Java Interface)
** bundles can register and use services
** services are registered in a central ~OSGi service registry
A service is defined by a standard Java class or interface.
Usually a service is defined within a bundle which only contains the interface definition.
Define the service interface:
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='macro' force='true' macro='slider chkSideBarTabs SideBarTabs "index »" "Display lists of tiddlers"'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/*{{{*/
.header, .mainMenu, #sidebar, #backstageShow{
display:block !important
}
#displayArea{
font-size: 100%;
margin: 1em 15.5em 0em 1em !important;
position: relative;
}
h1,h2,h3 {margin-top:0.3em}
@media print {
#mainMenu, #sidebar, #messageArea, .tagging, .tagged, .subtitle, #pageFooter, .button, .header {display: none ! important;}
.tiddler{
page-break-after: always;
border: 2px solid blue;
margin: 1em 0 1em 0;
padding: 0.5em
}
#displayArea {margin: 1em 0em 0em 0em !important;}
}
/*}}}*/
A project containing:
* A Yeoman generator for web applications
** extending an existing generator
** creating a new generator
* A visualization tool for web applications
OR
* An xtext DSL
* A graphical editor
* A code generator
{{{
* inseamna ca am primit proiectul
Notele sunt: laborator, examen si finala
Oricare din note poate fi marita, la restante.
833, 28.01.2011
===============
1.*Dascalu Liviu-Andrei 10,9,10
2.*Ghic Remus 5,8,7
3. Groza Ionut 10,7,9
4.*Man Mihai-Andrei 10,8,9
5.*Mihaiu Cosmin-Adrian 10,9,10
6.*Nicorici Florin-George 5,7,6
7.*Tanasoiu Bogdan-Nicolae 10,9,10
8.*Trusca Andrei-Ionel 5,6,6
831, 28.01.2011
===============
1.*Ardelean Mihai-George 10,8,9
2. Beian Raluca 10,9.25,10
3.*Botean Diana-Mirela 10,9.5,10
4. Danciu Reghina-Claudia 9,8,9
5. Darkó Piroska-Ildikó 10,7.5,9
6.*Dornean Bogdan-Petrica 10,9.5,10
7.*Dumitru Stelian-Andrei 4,6,5
8.*Gentz Arnold-Zoltan 10,9.5,10
9.*Gretyinuc Ioan 8,8,8
10. Lengyel Andrei-Paul -,6.5,-
11.*Mincic Ioana-Alexandra 9,8,9
12. Motocu Mihai -,7.5,-
13.*Mucea Mihaela-Nicoleta 9,9.5,9
14. Muresan Vlad-Radu
15.*Parvu Georgian 10,10,10
16.*Patacean Dan-Vasile 10,9,10
17. Pozna Gheorghe-Bogdan 8,8,8
18. Rasinar Iulia-Georgiana
19.*Rosca Victor 4,8,6
20.*Salajan Adrian 8,9,9
21. Tanase Constantin
22. Teoc Laura-Maria
}}}
!! SCA (Service Component Architecture)
* Software:
** [[Apache Tuscany|http://tuscany.apache.org/sca-java-2x-releases.html]]
** [[STP/SCA Project|http://wiki.eclipse.org/STP/SCA_Project#Install]]
* Documentation:
** [[STP/SCA Composite Designer Tutorial|http://wiki.eclipse.org/STP/SCA_Component/SCA_First_Steps_With_Composite_Designer]]
** [[Service Component Architecture Specification|http://www.osoa.org/download/attachments/35/SCA_AssemblyModel_V100.pdf?version=1]]
!! ~SoaML
* Specification: http://www.omg.org/spec/SoaML/
** ~ServicesArchitecture, Participant, ~ServiceContract, Provider, Consumer, ~MessageType, Choreography, Service, Request
!! Examples
* ~ModelPro tutorials: http://portal.modeldriven.org/content/soamlmodelpro-tutorials
** Basic services
** Top-down services
!! UML Superstructure
** [[Ch. 8: Components|http://www.omg.org/spec/UML/2.3/Superstructure/PDF/]]
** [[Ch. 9: Composite structures|http://www.omg.org/spec/UML/2.3/Superstructure/PDF/]]
** [[Ch. 18: Profiles|http://www.omg.org/spec/UML/2.3/Superstructure/PDF/]]
!! ~SoaML
* Specification: http://www.omg.org/spec/SoaML/
!! Examples
* ~ModelPro tutorials: http://portal.modeldriven.org/content/soamlmodelpro-tutorials
** Basic services
** Top-down services
Software Systems Modelling
!Let's start!
Press F11 to go fullscreen and adjust the font sizes with Ctrl++ Ctrl+- (or Ctrl+mousewheel).
{{comment{
!Test
@@You can hide text on a slide so it won't be displayed in the slide show@@}}}
{{noClicks{
This button can be clicked without advancing the slide show: <<tag show>>}}}
Now press ''B'' to pause/restart the presentation.
!Main features
Most features that are usually found in presentation software are available.
*Build a slide show from a list of tiddlers' titles or selecting a specific tag with optional sort
*Fully customizable presentations (CSS knowledge required)
*Auto-advancing slide show (kiosk mode) and looping (circular mode)
*Incremental display (several overlays or layers in a slide)
*Optional clock with 3 different modes:
**local time
**elapsed time of presentation
**countdown clock for a given period
*Screen blanking for pauses
!Overlays
To see how incremental display works use the left and right mouse buttons.
{{overlay1{You can}}} {{overlay2{present things}}} {{overlay1{in an arbitrary order!!!}}}
{{overlay3{Its a bit harder with lists but it works:}}}
<html>
<ol>
<li class="overlay4">First item</li>
<li class="overlay5">Second item</li>
<li class="overlay4">Last item</li>
</ol>
</html>{{comment{You can hide comments on a slide that won't display in the slide show}}}
!Using the keyboard
!!Slide/overlay navigation
*Home/Up arrow - first slide/overlay
*~PageUp/Left arrow - previous slide/overlay
*~PageDown/Left arrow - next slide/overlay
*End/Down arrow - last slide/overlay
*Escape - exit slide show
/***
|''Name:''|SlideShowPlugin|
|''Description:''|Creates a slide show from any number of tiddlers|
|''Author:''|Paulo Soares|
|''Contributors:''|John P. Rouillard|
|''Version:''|2.2.5|
|''Date:''|2010-09-14|
|''Source:''|http://www.math.ist.utl.pt/~psoares/addons.html|
|''Documentation:''|[[SlideShowPlugin Documentation|SlideShowPluginDoc]]|
|''License:''|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.5.0|
***/
//{{{
if(!version.extensions.SlideShowPlugin) { //# ensure that the plugin is only installed once
version.extensions.SlideShowPlugin = {installed: true};
(function($) {
config.macros.slideShow = {maxTOCLength: 30, separator:'-s-'};
config.formatters.push( {
name: "SlideSeparator",
match: "^-s-+$\\n?",
handler: function(w) {
createTiddlyElement(w.output,"hr",null,'slideSeparator');
}
});
config.macros.slideShow.text = {
label: "slide show", tooltip: "Start slide show",
quit: {label: "x", tooltip: "Quit the slide show"},
firstSlide: {label: "<<", tooltip: "Go to first slide"},
previous: {label: "<", tooltip: "Go back"},
next: {label: ">", tooltip: "Advance"},
lastSlide: {label: ">>", tooltip: "Go to last slide"},
goto: {label: "Go to slide:"},
resetClock: {tooltip: "Reset the clock"},
overlay: "overlay"
};
config.macros.slideShow.handler = function(place,macroName,params,wikifier,paramString){
var args = paramString.parseParams(null,null,false);
this.label = getParam(args,"label",this.text.label);
this.tooltip = getParam(args,"tooltip",this.text.tooltip);
var onclick = function(){config.macros.slideShow.onClick(place,paramString); return false;};
createTiddlyButton(place,this.label,this.tooltip,onclick);
return false;
}
config.macros.slideShow.onClick = function(place,paramString) {
var slide, cm = config.macros.slideShow;
var title = story.findContainingTiddler(place);
title = title ? title.getAttribute("tiddler") : null;
var args = paramString.parseParams(null,null,false);
title = getParam(args,"tiddler",title);
var argsArray = paramString.readMacroParams();
this.single = ($.inArray('single',argsArray) > -1);
this.clicks = ($.inArray('noClicks',argsArray) < 0);
this.keyboard = ($.inArray('noKeyboard',argsArray) < 0);
this.showAll = ($.inArray('showAll',argsArray) > -1);
this.cycle = ($.inArray('cycle',argsArray) > -1);
this.overlays = ($.inArray('noOverlays',argsArray) < 0);
this.theme = getParam(args,"theme");
this.tag = getParam(args,"tag");
this.toc = getParam(args,"toc","headers");
this.sort = getParam(args,"sort");
this.clockFormat = getParam(args,"clockFormat",'0hh:0mm:0ss');
this.auto = getParam(args,"auto",0);
this.header = getParam(args,"header",title);
this.footer = getParam(args,"footer","");
this.clock = getParam(args,"clock");
this.blocked = 0;
if(this.clock){
var startTime = new Date(0);
this.clockCorrection=startTime.getTimezoneOffset()*60000;
startTime = new Date();
this.clockMultiplier = 1;
this.clockInterval = 0;
var clockType= parseFloat(this.clock);
if(clockType < 0) {
this.clockMultiplier = -1;
this.clockInterval = -clockType*60000;
} else if(clockType == 0){
this.clockCorrection = 0;
startTime = new Date(0);
}
this.clockStartTime=startTime.getTime();
}
this.slides = [];
this.openTiddlers = [];
$("#tiddlerDisplay > *").each(function(){cm.openTiddlers.push($(this).attr('tiddler'))});
var count = 0;
this.slideTOC=[];
if(this.single){
if(!store.tiddlerExists(title)) return;
var newTiddler;
var content = store.getTiddlerText(title).split(cm.separator);
$.each(content, function(){
count++;
newTiddler = new Tiddler();
newTiddler.title ="TempSlide" + count;
newTiddler.tags[0] = "excludeLists";
newTiddler.text = $.trim(this);
newTiddler.fields['doNotSave']= true;
store.addTiddler(newTiddler);
cm.buildTOC(count,newTiddler.title);
cm.slides.push(newTiddler.title);
});
} else {
if(this.tag){
var content = store.getTaggedTiddlers(this.tag,this.sort);
$.each(content, function(){
count++;
cm.buildTOC(count,this.title);
cm.slides.push(this.title);
});
} else {
story.displayTiddler(null,title);
var list = $('[tiddler='+title+']').children('.viewer').find('.tiddlyLinkExisting');
$.each(list,function(){
if(!$(this).parents().hasClass("exclude")){
slide = $(this).attr('tiddlylink');
count++;
cm.buildTOC(count,slide);
cm.slides.push(slide);
}
});
}
}
this.nSlides = this.slides.length;
if(this.nSlides==0) return false;
clearMessage();
this.toggleSlideStyles();
if(!this.showAll){
//Attach the key and mouse listeners
if(this.keyboard && !$("#tiddlerDisplay").hasClass("noKeyboard")) $(document).keyup(cm.keys);
if(this.clicks){
$(document).mouseup(cm.clicker);
document.oncontextmenu = function(){return false;}
}
if(this.clock) this.slideClock=setInterval(this.setClock, 1000);
if(this.auto>0){
this.autoAdvance=setInterval(cm.next, this.auto*1000);
}
this.showSlide(1);
} else {
story.closeAllTiddlers();
story.displayTiddlers(null,this.slides);
$(".tiddler").attr("ondblclick",null);
$(document).keyup(cm.endSlideShow);
}
return false;
}
config.macros.slideShow.buildNavigator = function() {
//Create the navigation bar
var i, slidefooter = $("#controlBar")[0];
if(!slidefooter) return;
$(slidefooter).addClass("slideFooterOff noClicks");
var navigator = createTiddlyElement(slidefooter,"SPAN","navigator");
var buttonBar = createTiddlyElement(navigator,"SPAN","buttonBar");
//Make it so that when the footer is hovered over the class will change to make it visible
$(slidefooter).bind("mouseenter mouseleave", function(e){$(this).toggleClass("slideFooterOff");});
//Create the control buttons for the navigation
createTiddlyButton(buttonBar,this.text.firstSlide.label,this.text.firstSlide.tooltip,this.firstSlide,"button");
createTiddlyButton(buttonBar,this.text.previous.label,this.text.previous.tooltip,this.previous,"button");
createTiddlyButton(buttonBar,this.text.quit.label,this.text.quit.tooltip,this.endSlideShow,"button");
createTiddlyButton(buttonBar,this.text.next.label,this.text.next.tooltip,this.next,"button");
createTiddlyButton(buttonBar,this.text.lastSlide.label,this.text.lastSlide.tooltip,this.lastSlide,"button");
if(this.clock){
if(this.clock == 0){
createTiddlyElement(navigator,"SPAN","slideClock");
} else {
createTiddlyButton(navigator," ",this.text.resetClock.tooltip,this.resetClock,"button","slideClock");
}
this.setClock();
}
var index = createTiddlyElement(slidefooter,"SPAN","slideCounter");
index.onclick = this.toggleTOC;
var toc = createTiddlyElement(slidefooter,"SPAN","toc");
var tocLine;
for(i=0; i<this.slideTOC.length; i++){
$(toc).append(this.slideTOC[i][2]);
tocLine = $(toc.lastChild);
tocLine.addClass("tocLevel"+this.slideTOC[i][1]).css("cursor", "pointer").hover(function () {
$(this).addClass("highlight");}, function () {
$(this).removeClass("highlight");});
tocLine.attr("slide",this.slideTOC[i][0]);
tocLine.click(config.macros.slideShow.showSlideFromTOC);
}
//Input box to jump to specific slide
var tocItem = createTiddlyElement(toc,"DIV","jumpItem",null,this.text.goto.label);
var tocJumpInput = createTiddlyElement(tocItem,"INPUT","jumpInput");
tocJumpInput.type="text";
$(tocJumpInput).keyup(config.macros.slideShow.jumpToSlide);
}
//Used to shorten the TOC fields
config.macros.slideShow.abbreviate = function(label){
if(label.length>this.maxTOCLength) {
var temp = new Array();
temp = label.split(' ');
label = temp[0];
for(var j=1; j<temp.length; j++){
if((label.length+temp[j].length)<=this.maxTOCLength){
label += " " + temp[j];
} else {
label += " ...";
break;
}
}
}
return label;
}
config.macros.slideShow.buildTOC = function(count,title) {
var level = 1, text;
switch(this.toc){
case "headers":
var frag = wikifyStatic(store.getTiddlerText(title));
text = frag.replace(/<div class="comment">.*<\/div>/mg,"");
var matches = text.match(/<h[123456]>.*?<\/h[123456]>/mgi);
if(matches){
for (var j=0; j<matches.length; j++){
level = matches[j].charAt(2);
text = matches[j].replace(/<\/?h[123456]>/gi,"");
text = this.abbreviate(text);
this.slideTOC.push([count,level,"<div>"+text+"</div>"]);
}
}
break;
case "titles":
text = this.abbreviate(title);
this.slideTOC.push([count,level,"<div>"+text+"</div>"]);
}
}
config.macros.slideShow.showSlideFromTOC = function(e) {
var cm = config.macros.slideShow;
var slide = parseInt(e.target.getAttribute('slide'));
$("#toc").hide();
cm.showSlide(slide);
return false;
}
config.macros.slideShow.toggleTOC = function(){
$("#toc").toggle();
$("#jumpInput").focus().val('');
return false;
}
config.macros.slideShow.isInteger = function(s){
for (var i = 0; i < s.length; i++){
// Check that current character is number
var c = s.charAt(i);
if (((c < "0") || (c > "9"))) return false;
}
// All characters are numbers
return true;
}
config.macros.slideShow.jumpToSlide = function(e){
var cm = config.macros.slideShow;
if(e.which==13){
var input= $("#jumpInput").val();
if(cm.isInteger(input) && input>0 && input<=cm.nSlides){
$("#toc").hide();
cm.showSlide(input);
} else {$("#jumpInput").val('');}
}
return false;
}
config.macros.slideShow.toggleSlideStyles = function(){
var contentWrapper = $('#contentWrapper');
if(contentWrapper.hasClass("slideShowMode")){
refreshPageTemplate();
removeStyleSheet("SlideShowStyleSheet");
if(this.theme) removeStyleSheet(this.theme);
} else {
$("#displayArea").prepend('<div id="slideBlanker" style="display:none"></div><div id="slideHeader">'+this.header+'</div><div id="slideFooter">'+this.footer+'</div><div id="controlBar"></div>');
setStylesheet(store.getRecursiveTiddlerText("SlideShowStyleSheet"),"SlideShowStyleSheet");
if(this.theme && store.tiddlerExists(this.theme)){setStylesheet(store.getRecursiveTiddlerText(this.theme),this.theme);}
this.buildNavigator();
}
contentWrapper.toggleClass("slideShowMode");
return false;
}
config.macros.slideShow.showSlide = function(n){
if(this.cycle) {
if(n>this.nSlides) {
n = 1;
} else if(n<1) {
n = this.nSlides;
}
} else {
if(n>this.nSlides || n<1) return;
}
story.closeAllTiddlers();
if(this.clock=='-'){this.resetClock();}
story.displayTiddler(null,String(this.slides[n-1]));
$(".tiddler").attr("ondblclick",null);
$("body").removeClass("slide"+this.curSlide);
this.curSlide = n;
$("body").addClass("slide"+this.curSlide);
$("#slideCounter").text(this.curSlide+"/"+this.nSlides);
if(this.overlays){
var contents = $(".viewer *");
this.numOverlays = 1;
while(1){
if(contents.hasClass(this.text.overlay+this.numOverlays)){
this.numOverlays++;
} else {break;}
}
this.numOverlays--;
this.showOverlay(0);
}
return false;
}
config.macros.slideShow.showOverlay = function(n){
var i, set, cm = config.macros.slideShow;
if(!cm.overlays || cm.numOverlays == 0 || n<0 || n>cm.numOverlays){return;}
for(i=1; i<n; i++){
set = $(".viewer "+"."+cm.text.overlay+i);
set.removeClass("currentOverlay nextOverlay");
set.addClass("previousOverlay");
}
set = $(".viewer "+"."+cm.text.overlay+n);
set.removeClass("previousOverlay nextOverlay");
set.addClass("currentOverlay");
for(i=n; i<config.macros.slideShow.numOverlays; i++){
set = $(".viewer "+"."+cm.text.overlay+(i+1));
set.removeClass("previousOverlay currentOverlay");
set.addClass("nextOverlay");
}
cm.curOverlay = n;
}
config.macros.slideShow.firstSlide = function(){
config.macros.slideShow.showSlide(1);
return false;
}
config.macros.slideShow.lastSlide = function(){
config.macros.slideShow.showSlide(config.macros.slideShow.nSlides);
return false;
}
config.macros.slideShow.next = function(){
var cm = config.macros.slideShow;
if(!cm.overlays || cm.numOverlays == 0 || cm.curOverlay == cm.numOverlays) {
cm.showSlide(cm.curSlide+1);
} else {
cm.showOverlay(cm.curOverlay+1);
}
return false;
}
config.macros.slideShow.previous = function(){
var cm = config.macros.slideShow;
if(!cm.overlays || cm.numOverlays == 0 || cm.curOverlay == 0) {
cm.showSlide(cm.curSlide-1);
cm.showOverlay(cm.numOverlays);
} else {
cm.showOverlay(cm.curOverlay-1);
}
return false;
}
config.macros.slideShow.endSlideShow=function(){
var cm = config.macros.slideShow;
if(cm.autoAdvance) {clearInterval(cm.autoAdvance);}
if(cm.clock) clearInterval(cm.slideClock);
story.closeAllTiddlers();
cm.toggleSlideStyles();
story.displayTiddlers(null,cm.openTiddlers);
$(document).unbind();
document.oncontextmenu = function(){};
$("body").removeClass("slide"+cm.curSlide);
return false;
}
// 'keys' code adapted from S5 which in turn was adapted from MozPoint (http://mozpoint.mozdev.org/)
config.macros.slideShow.keys = function(key) {
var cm = config.macros.slideShow;
switch(key.which) {
case 32: // spacebar
if(cm.auto>0 && cm.blocked==0){
if(cm.autoAdvance){
clearInterval(cm.autoAdvance);
cm.autoAdvance = null;
} else {
cm.autoAdvance=setInterval(cm.next, cm.auto*1000);
}
} else {
if(cm.blocked==0) cm.next();
}
break;
case 34: // page down
if(cm.blocked==0) cm.showSlide(cm.curSlide+1);
break;
case 39: // rightkey
if(cm.blocked==0) cm.next();
break;
case 40: // downkey
if(cm.blocked==0) cm.showOverlay(cm.numOverlays);
break;
case 33: // page up
if(cm.blocked==0) cm.showSlide(cm.curSlide-1);
break;
case 37: // leftkey
if(cm.blocked==0) cm.previous();
break;
case 38: // upkey
if(cm.blocked==0) cm.showOverlay(0);
break;
case 36: // home
if(cm.blocked==0) cm.firstSlide();
break;
case 35: // end
if(cm.blocked==0) cm.lastSlide();
break;
case 27: // escape
cm.endSlideShow();
break;
case 66: // B
$("#slideBlanker").toggle();
cm.blocked = (cm.blocked +1)%2;
break;
}
return false;
}
config.macros.slideShow.clicker = function(e) {
var cm = config.macros.slideShow;
if(cm.blocked==1 || $(e.target).attr('href') || $(e.target).parents().andSelf().hasClass('noClicks')){
return true;
}
if($("#toc").is(':visible')){
cm.toggleTOC();
} else {
if((!e.which && e.button == 1) || e.which == 1) {
cm.next();
}
if((!e.which && e.button == 2) || e.which == 3) {
cm.previous();
}
}
return false;
}
config.macros.slideShow.setClock = function(){
var cm = config.macros.slideShow;
var actualTime = new Date();
var newTime = actualTime.getTime() - cm.clockStartTime;
newTime = cm.clockMultiplier*newTime+cm.clockInterval+cm.clockCorrection;
actualTime.setTime(newTime);
newTime = actualTime.formatString(cm.clockFormat);
$("#slideClock").text(newTime);
return false;
}
config.macros.slideShow.resetClock = function(){
var cm = config.macros.slideShow;
if(cm.clock == 0) return;
var time = new Date(0);
if(cm.clockStartTime>time){
var startTime = new Date();
cm.clockStartTime=startTime.getTime();
}
return false;
}
config.shadowTiddlers.SlideShowStyleSheet="/*{{{*/\n.header, #mainMenu, #sidebar, #backstageButton, #backstageArea, .toolbar, .title, .subtitle, .tagging, .tagged, .tagClear, .comment{\n display:none !important\n}\n\n#slideBlanker{\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 90; \n background-color: #000;\n opacity: 0.9;\n filter: alpha(opacity=90)\n}\n\n.nextOverlay{\n visibility: hidden\n}\n\n.previousOverlay,.currentOverlay{\n visibility: visible\n}\n\n#displayArea{\n font-size: 250%;\n margin: 0 !important;\n padding: 0\n}\n\n#controlBar{\n position: fixed;\n bottom: 2px;\n right: 2px;\n width: 100%;\n text-align: right\n}\n\n#controlBar .button{\n margin: 0 0.25em;\n padding: 0 0.25em\n}\n\n#slideHeader{\n font-size: 200%;\n font-weight: bold\n}\n\n#slideFooter{\n position: fixed;\n bottom: 2px\n}\n\n.slideFooterOff #navigator{\n visibility: hidden\n}\n\n#slideClock{\n margin: 0 5px 0 5px\n}\n\n#slideCounter{\n cursor: pointer;\n color: #aaa\n}\n\n#toc{\n display: none;\n position: absolute;\n font-size: .75em;\n bottom: 2em;\n right: 0;\n background: #fff;\n border: 1px solid #000;\n text-align: left\n}\n\n#jumpItem{\n padding-left:0.25em\n}\n\n#jumpInput{\n margin-left: 0.25em;\n width: 3em\n}\n\n.tocLevel1{\n font-size: .8em\n}\n\n.tocLevel2{\n margin-left: 1em;\n font-size: .75em\n}\n\n.tocLevel3{\n margin-left: 2em;\n font-size: .7em\n}\n\n.tocLevel4{\n margin-left: 3em;\n font-size: .65em\n}\n\n.tocLevel5{\n margin-left: 4em;\n font-size: .6em\n}\n\n.tocLevel6{\n margin-left: 5em;\n font-size: .55em\n}\n/*}}}*/";
config.shadowTiddlers.SlideShowPluginDoc="The documentation is available [[here|http://www.math.ist.utl.pt/~psoares/addons.html#SlideShowPluginDoc]].";
})(jQuery)
}
//}}}
/*{{{*/
.header, #mainMenu, #sidebar, #backstageButton, #backstageArea, .toolbar, .subtitle, .tagging, .tagged, .tagClear, .comment{
display:none !important
}
#slideBlanker{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 90;
background-color: #000;
opacity: 0.9;
filter: alpha(opacity=90)
}
.nextOverlay{
visibility: hidden
}
.previousOverlay,.currentOverlay{
visibility: visible
}
#displayArea{
font-size: 250%;
margin: 0 !important;
padding: 0
}
#controlBar{
position: fixed;
bottom: 2px;
right: 2px;
width: 100%;
text-align: right
}
#controlBar .button{
margin: 0 0.25em;
padding: 0 0.25em
}
#slideHeader{
font-size: 200%;
font-weight: bold
}
#slideFooter{
position: fixed;
bottom: 2px
}
.slideFooterOff #navigator{
visibility: hidden
}
#slideClock{
margin: 0 5px 0 5px
}
#slideCounter{
cursor: pointer;
color: #aaa
}
#toc{
display: none;
position: absolute;
font-size: .75em;
bottom: 2em;
right: 0;
background: #fff;
border: 1px solid #000;
text-align: left
}
#jumpItem{
padding-left:0.25em
}
#jumpInput{
margin-left: 0.25em;
width: 3em
}
.tocLevel1{
font-size: .8em
}
.tocLevel2{
margin-left: 1em;
font-size: .75em
}
.tocLevel3{
margin-left: 2em;
font-size: .7em
}
.tocLevel4{
margin-left: 3em;
font-size: .65em
}
.tocLevel5{
margin-left: 4em;
font-size: .6em
}
.tocLevel6{
margin-left: 5em;
font-size: .55em
}
/*}}}*/
Eclipse Modelling Tools:
* Helios (3.6)
** EuGENia - does not work
* Galileo (3.5.2)
** EuGENia, http://download.eclipse.org/modeling/gmt/epsilon/updates/
** EMFatic, http://www.scharf.gr/eclipse/emfatic/update/
/*{{{*/
.header, .mainMenu, #sidebar, #backstageShow, .title{
display:block !important
}
#displayArea{
font-size: 100%;
margin: 1em 15.5em 0em 1em !important;
position: relative;
}
.tiddler{
padding-bottom: 2em
}
#controlBar{
position: absolute;
top: 2px;
right: 2px;
bottom: auto
}
#slideFooter{
position: absolute;
}
#toc{
font-size: 1em;
bottom: auto;
top: 2em;
right: 0;
}
#slideCounter{
background: #eee;
padding: 0.2em
}
/* navigator always visible*/
.slideFooterOff #navigator{
visibility: visible;
}
/*}}}*/
/*{{{*/
.externalLink {text-decoration:none;}
#sidebarTabs .button {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
.headerShadow {padding-top:1em;}
.headerForeground {padding-top:1em;}
.textBox {background:[[ColorPalette::TertiaryPale]]; border: 1px solid [[ColorPalette::TertiaryLight]];}
.viewer table.borderless, .viewer table.borderless * {border: 0;}
/*}}}*/
/***
|''Name:''|TaggerCommand|
|''Description:''|Alternative mechanism for tags management.|
|''Author:''|Paulo Soares|
|''Source:''|http://www.math.ist.utl.pt/~psoares/addons.html|
|''Version:''|1.0|
|''Date:''|August 3, 2010|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/ ]]|
|''~CoreVersion:''|2.5|
***/
//{{{
(function($) {
config.commands.tagger = {
text: 'tags',
tooltip: 'Manage tags',
excludeTags: '',
addTag: 'add tag ',
removeTag: 'remove tag ',
newTag: 'new tag',
newTagPrompt: 'New tag:'
};
config.commands.tagger.handler = function(e,src,title) {
var tagTiddler, target = story.findContainingTiddler(resolveTarget(e));
var ct = config.commands.tagger;
var exclude = ct.excludeTags.readBracketedList();
var tiddler = store.getTiddler(title);
var createButtons=function(theTag,tooltipPrefix,theClass){
var sp = createTiddlyElement(createTiddlyElement(popup,"li"),"span",null,"tagger");
var theToggle = createTiddlyButton(sp,theTag,tooltipPrefix+" '"+theTag+"'",ct.toggle,"button "+theClass);
$(theToggle).addClass(theClass);
theToggle.setAttribute("tiddler",title);
theToggle.setAttribute("tag",theTag);
insertSpacer(sp);
}
var popup = Popup.create($(".command_tagger",target)[0]);
var tagsarray = store.getTags();
var tag;
for (var i=0; i<tagsarray.length; i++){
tag = tagsarray[i][0]
tagTiddler = store.getTiddler(tag);
if (!(tagTiddler && tagTiddler.isTagged('excludeLists'))){
if(tiddler.isTagged(tag)){
createButtons(tag,ct.removeTag,"usedTag");
} else if(!exclude.contains(tag)){
createButtons(tag,ct.addTag,"unusedTag");
}
}
}
createTiddlyElement(createTiddlyElement(popup,"li"),"hr");
var newTagButton = createTiddlyButton(createTiddlyElement(popup,"li"),(ct.newTag),null,ct.toggle);
newTagButton.setAttribute("tiddler",title);
Popup.show();
e.stopPropagation();
};
config.commands.tagger.toggle = function(e) {
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
var tiddler = store.getTiddler(title);
if(!tag){
var newtag=prompt(config.commands.tagger.newTagPrompt,"");
if(newtag!=''&&newtag!=null)
{var tag=newtag;}
else
{return false;};
}
if(!tiddler || !tiddler.tags)
{store.saveTiddler(title,title,'',config.options.txtUserName,new Date(),tag);}
else
{if(!tiddler.isTagged(tag))
{tiddler.tags.push(tag)}
else if(!newtag){
var newtags = [];
for(var i=0; i<tiddler.tags.length; i++){
if(tiddler.tags[i]!=tag) newtags.push(tiddler.tags[i]);
}
tiddler.tags = newtags;
};
store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags);
};
story.refreshTiddler(title,null,true);
if(config.options.chkAutoSave)
saveChanges();
return false;
};
})(jQuery);
//font-weight: bold;
setStylesheet(
".tagger a.button {display:inline; padding:0 2px 0 2px;}\n"+
".tagger .usedTag {font-weight: bold;}\n"+
".tagger .unusedTag {color: #777;}\n"+
"",
"TaggerStyles");
//}}}
/%
!info
|Name|ToggleFullScreen|
|Source|http://www.TiddlyTools.com/#ToggleFullScreen|
|Version|2.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|Create a link that shows/hides sidebars and page headers|
Usage
<<<
{{{
<<tiddler ToggleFullScreen>>
<<tiddler ToggleFullScreen with: label altlabel>>
}}}
embeds a command link into content, where:
*''label'' (optional, default={{{fullscreen}}})<br>command text
*''altlabel'' (optional, default={{{restore}}})<br>alternative command text shown when full screen is enabled
You can also enable/disable full screen immediately (without clicking a command link) by embedding the one of the following directly in your content:
{{{
<<tiddler ToggleFullScreen##ON>>
<<tiddler ToggleFullScreen##OFF>>
}}}
<<<
Example
<<<
{{{<<tiddler ToggleFullScreen with: fullscreen restore>>}}}
<<tiddler ToggleFullScreen##show with: fullscreen restore>>
<<<
Revisions
<<<
2011.05.13 2.1.0 refactored code and restored "##ON" and "#OFF" usage
2010.xx.xx 2.0.1 converted to transclusion
2008.10.13 1.1.3 re-written to support bookmarklet usage
2008.01.20 1.0.0 created (inline script)
<<<
!end
!code
<<tiddler {{
window.setFullScreen = function(fs) {
var co=config.options; var cm=config.macros;
cm.option.propagateOption('chkFullScreen','checked',fs,'input');
var showmm=!fs && co.chkShowLeftSidebar!==false;
var showsb=!fs && co.chkShowRightSidebar!==false;
var showcrumbs=!fs && co.chkShowBreadcrumbs!==false
&& cm.breadcrumbs && cm.breadcrumbs.crumbs.length;
var showstorymenu=!fs;
var da=document.getElementById('displayArea');
var cw=document.getElementById('contentWrapper');
var mm=document.getElementById('mainMenu');
var sb=document.getElementById('sidebar');
var sm=document.getElementById('storyMenu');
var bc=document.getElementById('breadCrumbs');
if (cw){ // toggle page header
var elems=cw.getElementsByTagName('*');
for (var i=0; i<elems.length; i++) if (hasClass(elems[i],'header'))
{ elems[i].style.display=fs?'none':'block'; break; }
}
if (mm) { // toggle MainMenu
mm.style.display=showmm?'block':'none';
da.style.marginLeft=showmm?(co.txtDisplayAreaLeftMargin||''):'1em';
}
if (sb) { // toggle sidebar
sb.style.display=showsb?'block':'none';
da.style.marginRight=showsb?(co.txtDisplayAreaRightMargin||''):'1em';
}
if (sm) sm.style.display=showstorymenu?'block':'none'; // toggle StoryMenu
if (bc) bc.style.display=showcrumbs?'block':'none'; // toggle BreadCrumbsPlugin
var b=document.getElementById('restoreFromFullscreenButton'); if (b) removeNode(b);
if (fs) {
setStylesheet(store.getTiddlerText('ToggleFullScreen##styles'),'fullScreenStyles');
var b=createTiddlyElement(null,'span','restoreFromFullscreenButton','selected');
b.innerHTML='◊';
b.title='RESTORE: redisplay page header, menu and sidebar';
b.onclick=function(ev){return window.setFullScreen(false);};
document.body.insertBefore(b,null);
}
return false;
};
'';}}>>
!end
!styles
#restoreFromFullscreenButton {
position:fixed; top:.3em; right:.3em; z-index:10001;
cursor:pointer; font-size:8pt; color:ButtonText !important;
border:2px outset ButtonFace; padding:0px 3px;
background-color:ButtonFace; -moz-appearance:button;
}
!end
!ON
<<tiddler ToggleFullScreen##code>><<tiddler {{window.setFullScreen(true);'';}}>>
!end
!OFF
<<tiddler ToggleFullScreen##code>><<tiddler {{window.setFullScreen(false);'';}}>>
!end
!show
<<tiddler ToggleFullScreen##code>><html><nowiki>
<a href='javascript:;' title="FULLSCREEN: toggle sidebars and page header"
onmouseover="
this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
+encodeURIComponent(encodeURIComponent(this.onclick))
+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
onclick="
window.setFullScreen(!config.options.chkFullScreen); // toggle setting
this.innerHTML=!config.options.chkFullScreen?'$1':'$2'; // set command text
return false;
">$1</a></html>
!end
%/<<tiddler {{var src='ToggleFullScreen'; src+(tiddler&&tiddler.title==src?'##info':'##show');}}
with: {{'$'+'1'!='$1'?'$1':'fullscreen'}}
{{'$'+'2'!='$2'?'$2':'restore'}}>>
/***
|Name|ToggleSideBarMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#ToggleSideBarMacro|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Provides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.
!Demo
<<toggleSideBar "Toggle Sidebar">>
!Usage:
{{{<<toggleSideBar>>}}} <<toggleSideBar>>
additional options:
{{{<<toggleSideBar label tooltip show/hide>>}}} where:
label = custom label for the button,
tooltip = custom tooltip for the button,
show/hide = use one or the other, determines whether the sidebar is shown at first or not.
(default is to show the sidebar)
You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideSideBarButton {float:right;} }}}
!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour.
*20-07-06: version 0.11
*27-04-06: version 0.1: working.
!Code
***/
//{{{
config.macros.toggleSideBar={};
config.macros.toggleSideBar.settings={
styleHide : "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 1em;}\n"+"",
styleShow : " ",
arrow1: "<",
arrow2: ">"
};
config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
var tooltip= params[1]||'toggle sidebar';
var mode = (params[2] && params[2]=="hide")? "hide":"show";
var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;
var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
if (mode == "hide")
{
(document.getElementById("sidebar")).setAttribute("toggle","hide");
setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
}
};
config.macros.toggleSideBar.onToggleSideBar = function(){
var sidebar = document.getElementById("sidebar");
var settings = config.macros.toggleSideBar.settings;
if (sidebar.getAttribute("toggle")=='hide')
{
setStylesheet(settings.styleShow,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","show");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
}
else
{
setStylesheet(settings.styleHide,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","hide");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
}
return false;
}
setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 20px;}\n","ToggleSideBarButtonStyles");
//}}}
UML Superstructure, http://www.omg.org/spec/UML/
* Chapter 8: component, connector
* Chapter 9: property/part, port, interface realization/usage, collaboration, collaboration use
* Chapter 10: node (device, execution environment), artifact, deployment, manifestation, communication path
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Type the text for 'Xpand'
Type the text for 'Xtext'
; 29.01.2011
: [[Rezultate exam|Rezultate]]
; 14.01.2011
: [[Exam details]]
; 17.12.2010, 07.01.2011
: [[Lecture 12,13 - Executable Use Cases]]
; 03,10.12.2010
: [[Lecture 10,11 - Behaviour-Driven Development]]
; 26.11.2010
: [[Lecture 9 - Action Language for Foundational UML (Alf)|Action Language for Foundational UML (Alf)]]
; 19.11.2010
: [[Lecture 8 - Executable Models|Executable Models]]
; 12.11.2010
: [[Lecture 7 - Capturing Requirements with Business Motivation Model|Capturing Requirements with Business Motivation Model]]
; 05.11.2010
: [[Lecture 6 - Modelling UI using BPMN and State Machines]]
; 29.10.2010
: [[Lecture 5 - Business Process Model and Notation]]
; 22.10.2010
: [[Lecture 4 - Service Oriented Architecture Modelling Language|Service Oriented Architecture Modelling Language]]
;15.10.2010
: [[Lecture 3 - Service Oriented Architecture|Service Oriented Architecture]]
;08.10.2010
: [[Lecture 2 - Model Transformations in the Context of MDA/UML|Model Transformations in the Context of MDA and UML]]
; 01.10.2010
: [[Lecture 1 - Model Development Tools - Getting Started|Model Development Tools - Getting Started]]
<<toggleSideBar "Toggle Side Bar">>
<<slideShow label:'Slide show'>>
<<slideShow label:'Print version' showAll theme:PrintingTheme>>
----
# [[Introduction to Eclipse Runtime Infrastructure]]
#* [[OSGi Bundles and Eclipse Plugins]]
#** ~OSGi: [[Overview|OSGi Overview]], [[Bundles|OSGi Bundles]], [[Eclipse Plugins]]
#** Service: [[Definition|OSGi Service Definition]], [[Provider|OSGi Service Provider]], [[Consumer|OSGi Service Consumer]]
#** Declarative Services: [[Definition|DS Definition]], [[Provider|DS Provider]], [[Consumer|DS Consumer]]
#* [[Eclipse Extension Points and Extensions]]
# [[Eclipse Modeling Framework]]
# [[Xtext]]
# [[Graphical Modeling Framework]]